diff --git a/shepherd/blueprints/staticroutes/__init__.py b/shepherd/blueprints/staticroutes/__init__.py index e9b71eb..404f28e 100644 --- a/shepherd/blueprints/staticroutes/__init__.py +++ b/shepherd/blueprints/staticroutes/__init__.py @@ -8,15 +8,18 @@ docs_path = path.join(__dirname, "docs") editor_path = path.join(__dirname, "editor") - @blueprint.route("docs/") def send_doc_index(): return send_file(path.join(docs_path, "index.html")) - -@blueprint.route("docs/") -def send_doc_file(filename): - return send_from_directory(docs_path, filename) +@blueprint.route("docs/") +def send_doc_file(name): + p = path.join(docs_path, name) + + if path.isfile(p): + return send_file(p) + else: + return send_file(path.join(p, "index.html")) @blueprint.route("images/") def send_image_for_docs(filename): diff --git a/shepherd/blueprints/staticroutes/docs/.DS_Store b/shepherd/blueprints/staticroutes/docs/.DS_Store new file mode 100644 index 0000000..0958fd4 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/.DS_Store differ diff --git a/shepherd/blueprints/staticroutes/docs/2019-10-17 Chicken and egg game rules.pdf b/shepherd/blueprints/staticroutes/docs/2019-10-17 Chicken and egg game rules.pdf deleted file mode 100644 index 3b3e8b6..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/2019-10-17 Chicken and egg game rules.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/404.html b/shepherd/blueprints/staticroutes/docs/404.html index c62eec9..83b9b7e 100644 --- a/shepherd/blueprints/staticroutes/docs/404.html +++ b/shepherd/blueprints/staticroutes/docs/404.html @@ -1,17 +1,52 @@ - - - - - - Robocon - - - - - - - -

404

Looks like we've got some broken links.
Take me home.
- - - + 404 - Page Not Found | RoboCon Docs + + Skip to content

404 - Page Not Found

We can’t find that page - it may be a broken link, or a misspelling in the URL. If you’ve found a broken link, please let us know and we’ll fix it!

+

In the meantime, why not try searching for the page using our search bar at the top or return to the docs home?

+ +

3 Robots Collision

\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/GettingToRoboCon.pdf b/shepherd/blueprints/staticroutes/docs/GettingToRoboCon.pdf deleted file mode 100644 index 17ee334..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/GettingToRoboCon.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/HowToAssembleYourMiniBot.pdf b/shepherd/blueprints/staticroutes/docs/HowToAssembleYourMiniBot.pdf deleted file mode 100644 index a14d0ea..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/HowToAssembleYourMiniBot.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/RoboCon2019RulebookRev10.pdf b/shepherd/blueprints/staticroutes/docs/RoboCon2019RulebookRev10.pdf deleted file mode 100644 index 132da83..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/RoboCon2019RulebookRev10.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/Robocon_logo_blackandwhite.BTX7Wlek_ZPu64F.webp b/shepherd/blueprints/staticroutes/docs/_astro/Robocon_logo_blackandwhite.BTX7Wlek_ZPu64F.webp new file mode 100644 index 0000000..245f4d3 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/Robocon_logo_blackandwhite.BTX7Wlek_ZPu64F.webp differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/Tabs.astro_astro_type_script_index_0_lang.3nBd5krW.js b/shepherd/blueprints/staticroutes/docs/_astro/Tabs.astro_astro_type_script_index_0_lang.3nBd5krW.js new file mode 100644 index 0000000..646075f --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/Tabs.astro_astro_type_script_index_0_lang.3nBd5krW.js @@ -0,0 +1 @@ +class r extends HTMLElement{static#e=new Map;#t;#n="starlight-synced-tabs__";constructor(){super();const t=this.querySelector('[role="tablist"]');if(this.tabs=[...t.querySelectorAll('[role="tab"]')],this.panels=[...this.querySelectorAll(':scope > [role="tabpanel"]')],this.#t=this.dataset.syncKey,this.#t){const i=r.#e.get(this.#t)??[];i.push(this),r.#e.set(this.#t,i)}this.tabs.forEach((i,c)=>{i.addEventListener("click",e=>{e.preventDefault();const n=t.querySelector('[aria-selected="true"]');e.currentTarget!==n&&this.switchTab(e.currentTarget,c)}),i.addEventListener("keydown",e=>{const n=this.tabs.indexOf(e.currentTarget),s=e.key==="ArrowLeft"?n-1:e.key==="ArrowRight"?n+1:e.key==="Home"?0:e.key==="End"?this.tabs.length-1:null;s!==null&&this.tabs[s]&&(e.preventDefault(),this.switchTab(this.tabs[s],s))})})}switchTab(t,i,c=!0){if(!t)return;const e=c?this.getBoundingClientRect().top:0;this.tabs.forEach(s=>{s.setAttribute("aria-selected","false"),s.setAttribute("tabindex","-1")}),this.panels.forEach(s=>{s.hidden=!0});const n=this.panels[i];n&&(n.hidden=!1),t.removeAttribute("tabindex"),t.setAttribute("aria-selected","true"),c&&(t.focus(),r.#r(this,t),window.scrollTo({top:window.scrollY+(this.getBoundingClientRect().top-e)}))}#i(t){!this.#t||typeof localStorage>"u"||localStorage.setItem(this.#n+this.#t,t)}static#r(t,i){const c=t.#t,e=r.#s(i);if(!c||!e)return;const n=r.#e.get(c);if(n){for(const s of n){if(s===t)continue;const a=s.tabs.findIndex(o=>r.#s(o)===e);a!==-1&&s.switchTab(s.tabs[a],a,!1)}t.#i(e)}}static#s(t){return t.textContent?.trim()}}customElements.define("starlight-tabs",r); diff --git a/shepherd/blueprints/staticroutes/docs/_astro/ec.8zarh.js b/shepherd/blueprints/staticroutes/docs/_astro/ec.8zarh.js new file mode 100644 index 0000000..bf1115d --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/ec.8zarh.js @@ -0,0 +1,3 @@ +try{(()=>{function a(e){if(!e)return;let t=e.getAttribute("tabindex")!==null,n=e.scrollWidth>e.clientWidth;n&&!t?e.setAttribute("tabindex","0"):!n&&t&&e.removeAttribute("tabindex")}var u=window.requestIdleCallback||(e=>setTimeout(e,1)),i=window.cancelIdleCallback||clearTimeout;function l(e){let t=new Set,n,r;return new ResizeObserver(c=>{c.forEach(o=>t.add(o.target)),n&&clearTimeout(n),r&&i(r),n=setTimeout(()=>{r&&i(r),r=u(()=>{t.forEach(o=>e(o)),t.clear()})},250)})}function d(e,t){e.querySelectorAll?.(".expressive-code pre > code").forEach(n=>{let r=n.parentElement;r&&t.observe(r)})}var s=l(a);d(document,s);var b=new MutationObserver(e=>e.forEach(t=>t.addedNodes.forEach(n=>{d(n,s)})));b.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{d(document,s)});})();}catch(e){console.error("[EC] tabindex-js-module failed:",e)} +try{(()=>{function i(o){let e=document.createElement("pre");Object.assign(e.style,{opacity:"0",pointerEvents:"none",position:"absolute",overflow:"hidden",left:"0",top:"0",width:"20px",height:"20px",webkitUserSelect:"auto",userSelect:"all"}),e.ariaHidden="true",e.textContent=o,document.body.appendChild(e);let a=document.createRange();a.selectNode(e);let n=getSelection();if(!n)return!1;n.removeAllRanges(),n.addRange(a);let r=!1;try{r=document.execCommand("copy")}finally{n.removeAllRanges(),document.body.removeChild(e)}return r}async function l(o){let e=o.currentTarget,a=e.dataset,n=!1,r=a.code.replace(/\u007f/g,` +`);try{await navigator.clipboard.writeText(r),n=!0}catch{n=i(r)}if(!n||e.parentNode?.querySelector(".feedback"))return;let t=document.createElement("div");t.classList.add("feedback"),t.append(a.copied),e.before(t),t.offsetWidth,requestAnimationFrame(()=>t?.classList.add("show"));let c=()=>!t||t.classList.remove("show"),d=()=>{!t||parseFloat(getComputedStyle(t).opacity)>0||(t.remove(),t=void 0)};setTimeout(c,1500),setTimeout(d,2500),e.addEventListener("blur",c),t.addEventListener("transitioncancel",d),t.addEventListener("transitionend",d)}function s(o){o.querySelectorAll?.(".expressive-code .copy button").forEach(e=>e.addEventListener("click",l))}s(document);var u=new MutationObserver(o=>o.forEach(e=>e.addedNodes.forEach(a=>{s(a)})));u.observe(document.body,{childList:!0,subtree:!0});document.addEventListener("astro:page-load",()=>{s(document)});})();}catch(e){console.error("[EC] copy-js-module failed:",e)} \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/_astro/ec.j8ofn.css b/shepherd/blueprints/staticroutes/docs/_astro/ec.j8ofn.css new file mode 100644 index 0000000..62e6fed --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/ec.j8ofn.css @@ -0,0 +1 @@ +.expressive-code{font-family:var(--ec-uiFontFml);font-size:var(--ec-uiFontSize);font-weight:var(--ec-uiFontWg);line-height:var(--ec-uiLineHt);text-size-adjust:none;-webkit-text-size-adjust:none}.expressive-code *:not(path){all:revert;box-sizing:border-box}.expressive-code pre{display:flex;margin:0;padding:0;border:var(--ec-brdWd) solid var(--ec-brdCol);border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));background:var(--ec-codeBg)}.expressive-code pre:focus-visible{outline:3px solid var(--ec-focusBrd);outline-offset:-3px}.expressive-code pre > code{all:unset;display:block;flex:1 0 100%;padding:var(--ec-codePadBlk) 0;color:var(--ec-codeFg);font-family:var(--ec-codeFontFml);font-size:var(--ec-codeFontSize);font-weight:var(--ec-codeFontWg);line-height:var(--ec-codeLineHt)}.expressive-code pre{overflow-x:auto}.expressive-code pre.wrap .ec-line .code{white-space:pre-wrap;overflow-wrap:break-word;min-width:min(20ch, var(--ecMaxLine, 20ch))}.expressive-code pre.wrap .ec-line .code span.indent{white-space:pre}.expressive-code pre::-webkit-scrollbar,.expressive-code pre::-webkit-scrollbar-track{background-color:inherit;border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));border-top-left-radius:0;border-top-right-radius:0}.expressive-code pre::-webkit-scrollbar-thumb{background-color:var(--ec-sbThumbCol);border:4px solid transparent;background-clip:content-box;border-radius:10px}.expressive-code pre::-webkit-scrollbar-thumb:hover{background-color:var(--ec-sbThumbHoverCol)}.expressive-code .ec-line{direction:ltr;unicode-bidi:isolate;display:grid;grid-template-areas:'gutter code';grid-template-columns:auto 1fr;position:relative}.expressive-code .ec-line .gutter{grid-area:gutter;color:var(--ec-gtrFg)}.expressive-code .ec-line .gutter > *{pointer-events:none;user-select:none;-webkit-user-select:none}.expressive-code .ec-line .gutter ~ .code{--ecLineBrdCol:var(--ec-gtrBrdCol)}.expressive-code .ec-line.highlight .gutter{color:var(--ec-gtrHlFg)}.expressive-code .ec-line .code{grid-area:code;position:relative;box-sizing:content-box;padding-inline-start:calc(var(--ecIndent, 0ch) + var(--ec-codePadInl) - var(--ecGtrBrdWd));padding-inline-end:var(--ec-codePadInl);text-indent:calc(var(--ecIndent, 0ch) * -1)}.expressive-code .ec-line .code::before,.expressive-code .ec-line .code::after,.expressive-code .ec-line .code :where(*){text-indent:0}.expressive-code .ec-line .code{--ecGtrBrdWd:var(--ec-gtrBrdWd);border-inline-start:var(--ecGtrBrdWd) solid var(--ecLineBrdCol, transparent)}.expressive-code :nth-child(1 of .ec-line) .code{padding-inline-end:calc(2rem + var(--ec-codePadInl))}.expressive-code .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0}.expressive-code .ec-line.mark{--tmLineBgCol:var(--ec-tm-markBg)}.expressive-code .ec-line.mark .code{--ecLineBrdCol:var(--ec-tm-markBrdCol)}.expressive-code .ec-line.ins{--tmLineBgCol:var(--ec-tm-insBg);--tmLabel:var(--ec-tm-insDiffIndContent)}.expressive-code .ec-line.ins .code{--ecLineBrdCol:var(--ec-tm-insBrdCol)}.expressive-code .ec-line.ins .code::before{color:var(--ec-tm-insDiffIndCol)}.expressive-code .ec-line.del{--tmLineBgCol:var(--ec-tm-delBg);--tmLabel:var(--ec-tm-delDiffIndContent)}.expressive-code .ec-line.del .code{--ecLineBrdCol:var(--ec-tm-delBrdCol)}.expressive-code .ec-line.del .code::before{color:var(--ec-tm-delDiffIndCol)}.expressive-code .ec-line.mark,.expressive-code .ec-line.ins,.expressive-code .ec-line.del{background:var(--tmLineBgCol)}.expressive-code .ec-line.mark .code,.expressive-code .ec-line.ins .code,.expressive-code .ec-line.del .code{--ecGtrBrdWd:var(--ec-tm-lineMarkerAccentWd)}.expressive-code .ec-line.mark .code::before,.expressive-code .ec-line.ins .code::before,.expressive-code .ec-line.del .code::before{display:block;position:absolute;left:0;box-sizing:border-box;content:var(--tmLabel, ' ');padding-inline-start:var(--ec-tm-lineDiffIndMargLeft);text-align:center;white-space:pre}.expressive-code .ec-line.mark.tm-label .code::before,.expressive-code .ec-line.ins.tm-label .code::before,.expressive-code .ec-line.del.tm-label .code::before{background:var(--ecLineBrdCol);padding:0 calc(var(--ec-tm-lineMarkerLabelPadInl) + var(--ec-tm-lineMarkerAccentWd)) 0 var(--ec-tm-lineMarkerLabelPadInl);color:var(--ec-tm-lineMarkerLabelCol)}.expressive-code .ec-line mark{--tmInlineBgCol:var(--ec-tm-markBg);--tmInlineBrdCol:var(--ec-tm-markBrdCol)}.expressive-code .ec-line ins{--tmInlineBgCol:var(--ec-tm-insBg);--tmInlineBrdCol:var(--ec-tm-insBrdCol)}.expressive-code .ec-line del{--tmInlineBgCol:var(--ec-tm-delBg);--tmInlineBrdCol:var(--ec-tm-delBrdCol)}.expressive-code .ec-line mark,.expressive-code .ec-line ins,.expressive-code .ec-line del{all:unset;display:inline-block;position:relative;--tmBrdL:var(--ec-tm-inlMarkerBrdWd);--tmBrdR:var(--ec-tm-inlMarkerBrdWd);--tmRadL:var(--ec-tm-inlMarkerBrdRad);--tmRadR:var(--ec-tm-inlMarkerBrdRad);margin-inline:0.025rem;padding-inline:var(--ec-tm-inlMarkerPad);border-radius:var(--tmRadL) var(--tmRadR) var(--tmRadR) var(--tmRadL);background:var(--tmInlineBgCol);background-clip:padding-box}.expressive-code .ec-line mark.open-start,.expressive-code .ec-line ins.open-start,.expressive-code .ec-line del.open-start{margin-inline-start:0;padding-inline-start:0;--tmBrdL:0px;--tmRadL:0}.expressive-code .ec-line mark.open-end,.expressive-code .ec-line ins.open-end,.expressive-code .ec-line del.open-end{margin-inline-end:0;padding-inline-end:0;--tmBrdR:0px;--tmRadR:0}.expressive-code .ec-line mark::before,.expressive-code .ec-line ins::before,.expressive-code .ec-line del::before{content:'';position:absolute;pointer-events:none;display:inline-block;inset:0;border-radius:var(--tmRadL) var(--tmRadR) var(--tmRadR) var(--tmRadL);border:var(--ec-tm-inlMarkerBrdWd) solid var(--tmInlineBrdCol);border-inline-width:var(--tmBrdL) var(--tmBrdR)}.expressive-code .frame{all:unset;position:relative;display:block;--header-border-radius:calc(var(--ec-brdRad) + var(--ec-brdWd));--tab-border-radius:calc(var(--ec-frm-edTabBrdRad) + var(--ec-brdWd));--button-spacing:0.4rem;--code-background:var(--ec-frm-edBg);border-radius:var(--header-border-radius);box-shadow:var(--ec-frm-frameBoxShdCssVal)}.expressive-code .frame .header{display:none;z-index:1;position:relative;border-radius:var(--header-border-radius) var(--header-border-radius) 0 0}.expressive-code .frame.has-title pre,.expressive-code .frame.has-title code,.expressive-code .frame.is-terminal pre,.expressive-code .frame.is-terminal code{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.expressive-code .frame .title:empty:before{content:'\a0'}.expressive-code .frame.has-title:not(.is-terminal){--button-spacing:calc(1.9rem + 2 * (var(--ec-uiPadBlk) + var(--ec-frm-edActTabIndHt)))}.expressive-code .frame.has-title:not(.is-terminal) .title{position:relative;color:var(--ec-frm-edActTabFg);background:var(--ec-frm-edActTabBg);background-clip:padding-box;margin-block-start:var(--ec-frm-edTabsMargBlkStart);padding:calc(var(--ec-uiPadBlk) + var(--ec-frm-edActTabIndHt)) var(--ec-uiPadInl);border:var(--ec-brdWd) solid var(--ec-frm-edActTabBrdCol);border-radius:var(--tab-border-radius) var(--tab-border-radius) 0 0;border-bottom:none;overflow:hidden}.expressive-code .frame.has-title:not(.is-terminal) .title::after{content:'';position:absolute;pointer-events:none;inset:0;border-top:var(--ec-frm-edActTabIndHt) solid var(--ec-frm-edActTabIndTopCol);border-bottom:var(--ec-frm-edActTabIndHt) solid var(--ec-frm-edActTabIndBtmCol)}.expressive-code .frame.has-title:not(.is-terminal) .header{display:flex;background:linear-gradient(to top, var(--ec-frm-edTabBarBrdBtmCol) var(--ec-brdWd), transparent var(--ec-brdWd)),linear-gradient(var(--ec-frm-edTabBarBg), var(--ec-frm-edTabBarBg));background-repeat:no-repeat;padding-inline-start:var(--ec-frm-edTabsMargInlStart)}.expressive-code .frame.has-title:not(.is-terminal) .header::before{content:'';position:absolute;pointer-events:none;inset:0;border:var(--ec-brdWd) solid var(--ec-frm-edTabBarBrdCol);border-radius:inherit;border-bottom:none}.expressive-code .frame.is-terminal{--button-spacing:calc(1.9rem + var(--ec-brdWd) + 2 * var(--ec-uiPadBlk));--code-background:var(--ec-frm-trmBg)}.expressive-code .frame.is-terminal .header{display:flex;align-items:center;justify-content:center;padding-block:var(--ec-uiPadBlk);padding-block-end:calc(var(--ec-uiPadBlk) + var(--ec-brdWd));position:relative;font-weight:500;letter-spacing:0.025ch;color:var(--ec-frm-trmTtbFg);background:var(--ec-frm-trmTtbBg);border:var(--ec-brdWd) solid var(--ec-brdCol);border-bottom:none}.expressive-code .frame.is-terminal .header::before{content:'';position:absolute;pointer-events:none;left:var(--ec-uiPadInl);width:2.1rem;height:0.56rem;line-height:0;background-color:var(--ec-frm-trmTtbDotsFg);opacity:var(--ec-frm-trmTtbDotsOpa);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 16' preserveAspectRatio='xMidYMid meet'%3E%3Ccircle cx='8' cy='8' r='8'/%3E%3Ccircle cx='30' cy='8' r='8'/%3E%3Ccircle cx='52' cy='8' r='8'/%3E%3C/svg%3E");-webkit-mask-repeat:no-repeat;mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 16' preserveAspectRatio='xMidYMid meet'%3E%3Ccircle cx='8' cy='8' r='8'/%3E%3Ccircle cx='30' cy='8' r='8'/%3E%3Ccircle cx='52' cy='8' r='8'/%3E%3C/svg%3E");mask-repeat:no-repeat}.expressive-code .frame.is-terminal .header::after{content:'';position:absolute;pointer-events:none;inset:0;border-bottom:var(--ec-brdWd) solid var(--ec-frm-trmTtbBrdBtmCol)}.expressive-code .frame pre{background:var(--code-background)}.expressive-code .copy{display:flex;gap:0.25rem;flex-direction:row;position:absolute;inset-block-start:calc(var(--ec-brdWd) + var(--button-spacing));inset-inline-end:calc(var(--ec-brdWd) + var(--ec-uiPadInl) / 2)}@media (scripting: none){.expressive-code .copy{display:none}}.expressive-code .copy{direction:ltr;unicode-bidi:isolate}.expressive-code .copy button{position:relative;align-self:flex-end;margin:0;padding:0;border:none;border-radius:0.2rem;z-index:1;cursor:pointer;transition-property:opacity, background, border-color;transition-duration:0.2s;transition-timing-function:cubic-bezier(0.25, 0.46, 0.45, 0.94);width:2.5rem;height:2.5rem;background:var(--code-background);opacity:0.75}.expressive-code .copy button div{position:absolute;inset:0;border-radius:inherit;background:var(--ec-frm-inlBtnBg);opacity:var(--ec-frm-inlBtnBgIdleOpa);transition-property:inherit;transition-duration:inherit;transition-timing-function:inherit}.expressive-code .copy button::before{content:'';position:absolute;pointer-events:none;inset:0;border-radius:inherit;border:var(--ec-brdWd) solid var(--ec-frm-inlBtnBrd);opacity:var(--ec-frm-inlBtnBrdOpa)}.expressive-code .copy button::after{content:'';position:absolute;pointer-events:none;inset:0;background-color:var(--ec-frm-inlBtnFg);-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75'%3E%3Cpath d='M3 19a2 2 0 0 1-1-2V2a2 2 0 0 1 1-1h13a2 2 0 0 1 2 1'/%3E%3Crect x='6' y='5' width='16' height='18' rx='1.5' ry='1.5'/%3E%3C/svg%3E");-webkit-mask-repeat:no-repeat;mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.75'%3E%3Cpath d='M3 19a2 2 0 0 1-1-2V2a2 2 0 0 1 1-1h13a2 2 0 0 1 2 1'/%3E%3Crect x='6' y='5' width='16' height='18' rx='1.5' ry='1.5'/%3E%3C/svg%3E");mask-repeat:no-repeat;margin:0.475rem;line-height:0}.expressive-code .copy button:hover,.expressive-code .copy button:focus:focus-visible{opacity:1}.expressive-code .copy button:hover div,.expressive-code .copy button:focus:focus-visible div{opacity:var(--ec-frm-inlBtnBgHoverOrFocusOpa)}.expressive-code .copy button:active{opacity:1}.expressive-code .copy button:active div{opacity:var(--ec-frm-inlBtnBgActOpa)}.expressive-code .copy .feedback{--tooltip-arrow-size:0.35rem;--tooltip-bg:var(--ec-frm-tooltipSuccessBg);color:var(--ec-frm-tooltipSuccessFg);pointer-events:none;user-select:none;-webkit-user-select:none;position:relative;align-self:center;background-color:var(--tooltip-bg);z-index:99;padding:0.125rem 0.75rem;border-radius:0.2rem;margin-inline-end:var(--tooltip-arrow-size);opacity:0;transition-property:opacity, transform;transition-duration:0.2s;transition-timing-function:ease-in-out;transform:translate3d(0, 0.25rem, 0)}.expressive-code .copy .feedback::after{content:'';position:absolute;pointer-events:none;top:calc(50% - var(--tooltip-arrow-size));inset-inline-end:calc(-2 * (var(--tooltip-arrow-size) - 0.5px));border:var(--tooltip-arrow-size) solid transparent;border-inline-start-color:var(--tooltip-bg)}.expressive-code .copy .feedback.show{opacity:1;transform:translate3d(0, 0, 0)}@media (hover: hover){.expressive-code{}.expressive-code .copy button{opacity:0;width:2rem;height:2rem}.expressive-code .frame:hover .copy button:not(:hover),.expressive-code .frame:focus-within :focus-visible ~ .copy button:not(:hover),.expressive-code .frame .copy .feedback.show ~ button:not(:hover){opacity:0.75}}:root,:root:not([data-theme='dark']) .expressive-code[data-theme='dark']{--ec-brdRad:0px;--ec-brdWd:1px;--ec-brdCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-codeFontFml:var(--__sl-font-mono);--ec-codeFontSize:var(--sl-text-code);--ec-codeFontWg:400;--ec-codeLineHt:var(--sl-line-height);--ec-codePadBlk:0.75rem;--ec-codePadInl:1rem;--ec-codeBg:#011627;--ec-codeFg:#d6deeb;--ec-codeSelBg:#1d3b53;--ec-gtrFg:#556c80;--ec-gtrBrdCol:#556c8033;--ec-gtrBrdWd:1.5px;--ec-gtrHlFg:#c5e4fd8e;--ec-uiFontFml:var(--__sl-font);--ec-uiFontSize:0.9rem;--ec-uiFontWg:400;--ec-uiLineHt:1.65;--ec-uiPadBlk:0.25rem;--ec-uiPadInl:1rem;--ec-uiSelBg:#234d708c;--ec-uiSelFg:#ffffff;--ec-focusBrd:#122d42;--ec-sbThumbCol:#ffffff17;--ec-sbThumbHoverCol:#ffffff49;--ec-tm-lineMarkerAccentMarg:0rem;--ec-tm-lineMarkerAccentWd:0.15rem;--ec-tm-lineMarkerLabelPadInl:0.2rem;--ec-tm-lineMarkerLabelCol:white;--ec-tm-lineDiffIndMargLeft:0.25rem;--ec-tm-inlMarkerBrdWd:1.5px;--ec-tm-inlMarkerBrdRad:0.2rem;--ec-tm-inlMarkerPad:0.15rem;--ec-tm-insDiffIndContent:'+';--ec-tm-delDiffIndContent:'-';--ec-tm-markBg:#ffffff17;--ec-tm-markBrdCol:#ffffff40;--ec-tm-insBg:#1e571599;--ec-tm-insBrdCol:#487f3bd0;--ec-tm-insDiffIndCol:#79b169d0;--ec-tm-delBg:#862d2799;--ec-tm-delBrdCol:#b4554bd0;--ec-tm-delDiffIndCol:#ed8779d0;--ec-frm-shdCol:#011627;--ec-frm-frameBoxShdCssVal:none;--ec-frm-edActTabBg:var(--sl-color-gray-6);--ec-frm-edActTabFg:var(--sl-color-text);--ec-frm-edActTabBrdCol:transparent;--ec-frm-edActTabIndHt:1px;--ec-frm-edActTabIndTopCol:var(--sl-color-accent-high);--ec-frm-edActTabIndBtmCol:transparent;--ec-frm-edTabsMargInlStart:0;--ec-frm-edTabsMargBlkStart:0;--ec-frm-edTabBrdRad:0px;--ec-frm-edTabBarBg:var(--sl-color-black);--ec-frm-edTabBarBrdCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-edTabBarBrdBtmCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-edBg:var(--sl-color-gray-6);--ec-frm-trmTtbDotsFg:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-trmTtbDotsOpa:0.75;--ec-frm-trmTtbBg:var(--sl-color-black);--ec-frm-trmTtbFg:var(--sl-color-text);--ec-frm-trmTtbBrdBtmCol:color-mix(in srgb, var(--sl-color-gray-5), transparent 25%);--ec-frm-trmBg:var(--sl-color-gray-6);--ec-frm-inlBtnFg:var(--sl-color-text);--ec-frm-inlBtnBg:var(--sl-color-text);--ec-frm-inlBtnBgIdleOpa:0;--ec-frm-inlBtnBgHoverOrFocusOpa:0.2;--ec-frm-inlBtnBgActOpa:0.3;--ec-frm-inlBtnBrd:var(--sl-color-text);--ec-frm-inlBtnBrdOpa:0.4;--ec-frm-tooltipSuccessBg:#158744;--ec-frm-tooltipSuccessFg:white}.expressive-code .ec-line :where(span[style^='--']:not([class])),:root:not([data-theme='dark']) .expressive-code[data-theme='dark'] .ec-line :where(span[style^='--']:not([class])){color:var(--0, inherit);font-style:var(--0fs, inherit);font-weight:var(--0fw, inherit);text-decoration:var(--0td, inherit)}@media (prefers-color-scheme: light){:root:not([data-theme='dark']){--ec-codeBg:#fbfbfb;--ec-codeFg:#403f53;--ec-codeSelBg:#e0e0e0;--ec-gtrFg:#7a8d96;--ec-gtrBrdCol:#7a8d9633;--ec-gtrHlFg:#403f53c3;--ec-uiSelBg:#d3e8f8;--ec-uiSelFg:#403f53;--ec-focusBrd:#93a1a1;--ec-sbThumbCol:#0000001a;--ec-sbThumbHoverCol:#0000005c;--ec-tm-markBg:#0000001a;--ec-tm-markBrdCol:#00000055;--ec-tm-insBg:#8ec77d99;--ec-tm-insDiffIndCol:#336a28d0;--ec-tm-delBg:#ff9c8e99;--ec-tm-delDiffIndCol:#9d4138d0;--ec-frm-shdCol:#d9d9d9;--ec-frm-edActTabBg:var(--sl-color-gray-7);--ec-frm-edActTabIndTopCol:var(--sl-color-accent);--ec-frm-edTabBarBg:var(--sl-color-gray-6);--ec-frm-edBg:var(--sl-color-gray-7);--ec-frm-trmTtbBg:var(--sl-color-gray-6);--ec-frm-trmBg:var(--sl-color-gray-7);--ec-frm-tooltipSuccessBg:#078662}:root:not([data-theme='dark']) .expressive-code .ec-line :where(span[style^='--']:not([class])){color:var(--1, inherit);font-style:var(--1fs, inherit);font-weight:var(--1fw, inherit);text-decoration:var(--1td, inherit)}}:root[data-theme='light'] .expressive-code:not([data-theme='dark']),.expressive-code[data-theme='light']{--ec-codeBg:#fbfbfb;--ec-codeFg:#403f53;--ec-codeSelBg:#e0e0e0;--ec-gtrFg:#7a8d96;--ec-gtrBrdCol:#7a8d9633;--ec-gtrHlFg:#403f53c3;--ec-uiSelBg:#d3e8f8;--ec-uiSelFg:#403f53;--ec-focusBrd:#93a1a1;--ec-sbThumbCol:#0000001a;--ec-sbThumbHoverCol:#0000005c;--ec-tm-markBg:#0000001a;--ec-tm-markBrdCol:#00000055;--ec-tm-insBg:#8ec77d99;--ec-tm-insDiffIndCol:#336a28d0;--ec-tm-delBg:#ff9c8e99;--ec-tm-delDiffIndCol:#9d4138d0;--ec-frm-shdCol:#d9d9d9;--ec-frm-edActTabBg:var(--sl-color-gray-7);--ec-frm-edActTabIndTopCol:var(--sl-color-accent);--ec-frm-edTabBarBg:var(--sl-color-gray-6);--ec-frm-edBg:var(--sl-color-gray-7);--ec-frm-trmTtbBg:var(--sl-color-gray-6);--ec-frm-trmBg:var(--sl-color-gray-7);--ec-frm-tooltipSuccessBg:#078662}:root[data-theme='light'] .expressive-code:not([data-theme='dark']) .ec-line :where(span[style^='--']:not([class])),.expressive-code[data-theme='light'] .ec-line :where(span[style^='--']:not([class])){color:var(--1, inherit);font-style:var(--1fs, inherit);font-weight:var(--1fw, inherit);text-decoration:var(--1td, inherit)} \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/_astro/fugaz-one-latin-400-normal.5IrmUd-K.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/fugaz-one-latin-400-normal.5IrmUd-K.woff2 new file mode 100644 index 0000000..b9b5443 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/fugaz-one-latin-400-normal.5IrmUd-K.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/fugaz-one-latin-400-normal.T0zCngim.woff b/shepherd/blueprints/staticroutes/docs/_astro/fugaz-one-latin-400-normal.T0zCngim.woff new file mode 100644 index 0000000..8a749db Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/fugaz-one-latin-400-normal.T0zCngim.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/hoisted.C4q4f3TC.js b/shepherd/blueprints/staticroutes/docs/_astro/hoisted.C4q4f3TC.js new file mode 100644 index 0000000..de14d88 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/hoisted.C4q4f3TC.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_astro/ui-core.hjFf04rQ.js","_astro/Tabs.astro_astro_type_script_index_0_lang.3nBd5krW.js"])))=>i.map(i=>d[i]); +import"./Tabs.astro_astro_type_script_index_0_lang.3nBd5krW.js";const S=document.getElementById("starlight__sidebar"),y=S?.querySelector("sl-sidebar-state-persist"),b="sl-sidebar-state",v=()=>{let t=[];const e=y?.dataset.hash||"";try{const n=sessionStorage.getItem(b),s=JSON.parse(n||"{}");Array.isArray(s.open)&&s.hash===e&&(t=s.open)}catch{}return{hash:e,open:t,scroll:S?.scrollTop||0}},w=t=>{try{sessionStorage.setItem(b,JSON.stringify(t))}catch{}},L=()=>w(v()),x=(t,e)=>{const n=v();n.open[e]=t,w(n)};y?.addEventListener("click",t=>{if(!(t.target instanceof Element))return;const e=t.target.closest("summary")?.closest("details");if(!e)return;const n=e.querySelector("sl-sidebar-restore"),s=parseInt(n?.dataset.index||"");isNaN(s)||x(!e.open,s)});addEventListener("visibilitychange",()=>{document.visibilityState==="hidden"&&L()});addEventListener("pageHide",L);class H extends HTMLElement{constructor(){super();const e=this.querySelector("select");e&&e.addEventListener("change",n=>{n.currentTarget instanceof HTMLSelectElement&&(window.location.pathname=n.currentTarget.value)})}}customElements.define("starlight-lang-select",H);const C="modulepreload",M=function(t){return"/docs/"+t},E={},_=function(e,n,s){let u=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),c=a?.nonce||a?.getAttribute("nonce");u=Promise.allSettled(n.map(l=>{if(l=M(l),l in E)return;E[l]=!0;const r=l.endsWith(".css"),h=r?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${h}`))return;const i=document.createElement("link");if(i.rel=r?"stylesheet":C,r||(i.as="script"),i.crossOrigin="",i.href=l,c&&i.setAttribute("nonce",c),document.head.appendChild(i),r)return new Promise((o,m)=>{i.addEventListener("load",o),i.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${l}`)))})}))}function d(a){const c=new Event("vite:preloadError",{cancelable:!0});if(c.payload=a,window.dispatchEvent(c),!c.defaultPrevented)throw a}return u.then(a=>{for(const c of a||[])c.status==="rejected"&&d(c.reason);return e().catch(d)})};class A extends HTMLElement{constructor(){super();const e=this.querySelector("button[data-open-modal]"),n=this.querySelector("button[data-close-modal]"),s=this.querySelector("dialog"),u=this.querySelector(".dialog-frame"),d=o=>{("href"in(o.target||{})||document.body.contains(o.target)&&!u.contains(o.target))&&c()},a=o=>{s.showModal(),document.body.toggleAttribute("data-search-modal-open",!0),this.querySelector("input")?.focus(),o?.stopPropagation(),window.addEventListener("click",d)},c=()=>s.close();e.addEventListener("click",a),e.disabled=!1,n.addEventListener("click",c),s.addEventListener("close",()=>{document.body.toggleAttribute("data-search-modal-open",!1),window.removeEventListener("click",d)}),window.addEventListener("keydown",o=>{(o.metaKey===!0||o.ctrlKey===!0)&&o.key==="k"&&(s.open?c():a(),o.preventDefault())});let l={};try{l=JSON.parse(this.dataset.translations||"{}")}catch{}const i=this.dataset.stripTrailingSlash!==void 0?o=>o.replace(/(.)\/(#.*)?$/,"$1$2"):o=>o;window.addEventListener("DOMContentLoaded",()=>{(window.requestIdleCallback||(m=>setTimeout(m,1)))(async()=>{const{PagefindUI:m}=await _(async()=>{const{PagefindUI:g}=await import("./ui-core.hjFf04rQ.js");return{PagefindUI:g}},__vite__mapDeps([0,1]));new m({element:"#starlight__search",baseUrl:"/docs/",bundlePath:"/docs/".replace(/\/$/,"")+"/pagefind/",showImages:!1,translations:l,showSubResults:!0,processResult:g=>{g.url=i(g.url),g.sub_results=g.sub_results.map(f=>(f.url=i(f.url),f))}})})})}}customElements.define("site-search",A);const T="starlight-theme",k=t=>t==="auto"||t==="dark"||t==="light"?t:"auto",I=()=>k(typeof localStorage<"u"&&localStorage.getItem(T));function P(t){typeof localStorage<"u"&&localStorage.setItem(T,t==="light"||t==="dark"?t:"")}const O=()=>matchMedia("(prefers-color-scheme: light)").matches?"light":"dark";function p(t){StarlightThemeProvider.updatePickers(t),document.documentElement.dataset.theme=t==="auto"?O():t,P(t)}matchMedia("(prefers-color-scheme: light)").addEventListener("change",()=>{I()==="auto"&&p("auto")});class R extends HTMLElement{constructor(){super(),p(I()),this.querySelector("select")?.addEventListener("change",e=>{e.currentTarget instanceof HTMLSelectElement&&p(k(e.currentTarget.value))})}}customElements.define("starlight-theme-select",R);class N extends HTMLElement{constructor(){super(),this.btn=this.querySelector("button"),this.btn.addEventListener("click",()=>this.toggleExpanded());const e=this.closest("nav");e&&e.addEventListener("keyup",n=>this.closeOnEscape(n))}setExpanded(e){this.setAttribute("aria-expanded",String(e)),document.body.toggleAttribute("data-mobile-menu-expanded",e)}toggleExpanded(){this.setExpanded(this.getAttribute("aria-expanded")!=="true")}closeOnEscape(e){e.code==="Escape"&&(this.setExpanded(!1),this.btn.focus())}}customElements.define("starlight-menu-button",N);const $="_top";class q extends HTMLElement{constructor(){super(),this._current=this.querySelector('a[aria-current="true"]'),this.minH=parseInt(this.dataset.minH||"2",10),this.maxH=parseInt(this.dataset.maxH||"3",10),this.onIdle=e=>(window.requestIdleCallback||(n=>setTimeout(n,1)))(e),this.init=()=>{const e=[...this.querySelectorAll("a")],n=r=>{if(r instanceof HTMLHeadingElement){if(r.id===$)return!0;const h=r.tagName[1];if(h){const i=parseInt(h,10);if(i>=this.minH&&i<=this.maxH)return!0}}return!1},s=r=>{if(!r)return null;const h=r;for(;r;){if(n(r))return r;for(r=r.previousElementSibling;r?.lastElementChild;)r=r.lastElementChild;const i=s(r);if(i)return i}return s(h.parentElement)},u=r=>{for(const{isIntersecting:h,target:i}of r){if(!h)continue;const o=s(i);if(!o)continue;const m=e.find(g=>g.hash==="#"+encodeURIComponent(o.id));if(m){this.current=m;break}}},d=document.querySelectorAll("main [id], main [id] ~ *, main .content > *");let a;const c=()=>{a||(a=new IntersectionObserver(u,{rootMargin:this.getRootMargin()}),d.forEach(r=>a.observe(r)))};c();let l;window.addEventListener("resize",()=>{a&&(a.disconnect(),a=void 0),clearTimeout(l),l=setTimeout(()=>this.onIdle(c),200)})},this.onIdle(()=>this.init())}set current(e){e!==this._current&&(this._current&&this._current.removeAttribute("aria-current"),e.setAttribute("aria-current","true"),this._current=e)}getRootMargin(){const e=document.querySelector("header")?.getBoundingClientRect().height||0,n=this.querySelector("summary")?.getBoundingClientRect().height||0,s=e+n+32,u=s+53,d=document.documentElement.clientHeight;return`-${s}px 0% ${u-d}px`}}customElements.define("starlight-toc",q);class B extends q{set current(e){super.current=e;const n=this.querySelector(".display-current");n&&(n.textContent=e.textContent)}constructor(){super();const e=this.querySelector("details");if(!e)return;const n=()=>{e.open=!1};e.querySelectorAll("a").forEach(s=>{s.addEventListener("click",n)}),window.addEventListener("click",s=>{e.contains(s.target)||n()}),window.addEventListener("keydown",s=>{if(s.key==="Escape"&&e.open){const u=e.contains(document.activeElement);if(n(),u){const d=e.querySelector("summary");d&&d.focus()}}})}}customElements.define("mobile-starlight-toc",B);export{_}; diff --git a/shepherd/blueprints/staticroutes/docs/_astro/index.CMVuKxAY.css b/shepherd/blueprints/staticroutes/docs/_astro/index.CMVuKxAY.css new file mode 100644 index 0000000..07a0dba --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/index.CMVuKxAY.css @@ -0,0 +1 @@ +:root,::backdrop{--sl-color-white: hsl(0, 0%, 100%);--sl-color-gray-1: hsl(224, 20%, 94%);--sl-color-gray-2: hsl(224, 6%, 77%);--sl-color-gray-3: hsl(224, 6%, 56%);--sl-color-gray-4: hsl(224, 7%, 36%);--sl-color-gray-5: hsl(224, 10%, 23%);--sl-color-gray-6: hsl(224, 14%, 16%);--sl-color-black: hsl(224, 10%, 10%);--sl-hue-orange: 41;--sl-color-orange-low: hsl(var(--sl-hue-orange), 39%, 22%);--sl-color-orange: hsl(var(--sl-hue-orange), 82%, 63%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 82%, 87%);--sl-hue-green: 101;--sl-color-green-low: hsl(var(--sl-hue-green), 39%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 82%, 63%);--sl-color-green-high: hsl(var(--sl-hue-green), 82%, 80%);--sl-hue-blue: 234;--sl-color-blue-low: hsl(var(--sl-hue-blue), 54%, 20%);--sl-color-blue: hsl(var(--sl-hue-blue), 100%, 60%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 100%, 87%);--sl-hue-purple: 281;--sl-color-purple-low: hsl(var(--sl-hue-purple), 39%, 22%);--sl-color-purple: hsl(var(--sl-hue-purple), 82%, 63%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 82%, 89%);--sl-hue-red: 339;--sl-color-red-low: hsl(var(--sl-hue-red), 39%, 22%);--sl-color-red: hsl(var(--sl-hue-red), 82%, 63%);--sl-color-red-high: hsl(var(--sl-hue-red), 82%, 87%);--sl-color-accent-low: hsl(224, 54%, 20%);--sl-color-accent: hsl(224, 100%, 60%);--sl-color-accent-high: hsl(224, 100%, 85%);--sl-color-text: var(--sl-color-gray-2);--sl-color-text-accent: var(--sl-color-accent-high);--sl-color-text-invert: var(--sl-color-accent-low);--sl-color-bg: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-6);--sl-color-bg-sidebar: var(--sl-color-gray-6);--sl-color-bg-inline-code: var(--sl-color-gray-5);--sl-color-bg-accent: var(--sl-color-accent-high);--sl-color-hairline-light: var(--sl-color-gray-5);--sl-color-hairline: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-black);--sl-color-backdrop-overlay: hsla(223, 13%, 10%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .12), 0px 2px 1px hsla(0, 0%, 0%, .24);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .08), 0px 5px 2px hsla(0, 0%, 0%, .08), 0px 3px 2px hsla(0, 0%, 0%, .12), 0px 1px 1px hsla(0, 0%, 0%, .15);--sl-shadow-lg: 0px 25px 7px hsla(0, 0%, 0%, .03), 0px 16px 6px hsla(0, 0%, 0%, .1), 0px 9px 5px hsla(223, 13%, 10%, .33), 0px 4px 4px hsla(0, 0%, 0%, .75), 0px 4px 2px hsla(0, 0%, 0%, .25);--sl-text-2xs: .75rem;--sl-text-xs: .8125rem;--sl-text-sm: .875rem;--sl-text-base: 1rem;--sl-text-lg: 1.125rem;--sl-text-xl: 1.25rem;--sl-text-2xl: 1.5rem;--sl-text-3xl: 1.8125rem;--sl-text-4xl: 2.1875rem;--sl-text-5xl: 2.625rem;--sl-text-6xl: 4rem;--sl-text-body: var(--sl-text-base);--sl-text-body-sm: var(--sl-text-xs);--sl-text-code: var(--sl-text-sm);--sl-text-code-sm: var(--sl-text-xs);--sl-text-h1: var(--sl-text-4xl);--sl-text-h2: var(--sl-text-3xl);--sl-text-h3: var(--sl-text-2xl);--sl-text-h4: var(--sl-text-xl);--sl-text-h5: var(--sl-text-lg);--sl-line-height: 1.75;--sl-line-height-headings: 1.2;--sl-font-system: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--sl-font-system-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--__sl-font: var(--sl-font, var(--sl-font-system)), var(--sl-font-system);--__sl-font-mono: var(--sl-font-mono, var(--sl-font-system-mono)), var(--sl-font-system-mono);--sl-nav-height: 3.5rem;--sl-nav-pad-x: 1rem;--sl-nav-pad-y: .75rem;--sl-mobile-toc-height: 3rem;--sl-sidebar-width: 18.75rem;--sl-sidebar-pad-x: 1rem;--sl-content-width: 45rem;--sl-content-pad-x: 1rem;--sl-menu-button-size: 2rem;--sl-nav-gap: var(--sl-content-pad-x);--sl-outline-offset-inside: -.1875rem;--sl-z-index-toc: 4;--sl-z-index-menu: 5;--sl-z-index-navbar: 10;--sl-z-index-skiplink: 20}:root[data-theme=light],[data-theme=light] ::backdrop{--sl-color-white: hsl(224, 10%, 10%);--sl-color-gray-1: hsl(224, 14%, 16%);--sl-color-gray-2: hsl(224, 10%, 23%);--sl-color-gray-3: hsl(224, 7%, 36%);--sl-color-gray-4: hsl(224, 6%, 56%);--sl-color-gray-5: hsl(224, 6%, 77%);--sl-color-gray-6: hsl(224, 20%, 94%);--sl-color-gray-7: hsl(224, 19%, 97%);--sl-color-black: hsl(0, 0%, 100%);--sl-color-orange-high: hsl(var(--sl-hue-orange), 80%, 25%);--sl-color-orange: hsl(var(--sl-hue-orange), 90%, 60%);--sl-color-orange-low: hsl(var(--sl-hue-orange), 90%, 88%);--sl-color-green-high: hsl(var(--sl-hue-green), 80%, 22%);--sl-color-green: hsl(var(--sl-hue-green), 90%, 46%);--sl-color-green-low: hsl(var(--sl-hue-green), 85%, 90%);--sl-color-blue-high: hsl(var(--sl-hue-blue), 80%, 30%);--sl-color-blue: hsl(var(--sl-hue-blue), 90%, 60%);--sl-color-blue-low: hsl(var(--sl-hue-blue), 88%, 90%);--sl-color-purple-high: hsl(var(--sl-hue-purple), 90%, 30%);--sl-color-purple: hsl(var(--sl-hue-purple), 90%, 60%);--sl-color-purple-low: hsl(var(--sl-hue-purple), 80%, 90%);--sl-color-red-high: hsl(var(--sl-hue-red), 80%, 30%);--sl-color-red: hsl(var(--sl-hue-red), 90%, 60%);--sl-color-red-low: hsl(var(--sl-hue-red), 80%, 90%);--sl-color-accent-high: hsl(234, 80%, 30%);--sl-color-accent: hsl(234, 90%, 60%);--sl-color-accent-low: hsl(234, 88%, 90%);--sl-color-text-accent: var(--sl-color-accent);--sl-color-text-invert: var(--sl-color-black);--sl-color-bg-nav: var(--sl-color-gray-7);--sl-color-bg-sidebar: var(--sl-color-bg);--sl-color-bg-inline-code: var(--sl-color-gray-6);--sl-color-bg-accent: var(--sl-color-accent);--sl-color-hairline-light: var(--sl-color-gray-6);--sl-color-hairline-shade: var(--sl-color-gray-6);--sl-color-backdrop-overlay: hsla(225, 9%, 36%, .66);--sl-shadow-sm: 0px 1px 1px hsla(0, 0%, 0%, .06), 0px 2px 1px hsla(0, 0%, 0%, .06);--sl-shadow-md: 0px 8px 4px hsla(0, 0%, 0%, .03), 0px 5px 2px hsla(0, 0%, 0%, .03), 0px 3px 2px hsla(0, 0%, 0%, .06), 0px 1px 1px hsla(0, 0%, 0%, .06);--sl-shadow-lg: 0px 25px 7px rgba(0, 0, 0, .01), 0px 16px 6px hsla(0, 0%, 0%, .03), 0px 9px 5px hsla(223, 13%, 10%, .08), 0px 4px 4px hsla(0, 0%, 0%, .16), 0px 4px 2px hsla(0, 0%, 0%, .04)}@media (min-width: 50em){:root{--sl-nav-height: 4rem;--sl-nav-pad-x: 1.5rem;--sl-text-h1: var(--sl-text-5xl);--sl-text-h2: var(--sl-text-4xl);--sl-text-h3: var(--sl-text-3xl);--sl-text-h4: var(--sl-text-2xl)}}@media (min-width: 72rem){:root{--sl-content-pad-x: 1.5rem;--sl-mobile-toc-height: 0rem}}*,*:before,*:after{box-sizing:border-box}*{margin:0}html{color-scheme:dark;accent-color:var(--sl-color-accent)}html[data-theme=light]{color-scheme:light}body{font-family:var(--__sl-font);line-height:var(--sl-line-height);-webkit-font-smoothing:antialiased;color:var(--sl-color-text);background-color:var(--sl-color-bg)}input,button,textarea,select{font:inherit}p,h1,h2,h3,h4,h5,h6,code{overflow-wrap:anywhere}code{font-family:var(--__sl-font-mono)}:root{--astro-code-color-text: var(--sl-color-white);--astro-code-color-background: var(--sl-color-gray-6);--astro-code-token-constant: var(--sl-color-blue-high);--astro-code-token-string: var(--sl-color-green-high);--astro-code-token-comment: var(--sl-color-gray-2);--astro-code-token-keyword: var(--sl-color-purple-high);--astro-code-token-parameter: var(--sl-color-red-high);--astro-code-token-function: var(--sl-color-red-high);--astro-code-token-string-expression: var(--sl-color-green-high);--astro-code-token-punctuation: var(--sl-color-gray-2);--astro-code-token-link: var(--sl-color-blue-high)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sl-hidden{display:none}.sl-flex{display:flex}.sl-block{display:block}@media (min-width: 50rem){.md\:sl-hidden{display:none}.md\:sl-flex{display:flex}.md\:sl-block{display:block}}@media (min-width: 72rem){.lg\:sl-hidden{display:none}.lg\:sl-flex{display:flex}.lg\:sl-block{display:block}}[data-theme=light] .light\:sl-hidden,[data-theme=dark] .dark\:sl-hidden{display:none}[dir=rtl] .rtl\:flip:not(:where([dir=rtl] [dir=ltr] *)){transform:scaleX(-1)}.sl-banner:where(.astro-laz2plt2){--__sl-banner-text: var(--sl-color-banner-text, var(--sl-color-text-invert));padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);background-color:var(--sl-color-banner-bg, var(--sl-color-bg-accent));color:var(--__sl-banner-text);line-height:var(--sl-line-height-headings);text-align:center;text-wrap:balance;box-shadow:var(--sl-shadow-sm)}.sl-banner:where(.astro-laz2plt2) a{color:var(--__sl-banner-text)}.content-panel:where(.astro-7nkwcw3z){padding:1.5rem var(--sl-content-pad-x)}.content-panel:where(.astro-7nkwcw3z)+.content-panel:where(.astro-7nkwcw3z){border-top:1px solid var(--sl-color-hairline)}.sl-container:where(.astro-7nkwcw3z){max-width:var(--sl-content-width)}.sl-container:where(.astro-7nkwcw3z)>*+*{margin-top:1.5rem}@media (min-width: 72rem){.sl-container:where(.astro-7nkwcw3z){margin-inline:var(--sl-content-margin-inline, auto)}}p:where(.astro-opzsrvew){border:1px solid var(--sl-color-orange);padding:.75em 1em;background-color:var(--sl-color-orange-low);color:var(--sl-color-orange-high);width:-moz-max-content;width:max-content;max-width:100%;align-items:center;gap:.75em;font-size:var(--sl-text-body-sm);line-height:var(--sl-line-height-headings)}a:where(.astro-eez2twj6){gap:.5rem;align-items:center;text-decoration:none;color:var(--sl-color-gray-3)}a:where(.astro-eez2twj6):hover{color:var(--sl-color-white)}.pagination-links:where(.astro-u2l5gyhi){display:grid;grid-template-columns:repeat(auto-fit,minmax(min(18rem,100%),1fr));gap:1rem}a:where(.astro-u2l5gyhi){display:flex;align-items:center;justify-content:flex-start;gap:.5rem;width:100%;flex-basis:calc(50% - .5rem);flex-grow:1;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding:1rem;text-decoration:none;color:var(--sl-color-gray-2);box-shadow:var(--sl-shadow-md);overflow-wrap:anywhere}:where(.astro-u2l5gyhi)[rel=next]{justify-content:end;text-align:end;flex-direction:row-reverse}a:where(.astro-u2l5gyhi):hover{border-color:var(--sl-color-gray-2)}.link-title:where(.astro-u2l5gyhi){color:var(--sl-color-white);font-size:var(--sl-text-2xl);line-height:var(--sl-line-height-headings)}svg:where(.astro-u2l5gyhi){flex-shrink:0}footer:where(.astro-3yyafb3n){flex-direction:column;gap:1.5rem}.meta:where(.astro-3yyafb3n){gap:.75rem 3rem;justify-content:space-between;flex-wrap:wrap;margin-top:3rem;font-size:var(--sl-text-sm);color:var(--sl-color-gray-3)}.meta:where(.astro-3yyafb3n)>p:only-child{margin-inline-start:auto}.kudos:where(.astro-3yyafb3n){align-items:center;gap:.5em;margin:1.5rem auto;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3)}.kudos:where(.astro-3yyafb3n) svg{color:var(--sl-color-orange)}.kudos:where(.astro-3yyafb3n):hover{color:var(--sl-color-white)}label:where(.astro-4yphtoen){--sl-label-icon-size: .875rem;--sl-caret-size: 1.25rem;--sl-inline-padding: .5rem;position:relative;display:flex;align-items:center;gap:.25rem;color:var(--sl-color-gray-1)}label:where(.astro-4yphtoen):hover{color:var(--sl-color-gray-2)}.icon:where(.astro-4yphtoen){position:absolute;top:50%;transform:translateY(-50%);pointer-events:none}.label-icon:where(.astro-4yphtoen){font-size:var(--sl-label-icon-size);inset-inline-start:0}.caret:where(.astro-4yphtoen){font-size:var(--sl-caret-size);inset-inline-end:0}select:where(.astro-4yphtoen){border:0;padding-block:.625rem;padding-inline:calc(var(--sl-label-icon-size) + var(--sl-inline-padding) + .25rem) calc(var(--sl-caret-size) + var(--sl-inline-padding) + .25rem);margin-inline:calc(var(--sl-inline-padding) * -1);width:calc(var(--sl-select-width) + var(--sl-inline-padding) * 2);background-color:transparent;text-overflow:ellipsis;color:inherit;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none}option:where(.astro-4yphtoen){background-color:var(--sl-color-bg-nav);color:var(--sl-color-gray-1)}@media (min-width: 50rem){select:where(.astro-4yphtoen){font-size:var(--sl-text-sm)}}.pagefind-ui__result.svelte-j9e30.svelte-j9e30{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-j9e30.svelte-j9e30:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-thumb.svelte-j9e30.svelte-j9e30{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-j9e30.svelte-j9e30{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-j9e30.svelte-j9e30{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-j9e30.svelte-j9e30{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-j9e30.svelte-j9e30{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-j9e30.svelte-j9e30{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf{display:flex;flex-direction:column;padding-left:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf:first-of-type{padding-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{font-size:.9em;position:relative}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:before{content:"⤷ ";position:absolute;top:0;right:calc(100% + .1em)}.pagefind-ui__result-thumb.svelte-4xnkmf.svelte-4xnkmf{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-4xnkmf.svelte-4xnkmf{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-4xnkmf.svelte-4xnkmf{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-4xnkmf.svelte-4xnkmf{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-4xnkmf.svelte-4xnkmf{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}legend.svelte-1v2r7ls.svelte-1v2r7ls{position:absolute;clip:rect(0 0 0 0)}.pagefind-ui__filter-panel.svelte-1v2r7ls.svelte-1v2r7ls{min-width:min(calc(260px * var(--pagefind-ui-scale)),100%);flex:1;display:flex;flex-direction:column;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{border:0;padding:0}.pagefind-ui__filter-block.svelte-1v2r7ls.svelte-1v2r7ls{padding:0;display:block;border-bottom:solid calc(2px * var(--pagefind-ui-scale)) var(--pagefind-ui-border);padding:calc(20px * var(--pagefind-ui-scale)) 0}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls{font-size:calc(16px * var(--pagefind-ui-scale));position:relative;display:flex;align-items:center;list-style:none;font-weight:700;cursor:pointer;height:calc(24px * var(--pagefind-ui-scale))}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls::-webkit-details-marker{display:none}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls:after{position:absolute;content:"";right:calc(6px * var(--pagefind-ui-scale));top:50%;width:calc(8px * var(--pagefind-ui-scale));height:calc(8px * var(--pagefind-ui-scale));border:solid calc(2px * var(--pagefind-ui-scale)) currentColor;border-right:0;border-top:0;transform:translateY(-70%) rotate(-45deg)}.pagefind-ui__filter-block[open].svelte-1v2r7ls .pagefind-ui__filter-name.svelte-1v2r7ls:after{transform:translateY(-70%) rotate(-225deg)}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{display:flex;flex-direction:column;gap:calc(20px * var(--pagefind-ui-scale));padding-top:calc(30px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls{position:relative;display:flex;align-items:center;gap:calc(8px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls:before{position:absolute;content:"";top:50%;left:calc(8px * var(--pagefind-ui-scale));width:0px;height:0px;border:solid 1px #fff;opacity:0;transform:translate(calc(4.5px * var(--pagefind-ui-scale) * -1),calc(.8px * var(--pagefind-ui-scale))) skew(-5deg) rotate(-45deg);transform-origin:top left;border-top:0;border-right:0;pointer-events:none}.pagefind-ui__filter-value.pagefind-ui__filter-value--checked.svelte-1v2r7ls.svelte-1v2r7ls:before{opacity:1;width:calc(9px * var(--pagefind-ui-scale));height:calc(4px * var(--pagefind-ui-scale));transition:width .1s ease-out .1s,height .1s ease-in}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls{margin:0;width:calc(16px * var(--pagefind-ui-scale));height:calc(16px * var(--pagefind-ui-scale));border:solid 1px var(--pagefind-ui-border);-moz-appearance:none;appearance:none;-webkit-appearance:none;border-radius:calc(var(--pagefind-ui-border-radius) / 2);background-color:var(--pagefind-ui-background);cursor:pointer}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls:checked{background-color:var(--pagefind-ui-primary);border:solid 1px var(--pagefind-ui-primary)}.pagefind-ui__filter-label.svelte-1v2r7ls.svelte-1v2r7ls{cursor:pointer;font-size:calc(16px * var(--pagefind-ui-scale));font-weight:400}.pagefind-ui--reset *:where(:not(html,iframe,canvas,img,svg,video):not(svg *,symbol *)){all:unset;display:revert;outline:revert}.pagefind-ui--reset *,.pagefind-ui--reset *:before,.pagefind-ui--reset *:after{box-sizing:border-box}.pagefind-ui--reset a,.pagefind-ui--reset button{cursor:revert}.pagefind-ui--reset ol,.pagefind-ui--reset ul,.pagefind-ui--reset menu{list-style:none}.pagefind-ui--reset img{max-width:100%}.pagefind-ui--reset table{border-collapse:collapse}.pagefind-ui--reset input,.pagefind-ui--reset textarea{-webkit-user-select:auto}.pagefind-ui--reset textarea{white-space:revert}.pagefind-ui--reset meter{-webkit-appearance:revert;-moz-appearance:revert;appearance:revert}.pagefind-ui--reset ::-moz-placeholder{color:unset}.pagefind-ui--reset ::placeholder{color:unset}.pagefind-ui--reset :where([hidden]){display:none}.pagefind-ui--reset :where([contenteditable]:not([contenteditable=false])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}.pagefind-ui--reset :where([draggable=true]){-webkit-user-drag:element}.pagefind-ui--reset mark{all:revert}:root{--pagefind-ui-scale:.8;--pagefind-ui-primary:#393939;--pagefind-ui-text:#393939;--pagefind-ui-background:#ffffff;--pagefind-ui-border:#eeeeee;--pagefind-ui-tag:#eeeeee;--pagefind-ui-border-width:2px;--pagefind-ui-border-radius:8px;--pagefind-ui-image-border-radius:8px;--pagefind-ui-image-box-ratio:3 / 2;--pagefind-ui-font:system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif}.pagefind-ui.svelte-e9gkc3{width:100%;color:var(--pagefind-ui-text);font-family:var(--pagefind-ui-font)}.pagefind-ui__hidden.svelte-e9gkc3{display:none!important}.pagefind-ui__suppressed.svelte-e9gkc3{opacity:0;pointer-events:none}.pagefind-ui__form.svelte-e9gkc3{position:relative}.pagefind-ui__form.svelte-e9gkc3:before{background-color:var(--pagefind-ui-text);width:calc(18px * var(--pagefind-ui-scale));height:calc(18px * var(--pagefind-ui-scale));top:calc(23px * var(--pagefind-ui-scale));left:calc(20px * var(--pagefind-ui-scale));content:"";position:absolute;display:block;opacity:.7;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");-webkit-mask-size:100%;mask-size:100%;z-index:9;pointer-events:none}.pagefind-ui__search-input.svelte-e9gkc3{height:calc(64px * var(--pagefind-ui-scale));padding:0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));background-color:var(--pagefind-ui-background);border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);font-size:calc(21px * var(--pagefind-ui-scale));position:relative;-moz-appearance:none;appearance:none;-webkit-appearance:none;display:flex;width:100%;box-sizing:border-box;font-weight:700}.pagefind-ui__search-input.svelte-e9gkc3::-moz-placeholder{opacity:.2}.pagefind-ui__search-input.svelte-e9gkc3::placeholder{opacity:.2}.pagefind-ui__search-clear.svelte-e9gkc3{position:absolute;top:calc(3px * var(--pagefind-ui-scale));right:calc(3px * var(--pagefind-ui-scale));height:calc(58px * var(--pagefind-ui-scale));padding:0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));color:var(--pagefind-ui-text);font-size:calc(14px * var(--pagefind-ui-scale));cursor:pointer;background-color:var(--pagefind-ui-background);border-radius:var(--pagefind-ui-border-radius)}.pagefind-ui__drawer.svelte-e9gkc3{gap:calc(60px * var(--pagefind-ui-scale));display:flex;flex-direction:row;flex-wrap:wrap}.pagefind-ui__results-area.svelte-e9gkc3{min-width:min(calc(400px * var(--pagefind-ui-scale)),100%);flex:1000;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__results.svelte-e9gkc3{padding:0}.pagefind-ui__message.svelte-e9gkc3{box-sizing:content-box;font-size:calc(16px * var(--pagefind-ui-scale));height:calc(24px * var(--pagefind-ui-scale));padding:calc(20px * var(--pagefind-ui-scale)) 0;display:flex;align-items:center;font-weight:700;margin-top:0}.pagefind-ui__button.svelte-e9gkc3{margin-top:calc(40px * var(--pagefind-ui-scale));border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);height:calc(48px * var(--pagefind-ui-scale));padding:0 calc(12px * var(--pagefind-ui-scale));font-size:calc(16px * var(--pagefind-ui-scale));color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background);width:100%;text-align:center;font-weight:700;cursor:pointer}.pagefind-ui__button.svelte-e9gkc3:hover{border-color:var(--pagefind-ui-primary);color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background)}[data-search-modal-open]{overflow:hidden}#starlight__search{--sl-search-result-spacing: calc(1.25rem * var(--pagefind-ui-scale));--sl-search-result-pad-inline-start: calc(3.75rem * var(--pagefind-ui-scale));--sl-search-result-pad-inline-end: calc(1.25rem * var(--pagefind-ui-scale));--sl-search-result-pad-block: calc(.9375rem * var(--pagefind-ui-scale));--sl-search-result-nested-pad-block: calc(.625rem * var(--pagefind-ui-scale));--sl-search-corners: calc(.3125rem * var(--pagefind-ui-scale));--sl-search-page-icon-size: calc(1.875rem * var(--pagefind-ui-scale));--sl-search-page-icon-inline-start: calc( (var(--sl-search-result-pad-inline-start) - var(--sl-search-page-icon-size)) / 2 );--sl-search-tree-diagram-size: calc(2.5rem * var(--pagefind-ui-scale));--sl-search-tree-diagram-inline-start: calc( (var(--sl-search-result-pad-inline-start) - var(--sl-search-tree-diagram-size)) / 2 )}#starlight__search .pagefind-ui__form:before{--pagefind-ui-text: var(--sl-color-gray-1);opacity:1}#starlight__search .pagefind-ui__search-input{color:var(--sl-color-white);font-weight:400;width:calc(100% - var(--sl-search-cancel-space))}#starlight__search input:focus{--pagefind-ui-border: var(--sl-color-accent)}#starlight__search .pagefind-ui__search-clear{inset-inline-end:var(--sl-search-cancel-space);width:calc(60px * var(--pagefind-ui-scale));padding:0;background-color:transparent;overflow:hidden}#starlight__search .pagefind-ui__search-clear:focus{outline:1px solid var(--sl-color-accent)}#starlight__search .pagefind-ui__search-clear:before{content:"";-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E") center / 50% no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E") center / 50% no-repeat;background-color:var(--sl-color-text-accent);display:block;width:100%;height:100%}#starlight__search .pagefind-ui__results>*+*{margin-top:var(--sl-search-result-spacing)}#starlight__search .pagefind-ui__result{border:0;padding:0}#starlight__search .pagefind-ui__result-nested{position:relative;padding:var(--sl-search-result-nested-pad-block) var(--sl-search-result-pad-inline-end);padding-inline-start:var(--sl-search-result-pad-inline-start)}#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)),#starlight__search .pagefind-ui__result-nested{position:relative;background-color:var(--sl-color-black)}#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):hover,#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):focus-within,#starlight__search .pagefind-ui__result-nested:hover,#starlight__search .pagefind-ui__result-nested:focus-within{outline:1px solid var(--sl-color-accent-high)}#starlight__search .pagefind-ui__result-title:not(:where(.pagefind-ui__result-nested *)):focus-within,#starlight__search .pagefind-ui__result-nested:focus-within{background-color:var(--sl-color-accent-low)}#starlight__search .pagefind-ui__result-thumb,#starlight__search .pagefind-ui__result-inner{margin-top:0}#starlight__search .pagefind-ui__result-inner>:first-child{border-radius:var(--sl-search-corners) var(--sl-search-corners) 0 0}#starlight__search .pagefind-ui__result-inner>:last-child{border-radius:0 0 var(--sl-search-corners) var(--sl-search-corners)}#starlight__search .pagefind-ui__result-inner>.pagefind-ui__result-title{padding:var(--sl-search-result-pad-block) var(--sl-search-result-pad-inline-end);padding-inline-start:var(--sl-search-result-pad-inline-start)}#starlight__search .pagefind-ui__result-inner>.pagefind-ui__result-title:before{content:"";position:absolute;inset-block:0;inset-inline-start:var(--sl-search-page-icon-inline-start);width:var(--sl-search-page-icon-size);background:var(--sl-color-gray-3);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 24 24'%3E%3Cpath d='M9 10h1a1 1 0 1 0 0-2H9a1 1 0 0 0 0 2Zm0 2a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H9Zm11-3V8l-6-6a1 1 0 0 0-1 0H7a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9Zm-6-4 3 3h-2a1 1 0 0 1-1-1V5Zm4 14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5v3a3 3 0 0 0 3 3h3v9Zm-3-3H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2Z'/%3E%3C/svg%3E") center no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 24 24'%3E%3Cpath d='M9 10h1a1 1 0 1 0 0-2H9a1 1 0 0 0 0 2Zm0 2a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2H9Zm11-3V8l-6-6a1 1 0 0 0-1 0H7a3 3 0 0 0-3 3v14a3 3 0 0 0 3 3h10a3 3 0 0 0 3-3V9Zm-6-4 3 3h-2a1 1 0 0 1-1-1V5Zm4 14a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h5v3a3 3 0 0 0 3 3h3v9Zm-3-3H9a1 1 0 0 0 0 2h6a1 1 0 0 0 0-2Z'/%3E%3C/svg%3E") center no-repeat}#starlight__search .pagefind-ui__result-inner{align-items:stretch;gap:1px}#starlight__search .pagefind-ui__result-link{position:unset;--pagefind-ui-text: var(--sl-color-white);font-weight:600}#starlight__search .pagefind-ui__result-link:hover{text-decoration:none}#starlight__search .pagefind-ui__result-nested .pagefind-ui__result-link:before{content:unset}#starlight__search .pagefind-ui__result-nested:before{content:"";position:absolute;inset-block:0;inset-inline-start:var(--sl-search-tree-diagram-inline-start);width:var(--sl-search-tree-diagram-size);background:var(--sl-color-gray-4);-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' viewBox='0 0 16 1000' preserveAspectRatio='xMinYMin slice'%3E%3Cpath d='M8 0v1000m6-988H8'/%3E%3C/svg%3E") 0% 0% / 100% no-repeat;mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' viewBox='0 0 16 1000' preserveAspectRatio='xMinYMin slice'%3E%3Cpath d='M8 0v1000m6-988H8'/%3E%3C/svg%3E") 0% 0% / 100% no-repeat}#starlight__search .pagefind-ui__result-nested:last-child:before{-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 16 16'%3E%3Cpath d='M8 0v12m6 0H8'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' viewBox='0 0 16 16'%3E%3Cpath d='M8 0v12m6 0H8'/%3E%3C/svg%3E")}[dir=rtl] .pagefind-ui__result-title:before,[dir=rtl] .pagefind-ui__result-nested:before{transform:scaleX(-1)}#starlight__search .pagefind-ui__result-link:after{content:"";position:absolute;inset:0}#starlight__search .pagefind-ui__result-excerpt{font-size:calc(1rem * var(--pagefind-ui-scale));overflow-wrap:anywhere}#starlight__search mark{color:var(--sl-color-gray-2);background-color:transparent;font-weight:600}site-search:where(.astro-v37mnknz){display:contents}button:where(.astro-v37mnknz)[data-open-modal]{display:flex;align-items:center;gap:.5rem;border:0;background-color:transparent;color:var(--sl-color-gray-1);cursor:pointer;height:2.5rem;font-size:var(--sl-text-xl)}@media (min-width: 50rem){button:where(.astro-v37mnknz)[data-open-modal]{border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;background-color:var(--sl-color-black);color:var(--sl-color-gray-2);font-size:var(--sl-text-sm);width:100%;max-width:22rem}button:where(.astro-v37mnknz)[data-open-modal]:hover{border-color:var(--sl-color-gray-2);color:var(--sl-color-white)}button:where(.astro-v37mnknz)[data-open-modal]>:last-child:where(.astro-v37mnknz){margin-inline-start:auto}}button:where(.astro-v37mnknz)>kbd:where(.astro-v37mnknz){border-radius:.25rem;font-size:var(--sl-text-2xs);gap:.25em;padding-inline:.375rem;background-color:var(--sl-color-gray-6)}kbd:where(.astro-v37mnknz){font-family:var(--__sl-font)}dialog:where(.astro-v37mnknz){margin:0;background-color:var(--sl-color-gray-6);border:1px solid var(--sl-color-gray-5);width:100%;max-width:100%;height:100%;max-height:100%;box-shadow:var(--sl-shadow-lg)}dialog:where(.astro-v37mnknz)[open]{display:flex}dialog:where(.astro-v37mnknz)::backdrop{background-color:var(--sl-color-backdrop-overlay);-webkit-backdrop-filter:blur(.25rem);backdrop-filter:blur(.25rem)}.dialog-frame:where(.astro-v37mnknz){position:relative;overflow:auto;flex-direction:column;flex-grow:1;gap:1rem;padding:1rem}button:where(.astro-v37mnknz)[data-close-modal]{position:absolute;z-index:1;align-items:center;align-self:flex-end;height:calc(64px * var(--pagefind-ui-scale));padding:.25rem;border:0;background:transparent;cursor:pointer;color:var(--sl-color-text-accent)}#starlight__search:where(.astro-v37mnknz){--pagefind-ui-primary: var(--sl-color-accent-light);--pagefind-ui-text: var(--sl-color-gray-2);--pagefind-ui-font: var(--__sl-font);--pagefind-ui-background: var(--sl-color-black);--pagefind-ui-border: var(--sl-color-gray-5);--pagefind-ui-border-width: 1px;--sl-search-cancel-space: 5rem}@media (min-width: 50rem){#starlight__search:where(.astro-v37mnknz){--sl-search-cancel-space: 0px}dialog:where(.astro-v37mnknz){margin:4rem auto auto;border-radius:.5rem;width:90%;max-width:40rem;height:-moz-max-content;height:max-content;min-height:15rem;max-height:calc(100% - 8rem)}.dialog-frame:where(.astro-v37mnknz){padding:1.5rem}}.logo:where(.astro-ol5jet75){height:1em;font-family:Fugaz One;font-size:2em;line-height:1em;padding-left:.1em;padding-right:.1em;color:var(--rc-red);text-decoration:none;color:red;text-shadow:-.05em .05em black;cursor:{clickable? "auto" : "default"}}a:where(.astro-wy4te6ga){color:var(--sl-color-text-accent);padding:.5em;margin:-.5em}a:where(.astro-wy4te6ga):hover{opacity:.66}.header:where(.astro-kmkmnagf){gap:var(--sl-nav-gap);justify-content:space-between;align-items:center;height:100%}.title-wrapper:where(.astro-kmkmnagf){overflow:hidden}.right-group:where(.astro-kmkmnagf),.social-icons:where(.astro-kmkmnagf){gap:1rem;align-items:center}.social-icons:where(.astro-kmkmnagf):after{content:"";height:2rem;border-inline-end:1px solid var(--sl-color-gray-5)}@media (min-width: 50rem){:root[data-has-sidebar]{--__sidebar-pad: calc(2 * var(--sl-nav-pad-x))}:root:not([data-has-toc]){--__toc-width: 0rem}.header:where(.astro-kmkmnagf){--__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));--__main-column-fr: calc( ( 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) - (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) - var(--sl-content-width) ) / 2 );display:grid;grid-template-columns:minmax(calc(var(--__sidebar-width) + max(0rem,var(--__main-column-fr) - var(--sl-nav-gap))),auto) 1fr auto;align-content:center}}.hero:where(.astro-jbfsktt5){display:grid;align-items:center;gap:1rem;padding-bottom:1rem}.hero:where(.astro-jbfsktt5)>img:where(.astro-jbfsktt5),.hero:where(.astro-jbfsktt5)>.hero-html:where(.astro-jbfsktt5){-o-object-fit:contain;object-fit:contain;width:min(70%,20rem);height:auto;margin-inline:auto}.stack:where(.astro-jbfsktt5){flex-direction:column;gap:clamp(1.5rem,calc(1.5rem + 1vw),2rem);text-align:center}.copy:where(.astro-jbfsktt5){flex-direction:column;gap:1rem;align-items:center}.copy:where(.astro-jbfsktt5)>:where(.astro-jbfsktt5){max-width:50ch}h1:where(.astro-jbfsktt5){font-size:clamp(var(--sl-text-3xl),calc(.25rem + 5vw),var(--sl-text-6xl));line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}.tagline:where(.astro-jbfsktt5){font-size:clamp(var(--sl-text-base),calc(.0625rem + 2vw),var(--sl-text-xl));color:var(--sl-color-gray-2)}.actions:where(.astro-jbfsktt5){gap:1rem 2rem;flex-wrap:wrap;justify-content:center}@media (min-width: 50rem){.hero:where(.astro-jbfsktt5){grid-template-columns:7fr 4fr;gap:3%;padding-block:clamp(2.5rem,calc(1rem + 10vmin),10rem)}.hero:where(.astro-jbfsktt5)>img:where(.astro-jbfsktt5),.hero:where(.astro-jbfsktt5)>.hero-html:where(.astro-jbfsktt5){order:2;width:min(100%,25rem)}.stack:where(.astro-jbfsktt5){text-align:start}.copy:where(.astro-jbfsktt5){align-items:flex-start}.actions:where(.astro-jbfsktt5){justify-content:flex-start}}.sl-markdown-content :not(a,strong,em,del,span,input,code,br)+:not(a,strong,em,del,span,input,code,br,:where(.not-content *)){margin-top:1rem}.sl-markdown-content :not(h1,h2,h3,h4,h5,h6)+:is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){margin-top:1.5em}.sl-markdown-content li+li:not(:where(.not-content *)),.sl-markdown-content dt+dt:not(:where(.not-content *)),.sl-markdown-content dt+dd:not(:where(.not-content *)),.sl-markdown-content dd+dd:not(:where(.not-content *)){margin-top:.25rem}.sl-markdown-content li:not(:where(.not-content *)){overflow-wrap:anywhere}.sl-markdown-content li>:last-child:not(li,ul,ol):not(a,strong,em,del,span,input,:where(.not-content *)){margin-bottom:1.25rem}.sl-markdown-content dt:not(:where(.not-content *)){font-weight:700}.sl-markdown-content dd:not(:where(.not-content *)){padding-inline-start:1rem}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6):not(:where(.not-content *)){color:var(--sl-color-white);line-height:var(--sl-line-height-headings);font-weight:600}.sl-markdown-content :is(img,picture,video,canvas,svg,iframe):not(:where(.not-content *)){display:block;max-width:100%;height:auto}.sl-markdown-content h1:not(:where(.not-content *)){font-size:var(--sl-text-h1)}.sl-markdown-content h2:not(:where(.not-content *)){font-size:var(--sl-text-h2)}.sl-markdown-content h3:not(:where(.not-content *)){font-size:var(--sl-text-h3)}.sl-markdown-content h4:not(:where(.not-content *)){font-size:var(--sl-text-h4)}.sl-markdown-content h5:not(:where(.not-content *)){font-size:var(--sl-text-h5)}.sl-markdown-content h6:not(:where(.not-content *)){font-size:var(--sl-text-h6)}.sl-markdown-content a:not(:where(.not-content *)){color:var(--sl-color-text-accent)}.sl-markdown-content a:hover:not(:where(.not-content *)){color:var(--sl-color-white)}.sl-markdown-content code:not(:where(.not-content *)){background-color:var(--sl-color-bg-inline-code);margin-block:-.125rem;padding:.125rem .375rem;font-size:var(--sl-text-code-sm)}.sl-markdown-content :is(h1,h2,h3,h4,h5,h6) code{font-size:inherit}.sl-markdown-content pre:not(:where(.not-content *)){border:1px solid var(--sl-color-gray-5);padding:.75rem 1rem;font-size:var(--sl-text-code);-moz-tab-size:2;-o-tab-size:2;tab-size:2}.sl-markdown-content pre code:not(:where(.not-content *)){all:unset;font-family:var(--__sl-font-mono)}.sl-markdown-content blockquote:not(:where(.not-content *)){border-inline-start:1px solid var(--sl-color-gray-5);padding-inline-start:1rem}.sl-markdown-content table:not(:where(.not-content *)){display:block;overflow:auto;border-spacing:0}.sl-markdown-content :is(th,td):not(:where(.not-content *)){border-bottom:1px solid var(--sl-color-gray-5);padding:.5rem 1rem;vertical-align:baseline}.sl-markdown-content :is(th:first-child,td:first-child):not(:where(.not-content *)){padding-inline-start:0}.sl-markdown-content :is(th:last-child,td:last-child):not(:where(.not-content *)){padding-inline-end:0}.sl-markdown-content th:not(:where(.not-content *)){color:var(--sl-color-white);font-weight:600}.sl-markdown-content th:not([align]):not(:where(.not-content *)){text-align:start}.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:var(--sl-color-gray-4)}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)){.sl-markdown-content .starlight-aside :is(th,td,hr,blockquote):not(:where(.not-content *)){border-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 30%,transparent)}}@supports (border-color: color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)){.sl-markdown-content .starlight-aside code:not(:where(.not-content *)){background-color:color-mix(in srgb,var(--sl-color-asides-text-accent) 12%,transparent)}}.sl-markdown-content hr:not(:where(.not-content *)){border:0;border-bottom:1px solid var(--sl-color-hairline)}.sl-markdown-content details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-gray-5);--sl-details-border-color--hover: var(--sl-color-text-accent);border-inline-start:2px solid var(--sl-details-border-color);padding-inline-start:1rem}.sl-markdown-content details:not([open]):hover:not(:where(.not-content *)),.sl-markdown-content details:has(>summary:hover):not(:where(.not-content *)){border-color:var(--sl-details-border-color--hover)}.sl-markdown-content summary:not(:where(.not-content *)){color:var(--sl-color-white);cursor:pointer;display:block;font-weight:600;margin-inline-start:-.5rem;padding-inline-start:.5rem}.sl-markdown-content details[open]>summary:not(:where(.not-content *)){margin-bottom:1rem}.sl-markdown-content summary:not(:where(.not-content *))::marker,.sl-markdown-content summary:not(:where(.not-content *))::-webkit-details-marker{display:none}.sl-markdown-content summary:not(:where(.not-content *)):before{--sl-details-marker-size: 1.25rem;background-color:currentColor;content:"";display:inline-block;height:var(--sl-details-marker-size);width:var(--sl-details-marker-size);margin-inline:calc((var(--sl-details-marker-size) / 4) * -1) .25rem;vertical-align:middle;-webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.8 11.3 10.6 7a1 1 0 1 0-1.4 1.5l3.5 3.5-3.5 3.5a1 1 0 0 0 0 1.4 1 1 0 0 0 .7.3 1 1 0 0 0 .7-.3l4.2-4.2a1 1 0 0 0 0-1.4Z'/%3E%3C/svg%3E%0A");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}@media (prefers-reduced-motion: no-preference){.sl-markdown-content summary:not(:where(.not-content *)):before{transition:transform .2s ease-in-out}}.sl-markdown-content details[open]>summary:not(:where(.not-content *)):before{transform:rotate(90deg)}[dir=rtl] .sl-markdown-content summary:not(:where(.not-content *)):before,.sl-markdown-content [dir=rtl] summary:not(:where(.not-content *)):before{transform:rotate(180deg)}.sl-markdown-content summary:not(:where(.not-content *)) p:only-child{display:inline}.sl-markdown-content .starlight-aside details:not(:where(.not-content *)){--sl-details-border-color: var(--sl-color-asides-border);--sl-details-border-color--hover: var(--sl-color-asides-text-accent)}[data-mobile-menu-expanded]{overflow:hidden}@media (min-width: 50rem){[data-mobile-menu-expanded]{overflow:auto}}button:where(.astro-jif73yzw){position:fixed;top:calc((var(--sl-nav-height) - var(--sl-menu-button-size)) / 2);inset-inline-end:var(--sl-nav-pad-x);z-index:var(--sl-z-index-navbar);border:0;border-radius:50%;width:var(--sl-menu-button-size);height:var(--sl-menu-button-size);padding:.5rem;background-color:var(--sl-color-white);color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);cursor:pointer}:where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw){background-color:var(--sl-color-gray-2);box-shadow:none}[data-theme=light] button:where(.astro-jif73yzw){background-color:var(--sl-color-black);color:var(--sl-color-white)}[data-theme=light] :where(.astro-jif73yzw)[aria-expanded=true] button:where(.astro-jif73yzw){background-color:var(--sl-color-gray-5)}.page:where(.astro-vrdttmbt){flex-direction:column;min-height:100vh}.header:where(.astro-vrdttmbt){z-index:var(--sl-z-index-navbar);position:fixed;inset-inline-start:0;inset-block-start:0;width:100%;height:var(--sl-nav-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:var(--sl-nav-pad-y) var(--sl-nav-pad-x);padding-inline-end:var(--sl-nav-pad-x);background-color:var(--sl-color-bg-nav)}[data-has-sidebar] .header:where(.astro-vrdttmbt){padding-inline-end:calc(var(--sl-nav-gap) + var(--sl-nav-pad-x) + var(--sl-menu-button-size))}.sidebar-pane:where(.astro-vrdttmbt){visibility:var(--sl-sidebar-visibility, hidden);position:fixed;z-index:var(--sl-z-index-menu);inset-block:var(--sl-nav-height) 0;inset-inline-start:0;width:100%;background-color:var(--sl-color-black);overflow-y:auto}[aria-expanded=true]~.sidebar-pane:where(.astro-vrdttmbt){--sl-sidebar-visibility: visible}.sidebar-content:where(.astro-vrdttmbt){height:100%;min-height:-moz-max-content;min-height:max-content;padding:1rem var(--sl-sidebar-pad-x) 0;flex-direction:column;gap:1rem}@media (min-width: 50rem){.sidebar-content:where(.astro-vrdttmbt):after{content:"";padding-bottom:1px}}.main-frame:where(.astro-vrdttmbt){padding-top:calc(var(--sl-nav-height) + var(--sl-mobile-toc-height));padding-inline-start:var(--sl-content-inline-start)}@media (min-width: 50rem){[data-has-sidebar] .header:where(.astro-vrdttmbt){padding-inline-end:var(--sl-nav-pad-x)}.sidebar-pane:where(.astro-vrdttmbt){--sl-sidebar-visibility: visible;width:var(--sl-sidebar-width);background-color:var(--sl-color-bg-sidebar);border-inline-end:1px solid var(--sl-color-hairline-shade)}}ul:where(.astro-g2bywc46){padding:0;list-style:none}a:where(.astro-g2bywc46){--pad-inline: .5rem;display:block;border-radius:.25rem;padding-block:.25rem;padding-inline:calc(1rem * var(--depth) + var(--pad-inline)) var(--pad-inline);line-height:1.25}a:where(.astro-g2bywc46)[aria-current=true]{color:var(--sl-color-text-accent)}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46){--pad-inline: 1rem;display:flex;justify-content:space-between;gap:var(--pad-inline);border-top:1px solid var(--sl-color-gray-6);border-radius:0;padding-block:.5rem;color:var(--sl-color-text);font-size:var(--sl-text-sm);text-decoration:none;outline-offset:var(--sl-outline-offset-inside)}.isMobile:where(.astro-g2bywc46):first-child>li:where(.astro-g2bywc46):first-child>a:where(.astro-g2bywc46){border-top:0}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true],.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:hover,.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:focus{color:var(--sl-color-white);background-color:unset}.isMobile:where(.astro-g2bywc46) a:where(.astro-g2bywc46)[aria-current=true]:after{content:"";width:1rem;background-color:var(--sl-color-text-accent);-webkit-mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);mask-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNCAxNCc+PHBhdGggZD0nTTEwLjkxNCA0LjIwNmEuNTgzLjU4MyAwIDAgMC0uODI4IDBMNS43NCA4LjU1NyAzLjkxNCA2LjcyNmEuNTk2LjU5NiAwIDAgMC0uODI4Ljg1N2wyLjI0IDIuMjRhLjU4My41ODMgMCAwIDAgLjgyOCAwbDQuNzYtNC43NmEuNTgzLjU4MyAwIDAgMCAwLS44NTdaJy8+PC9zdmc+Cg==);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;flex-shrink:0}nav:where(.astro-doynk5tl){position:fixed;z-index:var(--sl-z-index-toc);top:calc(var(--sl-nav-height) - 1px);inset-inline:0;border-top:1px solid var(--sl-color-gray-5);background-color:var(--sl-color-bg-nav)}@media (min-width: 50rem){nav:where(.astro-doynk5tl){inset-inline-start:var(--sl-content-inline-start, 0)}}summary:where(.astro-doynk5tl){gap:.5rem;align-items:center;height:var(--sl-mobile-toc-height);border-bottom:1px solid var(--sl-color-hairline-shade);padding:.5rem 1rem;font-size:var(--sl-text-xs);outline-offset:var(--sl-outline-offset-inside)}summary:where(.astro-doynk5tl)::marker,summary:where(.astro-doynk5tl)::-webkit-details-marker{display:none}.toggle:where(.astro-doynk5tl){flex-shrink:0;gap:1rem;align-items:center;justify-content:space-between;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding-block:.5rem;padding-inline-start:.75rem;padding-inline-end:.5rem;line-height:1;background-color:var(--sl-color-black);-webkit-user-select:none;-moz-user-select:none;user-select:none;cursor:pointer}details:where(.astro-doynk5tl)[open] .toggle:where(.astro-doynk5tl){color:var(--sl-color-white);border-color:var(--sl-color-accent)}details:where(.astro-doynk5tl) .toggle:where(.astro-doynk5tl):hover{color:var(--sl-color-white);border-color:var(--sl-color-gray-2)}[dir=rtl] .caret:where(.astro-doynk5tl){transform:rotate(180deg)}details:where(.astro-doynk5tl)[open] .caret:where(.astro-doynk5tl){transform:rotate(90deg)}.display-current:where(.astro-doynk5tl){white-space:nowrap;text-overflow:ellipsis;overflow:hidden;color:var(--sl-color-white)}.dropdown:where(.astro-doynk5tl){--border-top: 1px;margin-top:calc(-1 * var(--border-top));border:var(--border-top) solid var(--sl-color-gray-6);border-top-color:var(--sl-color-hairline-shade);max-height:calc(85vh - var(--sl-nav-height) - var(--sl-mobile-toc-height));overflow-y:auto;background-color:var(--sl-color-black);box-shadow:var(--sl-shadow-md);overscroll-behavior:contain}.right-sidebar-panel:where(.astro-pb3aqygn){padding:1rem var(--sl-sidebar-pad-x)}.sl-container:where(.astro-pb3aqygn){width:calc(var(--sl-sidebar-width) - 2 * var(--sl-sidebar-pad-x))}.right-sidebar-panel:where(.astro-pb3aqygn) h2{color:var(--sl-color-white);font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);margin-bottom:.5rem}.right-sidebar-panel:where(.astro-pb3aqygn) :where(a){display:block;font-size:var(--sl-text-xs);text-decoration:none;color:var(--sl-color-gray-3);overflow-wrap:anywhere}.right-sidebar-panel:where(.astro-pb3aqygn) :where(a):hover{color:var(--sl-color-white)}@media (min-width: 72rem){.sl-container:where(.astro-pb3aqygn){max-width:calc(((100vw - var(--sl-sidebar-width) - 2 * var(--sl-content-pad-x) - 2 * var(--sl-sidebar-pad-x)) * .25))}}h1:where(.astro-j6tvhyss){margin-top:1rem;font-size:var(--sl-text-h1);line-height:var(--sl-line-height-headings);font-weight:600;color:var(--sl-color-white)}.social-icons:where(.astro-wu23bvmt){margin-inline-end:auto;gap:1rem;align-items:center;padding-block:1rem}.social-icons:where(.astro-wu23bvmt):empty{display:none}.mobile-preferences:where(.astro-wu23bvmt){justify-content:space-between;flex-wrap:wrap;border-top:1px solid var(--sl-color-gray-6);-moz-column-gap:1rem;column-gap:1rem;padding:.5rem 0}sl-sidebar-state-persist:where(.astro-kku4brbg){display:contents}ul:where(.astro-3ii7xxms){--sl-sidebar-item-padding-inline: .5rem;list-style:none;padding:0}li:where(.astro-3ii7xxms){overflow-wrap:anywhere}ul:where(.astro-3ii7xxms) ul:where(.astro-3ii7xxms) li:where(.astro-3ii7xxms){margin-inline-start:var(--sl-sidebar-item-padding-inline);border-inline-start:1px solid var(--sl-color-hairline-light);padding-inline-start:var(--sl-sidebar-item-padding-inline)}.large:where(.astro-3ii7xxms){font-size:var(--sl-text-lg);font-weight:600;color:var(--sl-color-white)}.top-level:where(.astro-3ii7xxms)>li:where(.astro-3ii7xxms)+li:where(.astro-3ii7xxms){margin-top:.75rem}summary:where(.astro-3ii7xxms){display:flex;align-items:center;justify-content:space-between;padding:.2em var(--sl-sidebar-item-padding-inline);line-height:1.4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}summary:where(.astro-3ii7xxms)::marker,summary:where(.astro-3ii7xxms)::-webkit-details-marker{display:none}.caret:where(.astro-3ii7xxms){transition:transform .2s ease-in-out;flex-shrink:0}[dir=rtl] .caret:where(.astro-3ii7xxms){transform:rotate(180deg)}:where(.astro-3ii7xxms)[open]>summary:where(.astro-3ii7xxms) .caret:where(.astro-3ii7xxms){transform:rotate(90deg)}a:where(.astro-3ii7xxms){display:block;border-radius:.25rem;text-decoration:none;color:var(--sl-color-gray-2);padding:.3em var(--sl-sidebar-item-padding-inline);line-height:1.4}a:where(.astro-3ii7xxms):hover,a:where(.astro-3ii7xxms):focus{color:var(--sl-color-white)}:where(.astro-3ii7xxms)[aria-current=page],:where(.astro-3ii7xxms)[aria-current=page]:hover,:where(.astro-3ii7xxms)[aria-current=page]:focus{font-weight:600;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}a:where(.astro-3ii7xxms)>:where(.astro-3ii7xxms):not(:last-child),.group-label:where(.astro-3ii7xxms)>:where(.astro-3ii7xxms):not(:last-child){margin-inline-end:.25em}@media (min-width: 50rem){.top-level:where(.astro-3ii7xxms)>li:where(.astro-3ii7xxms)+li:where(.astro-3ii7xxms){margin-top:.5rem}.large:where(.astro-3ii7xxms){font-size:var(--sl-text-base)}a:where(.astro-3ii7xxms){font-size:var(--sl-text-sm)}}a:where(.astro-7q3lir66){clip:rect(0,0,0,0);position:fixed;top:.75rem;inset-inline-start:.75rem}a:where(.astro-7q3lir66):focus{clip:unset;z-index:var(--sl-z-index-skiplink);display:block;padding:.5rem 1rem;text-decoration:none;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent);box-shadow:var(--sl-shadow-lg)}.main-pane:where(.astro-67yu43on){isolation:isolate}@media (min-width: 72rem){.right-sidebar-container:where(.astro-67yu43on){order:2;position:relative;width:calc(var(--sl-sidebar-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}.right-sidebar:where(.astro-67yu43on){position:fixed;top:0;border-inline-start:1px solid var(--sl-color-gray-6);padding-top:var(--sl-nav-height);width:100%;height:100vh;overflow-y:auto;scrollbar-width:none}.main-pane:where(.astro-67yu43on){width:100%}[data-has-sidebar][data-has-toc] .main-pane:where(.astro-67yu43on){--sl-content-margin-inline: auto 0;order:1;width:calc(var(--sl-content-width) + (100% - var(--sl-content-width) - var(--sl-sidebar-width)) / 2)}}.starlight-aside{padding:1rem;border-inline-start:.25rem solid var(--sl-color-asides-border);color:var(--sl-color-white)}.starlight-aside--note{--sl-color-asides-text-accent: var(--sl-color-blue-high);--sl-color-asides-border: var(--sl-color-blue);background-color:var(--sl-color-blue-low)}.starlight-aside--tip{--sl-color-asides-text-accent: var(--sl-color-purple-high);--sl-color-asides-border: var(--sl-color-purple);background-color:var(--sl-color-purple-low)}.starlight-aside--caution{--sl-color-asides-text-accent: var(--sl-color-orange-high);--sl-color-asides-border: var(--sl-color-orange);background-color:var(--sl-color-orange-low)}.starlight-aside--danger{--sl-color-asides-text-accent: var(--sl-color-red-high);--sl-color-asides-border: var(--sl-color-red);background-color:var(--sl-color-red-low)}.starlight-aside__title{display:flex;gap:.5rem;align-items:center;font-size:var(--sl-text-h5);font-weight:600;line-height:var(--sl-line-height-headings);color:var(--sl-color-asides-text-accent)}.starlight-aside__icon{font-size:1.333em;width:1em;height:1em}.starlight-aside__title+.starlight-aside__content{margin-top:.5rem}.starlight-aside__content a{color:var(--sl-color-asides-text-accent)}@font-face{font-family:Space Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/space-mono-vietnamese-400-normal.BheU2kqM.woff2) format("woff2"),url(/docs/_astro/space-mono-vietnamese-400-normal.DhEK1QBQ.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Space Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/space-mono-latin-ext-400-normal.Bp3uBQji.woff2) format("woff2"),url(/docs/_astro/space-mono-latin-ext-400-normal.dAQ_Ruki.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Space Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/space-mono-latin-400-normal.DqLRVAG3.woff2) format("woff2"),url(/docs/_astro/space-mono-latin-400-normal.C13IqrZg.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Rubik Mono One;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/rubik-mono-one-cyrillic-400-normal.BOcI7D0U.woff2) format("woff2"),url(/docs/_astro/rubik-mono-one-cyrillic-400-normal.DJOtYBN1.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Rubik Mono One;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/rubik-mono-one-latin-ext-400-normal.BsiHVyE2.woff2) format("woff2"),url(/docs/_astro/rubik-mono-one-latin-ext-400-normal.plJcw_cN.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Rubik Mono One;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/rubik-mono-one-latin-400-normal.CNmoPlom.woff2) format("woff2"),url(/docs/_astro/rubik-mono-one-latin-400-normal.B1Gf3ixn.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Lexend;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/lexend-vietnamese-400-normal.DoLa7jNB.woff2) format("woff2"),url(/docs/_astro/lexend-vietnamese-400-normal.BAxGSwny.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Lexend;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/lexend-latin-ext-400-normal.BlThJp1_.woff2) format("woff2"),url(/docs/_astro/lexend-latin-ext-400-normal.B0aX7OG-.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Lexend;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/lexend-latin-400-normal.LvJAK7uG.woff2) format("woff2"),url(/docs/_astro/lexend-latin-400-normal.CPgf14r2.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fugaz One;font-style:normal;font-display:swap;font-weight:400;src:url(/docs/_astro/fugaz-one-latin-400-normal.5IrmUd-K.woff2) format("woff2"),url(/docs/_astro/fugaz-one-latin-400-normal.T0zCngim.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{border-width:0;border-style:solid;border-color:#f3ecea}:before,:after{--tw-content: }html,:host{font-family:Lexend,sans-serif}code,kbd,samp,pre{font-family:Space Mono,monospace}:root{--sl-font: Lexend, sans-serif;--sl-font-mono: Space Mono, monospace;--sl-color-white: #fff;--sl-color-gray-1: #f3ecea;--sl-color-gray-2: #c8c0be;--sl-color-gray-3: #978784;--sl-color-gray-4: #4b5563;--sl-color-gray-5: #423432;--sl-color-gray-6: #302321;--sl-color-black: #1d1715;--sl-color-accent-low: #460b05;--sl-color-accent: #c90e00;--sl-color-accent-high: #feb3a6}:root[data-theme=light]{--sl-color-white: #1d1715;--sl-color-gray-1: #302321;--sl-color-gray-2: #423432;--sl-color-gray-3: #635451;--sl-color-gray-4: #978784;--sl-color-gray-5: #c8c0be;--sl-color-gray-6: #f3ecea;--sl-color-gray-7: #f9f5f5;--sl-color-black: #fff;--sl-color-accent-low: #feb3a6;--sl-color-accent: #c90e00;--sl-color-accent-high: #640300}.visible{visibility:visible}.fixed{position:fixed}.relative{position:relative}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.table{display:table}.hidden{display:none}.align-baseline{vertical-align:baseline}.font-sans{font-family:Lexend,sans-serif}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-slate-800{--tw-text-opacity: 1;color:rgb(30 41 59 / var(--tw-text-opacity, 1))}.no-underline{text-decoration-line:none}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.invert{--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}a{font-family:Space Mono,monospace}h1{font-family:Rubik Mono One,sans-serif}.dark\:text-slate-400:is([data-theme=dark] *){--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}html:not([data-has-toc]){--sl-mobile-toc-height: 0rem}html:not([data-has-sidebar]){--sl-content-width: 67.5rem}html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height) + var(--sl-mobile-toc-height))}main:where(.astro-bguv2lll){padding-bottom:3vh}@media (min-width: 50em){:where(.astro-bguv2lll)[data-has-sidebar]{--sl-content-inline-start: var(--sl-sidebar-width)}}@media (min-width: 72em){html{scroll-padding-top:calc(1.5rem + var(--sl-nav-height))}} diff --git a/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-400-normal.CPgf14r2.woff b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-400-normal.CPgf14r2.woff new file mode 100644 index 0000000..313b16d Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-400-normal.CPgf14r2.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-400-normal.LvJAK7uG.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-400-normal.LvJAK7uG.woff2 new file mode 100644 index 0000000..e481aa1 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-400-normal.LvJAK7uG.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-ext-400-normal.B0aX7OG-.woff b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-ext-400-normal.B0aX7OG-.woff new file mode 100644 index 0000000..545fba9 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-ext-400-normal.B0aX7OG-.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-ext-400-normal.BlThJp1_.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-ext-400-normal.BlThJp1_.woff2 new file mode 100644 index 0000000..ab68fa5 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/lexend-latin-ext-400-normal.BlThJp1_.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/lexend-vietnamese-400-normal.BAxGSwny.woff b/shepherd/blueprints/staticroutes/docs/_astro/lexend-vietnamese-400-normal.BAxGSwny.woff new file mode 100644 index 0000000..a571a7a Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/lexend-vietnamese-400-normal.BAxGSwny.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/lexend-vietnamese-400-normal.DoLa7jNB.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/lexend-vietnamese-400-normal.DoLa7jNB.woff2 new file mode 100644 index 0000000..5be08f3 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/lexend-vietnamese-400-normal.DoLa7jNB.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/page.7qqag-5g.js b/shepherd/blueprints/staticroutes/docs/_astro/page.7qqag-5g.js new file mode 100644 index 0000000..12aa5b5 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/page.7qqag-5g.js @@ -0,0 +1 @@ +const d=new Set,c=new WeakSet;let f=!0,h,l=!1;function v(e){l||(l=!0,f??=!1,h??="hover",g(),p(),w(),L())}function g(){for(const e of["touchstart","mousedown"])document.body.addEventListener(e,t=>{i(t.target,"tap")&&s(t.target.href,{ignoreSlowConnection:!0})},{passive:!0})}function p(){let e;document.body.addEventListener("focusin",n=>{i(n.target,"hover")&&t(n)},{passive:!0}),document.body.addEventListener("focusout",o,{passive:!0}),u(()=>{for(const n of document.getElementsByTagName("a"))c.has(n)||i(n,"hover")&&(c.add(n),n.addEventListener("mouseenter",t,{passive:!0}),n.addEventListener("mouseleave",o,{passive:!0}))});function t(n){const r=n.target.href;e&&clearTimeout(e),e=setTimeout(()=>{s(r)},80)}function o(){e&&(clearTimeout(e),e=0)}}function w(){let e;u(()=>{for(const t of document.getElementsByTagName("a"))c.has(t)||i(t,"viewport")&&(c.add(t),e??=y(),e.observe(t))})}function y(){const e=new WeakMap;return new IntersectionObserver((t,o)=>{for(const n of t){const r=n.target,a=e.get(r);n.isIntersecting?(a&&clearTimeout(a),e.set(r,setTimeout(()=>{o.unobserve(r),e.delete(r),s(r.href)},300))):a&&(clearTimeout(a),e.delete(r))}})}function L(){u(()=>{for(const e of document.getElementsByTagName("a"))i(e,"load")&&s(e.href)})}function s(e,t){e=e.replace(/#.*/,"");const o=t?.ignoreSlowConnection??!1;if(S(e,o))if(d.add(e),document.createElement("link").relList?.supports?.("prefetch")&&t?.with!=="fetch"){const n=document.createElement("link");n.rel="prefetch",n.setAttribute("href",e),document.head.append(n)}else fetch(e,{priority:"low"})}function S(e,t){if(!navigator.onLine||!t&&m())return!1;try{const o=new URL(e,location.href);return location.origin===o.origin&&(location.pathname!==o.pathname||location.search!==o.search)&&!d.has(e)}catch{}return!1}function i(e,t){if(e?.tagName!=="A")return!1;const o=e.dataset.astroPrefetch;return o==="false"?!1:t==="tap"&&(o!=null||f)&&m()?!0:o==null&&f||o===""?t===h:o===t}function m(){if("connection"in navigator){const e=navigator.connection;return e.saveData||/2g/.test(e.effectiveType)}return!1}function u(e){e();let t=!1;document.addEventListener("astro:page-load",()=>{if(!t){t=!0;return}e()})}v(); diff --git a/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-cyrillic-400-normal.BOcI7D0U.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-cyrillic-400-normal.BOcI7D0U.woff2 new file mode 100644 index 0000000..69fc4b3 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-cyrillic-400-normal.BOcI7D0U.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-cyrillic-400-normal.DJOtYBN1.woff b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-cyrillic-400-normal.DJOtYBN1.woff new file mode 100644 index 0000000..ed7a565 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-cyrillic-400-normal.DJOtYBN1.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-400-normal.B1Gf3ixn.woff b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-400-normal.B1Gf3ixn.woff new file mode 100644 index 0000000..7e4f104 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-400-normal.B1Gf3ixn.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-400-normal.CNmoPlom.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-400-normal.CNmoPlom.woff2 new file mode 100644 index 0000000..7b18f69 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-400-normal.CNmoPlom.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-ext-400-normal.BsiHVyE2.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-ext-400-normal.BsiHVyE2.woff2 new file mode 100644 index 0000000..82dd74b Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-ext-400-normal.BsiHVyE2.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-ext-400-normal.plJcw_cN.woff b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-ext-400-normal.plJcw_cN.woff new file mode 100644 index 0000000..1ecf295 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/rubik-mono-one-latin-ext-400-normal.plJcw_cN.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-400-normal.C13IqrZg.woff b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-400-normal.C13IqrZg.woff new file mode 100644 index 0000000..3eb7918 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-400-normal.C13IqrZg.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-400-normal.DqLRVAG3.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-400-normal.DqLRVAG3.woff2 new file mode 100644 index 0000000..cd43ccd Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-400-normal.DqLRVAG3.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-ext-400-normal.Bp3uBQji.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-ext-400-normal.Bp3uBQji.woff2 new file mode 100644 index 0000000..f7e23a2 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-ext-400-normal.Bp3uBQji.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-ext-400-normal.dAQ_Ruki.woff b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-ext-400-normal.dAQ_Ruki.woff new file mode 100644 index 0000000..a0e5d05 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-latin-ext-400-normal.dAQ_Ruki.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/space-mono-vietnamese-400-normal.BheU2kqM.woff2 b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-vietnamese-400-normal.BheU2kqM.woff2 new file mode 100644 index 0000000..17cbeee Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-vietnamese-400-normal.BheU2kqM.woff2 differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/space-mono-vietnamese-400-normal.DhEK1QBQ.woff b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-vietnamese-400-normal.DhEK1QBQ.woff new file mode 100644 index 0000000..966b480 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/_astro/space-mono-vietnamese-400-normal.DhEK1QBQ.woff differ diff --git a/shepherd/blueprints/staticroutes/docs/_astro/ui-core.hjFf04rQ.js b/shepherd/blueprints/staticroutes/docs/_astro/ui-core.hjFf04rQ.js new file mode 100644 index 0000000..f512535 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/_astro/ui-core.hjFf04rQ.js @@ -0,0 +1,2 @@ +import{_ as is}from"./hoisted.C4q4f3TC.js";import"./Tabs.astro_astro_type_script_index_0_lang.3nBd5krW.js";var os=Object.defineProperty,F=(e,t)=>{for(var u in t)os(e,u,{get:t[u],enumerable:!0})};function P(){}function du(e){return e()}function ye(){return Object.create(null)}function W(e){e.forEach(du)}function Cu(e){return typeof e=="function"}function fe(e,t){return e!=e?t==t:e!==t||e&&typeof e=="object"||typeof e=="function"}var oe;function ce(e,t){return oe||(oe=document.createElement("a")),oe.href=t,e===oe.href}function _s(e){return Object.keys(e).length===0}function B(e,t){e.appendChild(t)}function T(e,t,u){e.insertBefore(t,u||null)}function p(e){e.parentNode&&e.parentNode.removeChild(e)}function ie(e,t){for(let u=0;ue.removeEventListener(t,u,r)}function g(e,t,u){u==null?e.removeAttribute(t):e.getAttribute(t)!==u&&e.setAttribute(t,u)}function fs(e){return Array.from(e.childNodes)}function j(e,t){t=""+t,e.data!==t&&(e.data=t)}function ze(e,t){e.value=t??""}function K(e,t,u){e.classList[u?"add":"remove"](t)}var Es=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,u=null){this.e||(this.is_svg?this.e=cs(t.nodeName):this.e=v(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(u)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;te.indexOf(r)===-1?t.push(r):u.push(r)),u.forEach(r=>r()),$=t}var _e=new Set,J;function le(){J={r:0,c:[],p:J}}function ne(){J.r||W(J.c),J=J.p}function z(e,t){e&&e.i&&(_e.delete(e),e.i(t))}function U(e,t,u,r){if(e&&e.o){if(_e.has(e))return;_e.add(e),J.c.push(()=>{_e.delete(e),r&&(u&&e.d(1),r())}),e.o(t)}else r&&r()}function Bs(e,t){U(e,1,1,()=>{t.delete(e.key)})}function vs(e,t,u,r,s,a,l,n,i,h,_,d){let C=e.length,f=a.length,c=C;const o={};for(;c--;)o[e[c].key]=c;const E=[],R=new Map,A=new Map,k=[];for(c=f;c--;){const D=d(s,a,c),S=u(D);let w=l.get(S);w?k.push(()=>w.p(D,t)):(w=h(S,D),w.c()),R.set(S,E[c]=w),S in o&&A.set(S,Math.abs(c-o[S]))}const y=new Set,q=new Set;function L(D){z(D,1),D.m(n,_),l.set(D.key,D),_=D.first,f--}for(;C&&f;){const D=E[f-1],S=e[C-1],w=D.key,x=S.key;D===S?(_=D.first,C--,f--):R.has(x)?!l.has(w)||y.has(w)?L(D):q.has(x)?C--:A.get(w)>A.get(x)?(q.add(w),L(D)):(y.add(x),C--):(i(S,l),C--)}for(;C--;){const D=e[C];R.has(D.key)||i(D,l)}for(;f;)L(E[f-1]);return W(k),E}function ps(e,t,u){const r=e.$$.props[t];r!==void 0&&(e.$$.bound[r]=u,u(e.$$.ctx[r]))}function ke(e){e&&e.c()}function Ee(e,t,u,r){const{fragment:s,after_update:a}=e.$$;s&&s.m(t,u),r||Te(()=>{const l=e.$$.on_mount.map(du).filter(Cu);e.$$.on_destroy?e.$$.on_destroy.push(...l):W(l),e.$$.on_mount=[]}),a.forEach(Te)}function he(e,t){const u=e.$$;u.fragment!==null&&(Rs(u.after_update),W(u.on_destroy),u.fragment&&u.fragment.d(t),u.on_destroy=u.fragment=null,u.ctx=[])}function Ts(e,t){e.$$.dirty[0]===-1&&(X.push(e),ms(),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<{const c=f.length?f[0]:C;return h.ctx&&s(h.ctx[d],h.ctx[d]=c)&&(!h.skip_bound&&h.bound[d]&&h.bound[d](c),_&&Ts(e,d)),C}):[],h.update(),_=!0,W(h.before_update),h.fragment=r?r(h.ctx):!1,t.target){if(t.hydrate){const d=fs(t.target);h.fragment&&h.fragment.l(d),d.forEach(p)}else h.fragment&&h.fragment.c();t.intro&&z(e.$$.fragment),Ee(e,t.target,t.anchor,t.customElement),gu()}re(i)}var Ce=class{$destroy(){he(this,1),this.$destroy=P}$on(e,t){if(!Cu(t))return P;const u=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return u.push(t),()=>{const r=u.indexOf(t);r!==-1&&u.splice(r,1)}}$set(e){this.$$set&&!_s(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function O(e){const t=typeof e=="string"?e.charCodeAt(0):e;return t>=97&&t<=122||t>=65&&t<=90}function Q(e){const t=typeof e=="string"?e.charCodeAt(0):e;return t>=48&&t<=57}function V(e){return O(e)||Q(e)}var Fs=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"],je={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"},ks={}.hasOwnProperty;function Au(e,t={}){const u=Oe(),r=String(e),s=r.toLowerCase();let a=0;if(e==null)throw new Error("Expected string, got `"+e+"`");if(ks.call(je,s)){const n=je[s];return(t.normalize===void 0||t.normalize===null||t.normalize)&&typeof n=="string"?Au(n):(u[Fs.includes(s)?"regular":"irregular"]=r,u)}for(;O(s.charCodeAt(a))&&a<9;)a++;if(a>1&&a<9){if(u.language=r.slice(0,a),a<4){let n=0;for(;s.charCodeAt(a)===45&&O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&O(s.charCodeAt(a+3))&&!O(s.charCodeAt(a+4));){if(n>2)return l(a,3,"Too many extended language subtags, expected at most 3 subtags");u.extendedLanguageSubtags.push(r.slice(a+1,a+4)),a+=4,n++}}for(s.charCodeAt(a)===45&&O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&O(s.charCodeAt(a+3))&&O(s.charCodeAt(a+4))&&!O(s.charCodeAt(a+5))&&(u.script=r.slice(a+1,a+5),a+=5),s.charCodeAt(a)===45&&(O(s.charCodeAt(a+1))&&O(s.charCodeAt(a+2))&&!O(s.charCodeAt(a+3))?(u.region=r.slice(a+1,a+3),a+=3):Q(s.charCodeAt(a+1))&&Q(s.charCodeAt(a+2))&&Q(s.charCodeAt(a+3))&&!Q(s.charCodeAt(a+4))&&(u.region=r.slice(a+1,a+4),a+=4));s.charCodeAt(a)===45;){const n=a+1;let i=n;for(;V(s.charCodeAt(i));){if(i-n>7)return l(i,1,"Too long variant, expected at most 8 characters");i++}if(i-n>4||i-n>3&&Q(s.charCodeAt(n)))u.variants.push(r.slice(n,i)),a=i;else break}for(;s.charCodeAt(a)===45&&!(s.charCodeAt(a+1)===120||!V(s.charCodeAt(a+1))||s.charCodeAt(a+2)!==45||!V(s.charCodeAt(a+3)));){let n=a+2,i=0;for(;s.charCodeAt(n)===45&&V(s.charCodeAt(n+1))&&V(s.charCodeAt(n+2));){const h=n+1;for(n=h+2,i++;V(s.charCodeAt(n));){if(n-h>7)return l(n,2,"Too long extension, expected at most 8 characters");n++}}if(!i)return l(n,4,"Empty extension, extensions must have at least 2 characters of content");u.extensions.push({singleton:r.charAt(a+1),extensions:r.slice(a+3,n).split("-")}),a=n}}else a=0;if(a===0&&s.charCodeAt(a)===120||s.charCodeAt(a)===45&&s.charCodeAt(a+1)===120){a=a?a+2:1;let n=a;for(;s.charCodeAt(n)===45&&V(s.charCodeAt(n+1));){const i=a+1;for(n=i;V(s.charCodeAt(n));){if(n-i>7)return l(n,5,"Too long private-use area, expected at most 8 characters");n++}u.privateuse.push(r.slice(a+1,n)),a=n}}if(a!==r.length)return l(a,6,"Found superfluous content after tag");return u;function l(n,i,h){return t.warning&&t.warning(h,i,n),t.forgiving?u:Oe()}}function Oe(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function Ue(e,t,u){const r=e.slice();return r[8]=t[u][0],r[9]=t[u][1],r}function Ds(e){let t,u,r,s,a,l=e[0]&&Ie();return{c(){l&&l.c(),t=b(),u=v("div"),r=v("p"),r.textContent=`${e[3](30)}`,s=b(),a=v("p"),a.textContent=`${e[3](40)}`,g(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),g(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),g(u,"class","pagefind-ui__result-inner svelte-j9e30")},m(n,i){l&&l.m(n,i),T(n,t,i),T(n,u,i),B(u,r),B(u,s),B(u,a)},p(n,i){n[0]?l||(l=Ie(),l.c(),l.m(t.parentNode,t)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&p(t),n&&p(u)}}}function bs(e){let t,u,r,s,a=e[1].meta?.title+"",l,n,i,h,_=e[1].excerpt+"",d,C=e[0]&&Pe(e),f=e[2].length&&xe(e);return{c(){C&&C.c(),t=b(),u=v("div"),r=v("p"),s=v("a"),l=M(a),i=b(),h=v("p"),d=b(),f&&f.c(),g(s,"class","pagefind-ui__result-link svelte-j9e30"),g(s,"href",n=e[1].meta?.url||e[1].url),g(r,"class","pagefind-ui__result-title svelte-j9e30"),g(h,"class","pagefind-ui__result-excerpt svelte-j9e30"),g(u,"class","pagefind-ui__result-inner svelte-j9e30")},m(c,o){C&&C.m(c,o),T(c,t,o),T(c,u,o),B(u,r),B(r,s),B(s,l),B(u,i),B(u,h),h.innerHTML=_,B(u,d),f&&f.m(u,null)},p(c,o){c[0]?C?C.p(c,o):(C=Pe(c),C.c(),C.m(t.parentNode,t)):C&&(C.d(1),C=null),o&2&&a!==(a=c[1].meta?.title+"")&&j(l,a),o&2&&n!==(n=c[1].meta?.url||c[1].url)&&g(s,"href",n),o&2&&_!==(_=c[1].excerpt+"")&&(h.innerHTML=_),c[2].length?f?f.p(c,o):(f=xe(c),f.c(),f.m(u,null)):f&&(f.d(1),f=null)},d(c){C&&C.d(c),c&&p(t),c&&p(u),f&&f.d()}}}function Ie(e){let t;return{c(){t=v("div"),g(t,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(u,r){T(u,t,r)},d(u){u&&p(t)}}}function Pe(e){let t,u=e[1].meta.image&&Le(e);return{c(){t=v("div"),u&&u.c(),g(t,"class","pagefind-ui__result-thumb svelte-j9e30")},m(r,s){T(r,t,s),u&&u.m(t,null)},p(r,s){r[1].meta.image?u?u.p(r,s):(u=Le(r),u.c(),u.m(t,null)):u&&(u.d(1),u=null)},d(r){r&&p(t),u&&u.d()}}}function Le(e){let t,u,r;return{c(){t=v("img"),g(t,"class","pagefind-ui__result-image svelte-j9e30"),ce(t.src,u=e[1].meta?.image)||g(t,"src",u),g(t,"alt",r=e[1].meta?.image_alt||e[1].meta?.title)},m(s,a){T(s,t,a)},p(s,a){a&2&&!ce(t.src,u=s[1].meta?.image)&&g(t,"src",u),a&2&&r!==(r=s[1].meta?.image_alt||s[1].meta?.title)&&g(t,"alt",r)},d(s){s&&p(t)}}}function xe(e){let t,u=e[2],r=[];for(let s=0;se.toLocaleUpperCase();function Ss(e,t,u){let{show_images:r=!0}=t,{process_result:s=null}=t,{result:a={data:async()=>{}}}=t;const l=["title","image","image_alt","url"];let n,i=[];const h=async d=>{u(1,n=await d.data()),u(1,n=s?.(n)??n),u(2,i=Object.entries(n.meta).filter(([C])=>!l.includes(C)))},_=(d=30)=>". ".repeat(Math.floor(10+Math.random()*d));return e.$$set=d=>{"show_images"in d&&u(0,r=d.show_images),"process_result"in d&&u(4,s=d.process_result),"result"in d&&u(5,a=d.result)},e.$$.update=()=>{e.$$.dirty&32&&h(a)},[r,n,i,_,s,a]}var Hs=class extends Ce{constructor(e){super(),de(this,e,Ss,Ms,fe,{show_images:0,process_result:4,result:5})}},ws=Hs;function Ke(e,t,u){const r=e.slice();return r[11]=t[u][0],r[12]=t[u][1],r}function Ge(e,t,u){const r=e.slice();return r[15]=t[u],r}function Ns(e){let t,u,r,s,a,l=e[0]&&Je();return{c(){l&&l.c(),t=b(),u=v("div"),r=v("p"),r.textContent=`${e[5](30)}`,s=b(),a=v("p"),a.textContent=`${e[5](40)}`,g(r,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),g(a,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),g(u,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(n,i){l&&l.m(n,i),T(n,t,i),T(n,u,i),B(u,r),B(u,s),B(u,a)},p(n,i){n[0]?l||(l=Je(),l.c(),l.m(t.parentNode,t)):l&&(l.d(1),l=null)},d(n){l&&l.d(n),n&&p(t),n&&p(u)}}}function ys(e){let t,u,r,s,a=e[1].meta?.title+"",l,n,i,h,_,d=e[0]&&We(e),C=e[4]&&Ye(e),f=e[3],c=[];for(let E=0;Ee.toLocaleUpperCase();function js(e,t,u){let{show_images:r=!0}=t,{process_result:s=null}=t,{result:a={data:async()=>{}}}=t;const l=["title","image","image_alt","url"];let n,i=[],h=[],_=!1;const d=(c,o)=>{if(c.length<=o)return c;const E=[...c].sort((R,A)=>A.locations.length-R.locations.length).slice(0,3).map(R=>R.url);return c.filter(R=>E.includes(R.url))},C=async c=>{u(1,n=await c.data()),u(1,n=s?.(n)??n),u(2,i=Object.entries(n.meta).filter(([o])=>!l.includes(o))),Array.isArray(n.sub_results)&&(u(4,_=n.sub_results?.[0]?.url===(n.meta?.url||n.url)),_?u(3,h=d(n.sub_results.slice(1),3)):u(3,h=d([...n.sub_results],3)))},f=(c=30)=>". ".repeat(Math.floor(10+Math.random()*c));return e.$$set=c=>{"show_images"in c&&u(0,r=c.show_images),"process_result"in c&&u(6,s=c.process_result),"result"in c&&u(7,a=c.result)},e.$$.update=()=>{e.$$.dirty&128&&C(a)},[r,n,i,h,_,f,s,a]}var Os=class extends Ce{constructor(e){super(),de(this,e,js,zs,fe,{show_images:0,process_result:6,result:7})}},Us=Os;function uu(e,t,u){const r=e.slice();return r[10]=t[u][0],r[11]=t[u][1],r[12]=t,r[13]=u,r}function tu(e,t,u){const r=e.slice();return r[14]=t[u][0],r[15]=t[u][1],r[16]=t,r[17]=u,r}function ru(e){let t,u,r=e[4]("filters_label",e[5],e[6])+"",s,a,l=Object.entries(e[1]),n=[];for(let i=0;ie.toLocaleUpperCase(),iu=e=>e.toLowerCase();function Ps(e,t,u){let{available_filters:r=null}=t,{show_empty_filters:s=!0}=t,{open_filters:a=[]}=t,{translate:l=()=>""}=t,{automatic_translations:n={}}=t,{translations:i={}}=t,{selected_filters:h={}}=t,_=!1,d=!1;function C(f,c){h[`${f}:${c}`]=this.checked,u(0,h)}return e.$$set=f=>{"available_filters"in f&&u(1,r=f.available_filters),"show_empty_filters"in f&&u(2,s=f.show_empty_filters),"open_filters"in f&&u(3,a=f.open_filters),"translate"in f&&u(4,l=f.translate),"automatic_translations"in f&&u(5,n=f.automatic_translations),"translations"in f&&u(6,i=f.translations),"selected_filters"in f&&u(0,h=f.selected_filters)},e.$$.update=()=>{if(e.$$.dirty&258&&r&&!_){u(8,_=!0);let f=Object.entries(r||{});f.length===1&&Object.entries(f[0][1])?.length<=6&&u(7,d=!0)}},[h,r,s,a,l,n,i,d,_,C]}var Ls=class extends Ce{constructor(e){super(),de(this,e,Ps,Is,fe,{available_filters:1,show_empty_filters:2,open_filters:3,translate:4,automatic_translations:5,translations:6,selected_filters:0})}},xs=Ls,Ru={};F(Ru,{comments:()=>vu,default:()=>qs,direction:()=>pu,strings:()=>Tu,thanks_to:()=>Bu});var Bu="Jan Claasen ",vu="",pu="ltr",Tu={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},qs={thanks_to:Bu,comments:vu,direction:pu,strings:Tu},Fu={};F(Fu,{comments:()=>Du,default:()=>Vs,direction:()=>bu,strings:()=>Mu,thanks_to:()=>ku});var ku="Jermanuts",Du="",bu="rtl",Mu={placeholder:"بحث",clear_search:"امسح",load_more:"حمِّل المزيد من النتائج",search_label:"ابحث في هذا الموقع",filters_label:"تصفيات",zero_results:"لا توجد نتائج ل [SEARCH_TERM]",many_results:"[COUNT] نتائج ل [SEARCH_TERM]",one_result:"[COUNT] نتيجة ل [SEARCH_TERM]",alt_search:"لا توجد نتائج ل [SEARCH_TERM]. يعرض النتائج ل [DIFFERENT_TERM] بدلاً من ذلك",search_suggestion:"لا توجد نتائج ل [SEARCH_TERM]. جرب أحد عمليات البحث التالية:",searching:"يبحث عن [SEARCH_TERM]..."},Vs={thanks_to:ku,comments:Du,direction:bu,strings:Mu},Su={};F(Su,{comments:()=>wu,default:()=>Ks,direction:()=>Nu,strings:()=>yu,thanks_to:()=>Hu});var Hu="Maruf Alom ",wu="",Nu="ltr",yu={placeholder:"অনুসন্ধান করুন",clear_search:"মুছে ফেলুন",load_more:"আরো ফলাফল দেখুন",search_label:"এই ওয়েবসাইটে অনুসন্ধান করুন",filters_label:"ফিল্টার",zero_results:"[SEARCH_TERM] এর জন্য কিছু খুঁজে পাওয়া যায়নি",many_results:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",one_result:"[COUNT]-টি ফলাফল পাওয়া গিয়েছে [SEARCH_TERM] এর জন্য",alt_search:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর জন্য. পরিবর্তে [DIFFERENT_TERM] এর জন্য দেখানো হচ্ছে",search_suggestion:"কোন কিছু খুঁজে পাওয়া যায়নি [SEARCH_TERM] এর বিষয়ে. নিন্মের বিষয়বস্তু খুঁজে দেখুন:",searching:"অনুসন্ধান চলছে [SEARCH_TERM]..."},Ks={thanks_to:Hu,comments:wu,direction:Nu,strings:yu},zu={};F(zu,{comments:()=>Ou,default:()=>Gs,direction:()=>Uu,strings:()=>Iu,thanks_to:()=>ju});var ju="Pablo Villaverde ",Ou="",Uu="ltr",Iu={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure més resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques següents:",searching:"Cercant [SEARCH_TERM]..."},Gs={thanks_to:ju,comments:Ou,direction:Uu,strings:Iu},Pu={};F(Pu,{comments:()=>xu,default:()=>Js,direction:()=>qu,strings:()=>Vu,thanks_to:()=>Lu});var Lu="Dalibor Hon ",xu="",qu="ltr",Vu={placeholder:"Hledat",clear_search:"Smazat",load_more:"Načíst další výsledky",search_label:"Prohledat tuto stránku",filters_label:"Filtry",zero_results:"Žádné výsledky pro [SEARCH_TERM]",many_results:"[COUNT] výsledků pro [SEARCH_TERM]",one_result:"[COUNT] výsledek pro [SEARCH_TERM]",alt_search:"Žádné výsledky pro [SEARCH_TERM]. Zobrazují se výsledky pro [DIFFERENT_TERM]",search_suggestion:"Žádné výsledky pro [SEARCH_TERM]. Související výsledky hledání:",searching:"Hledám [SEARCH_TERM]..."},Js={thanks_to:Lu,comments:xu,direction:qu,strings:Vu},Ku={};F(Ku,{comments:()=>Ju,default:()=>Ws,direction:()=>Wu,strings:()=>Zu,thanks_to:()=>Gu});var Gu="Jonas Smedegaard ",Ju="",Wu="ltr",Zu={placeholder:"Søg",clear_search:"Nulstil",load_more:"Indlæs flere resultater",search_label:"Søg på dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv et af disse søgeord i stedet:",searching:"Søger efter [SEARCH_TERM]..."},Ws={thanks_to:Gu,comments:Ju,direction:Wu,strings:Zu},Yu={};F(Yu,{comments:()=>Qu,default:()=>Zs,direction:()=>$u,strings:()=>et,thanks_to:()=>Xu});var Xu="Jan Claasen ",Qu="",$u="ltr",et={placeholder:"Suche",clear_search:"Löschen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse für [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse für [SEARCH_TERM]",one_result:"[COUNT] Ergebnis für [SEARCH_TERM]",alt_search:"Keine Ergebnisse für [SEARCH_TERM]. Stattdessen werden Ergebnisse für [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse für [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche für [SEARCH_TERM]"},Zs={thanks_to:Xu,comments:Qu,direction:$u,strings:et},ut={};F(ut,{comments:()=>rt,default:()=>Ys,direction:()=>st,strings:()=>at,thanks_to:()=>tt});var tt="Liam Bigelow ",rt="",st="ltr",at={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},Ys={thanks_to:tt,comments:rt,direction:st,strings:at},lt={};F(lt,{comments:()=>it,default:()=>Xs,direction:()=>ot,strings:()=>_t,thanks_to:()=>nt});var nt="Pablo Villaverde ",it="",ot="ltr",_t={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver más resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes búsquedas:",searching:"Buscando [SEARCH_TERM]..."},Xs={thanks_to:nt,comments:it,direction:ot,strings:_t},ct={};F(ct,{comments:()=>Et,default:()=>Qs,direction:()=>ht,strings:()=>dt,thanks_to:()=>ft});var ft="Ali Khaleqi Yekta ",Et="",ht="rtl",dt={placeholder:"جستجو",clear_search:"پاکسازی",load_more:"بارگذاری نتایج بیشتر",search_label:"جستجو در سایت",filters_label:"فیلترها",zero_results:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد",many_results:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",one_result:"[COUNT] نتیجه برای [SEARCH_TERM] یافت شد",alt_search:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد. در عوض نتایج برای [DIFFERENT_TERM] نمایش داده می‌شود",search_suggestion:"نتیجه‌ای برای [SEARCH_TERM] یافت نشد. یکی از جستجوهای زیر را امتحان کنید:",searching:"در حال جستجوی [SEARCH_TERM]..."},Qs={thanks_to:ft,comments:Et,direction:ht,strings:dt},Ct={};F(Ct,{comments:()=>gt,default:()=>$s,direction:()=>At,strings:()=>Rt,thanks_to:()=>mt});var mt="Valtteri Laitinen ",gt="",At="ltr",Rt={placeholder:"Haku",clear_search:"Tyhjennä",load_more:"Lataa lisää tuloksia",search_label:"Hae tältä sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. Näytetään tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},$s={thanks_to:mt,comments:gt,direction:At,strings:Rt},Bt={};F(Bt,{comments:()=>pt,default:()=>ea,direction:()=>Tt,strings:()=>Ft,thanks_to:()=>vt});var vt="Nicolas Friedli ",pt="",Tt="ltr",Ft={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de résultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de résultat pour [SEARCH_TERM]",many_results:"[COUNT] résultats pour [SEARCH_TERM]",one_result:"[COUNT] résultat pour [SEARCH_TERM]",alt_search:"Pas de résultat pour [SEARCH_TERM]. Montre les résultats pour [DIFFERENT_TERM] à la place",search_suggestion:"Pas de résultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},ea={thanks_to:vt,comments:pt,direction:Tt,strings:Ft},kt={};F(kt,{comments:()=>bt,default:()=>ua,direction:()=>Mt,strings:()=>St,thanks_to:()=>Dt});var Dt="Pablo Villaverde ",bt="",Mt="ltr",St={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver máis resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},ua={thanks_to:Dt,comments:bt,direction:Mt,strings:St},Ht={};F(Ht,{comments:()=>Nt,default:()=>ta,direction:()=>yt,strings:()=>zt,thanks_to:()=>wt});var wt="Nir Tamir ",Nt="",yt="rtl",zt={placeholder:"חיפוש",clear_search:"ניקוי",load_more:"עוד תוצאות",search_label:"חיפוש באתר זה",filters_label:"מסננים",zero_results:"לא נמצאו תוצאות עבור [SEARCH_TERM]",many_results:"נמצאו [COUNT] תוצאות עבור [SEARCH_TERM]",one_result:"נמצאה תוצאה אחת עבור [SEARCH_TERM]",alt_search:"לא נמצאו תוצאות עבור [SEARCH_TERM]. מוצגות תוצאות עבור [DIFFERENT_TERM]",search_suggestion:"לא נמצאו תוצאות עבור [SEARCH_TERM]. נסו אחד מהחיפושים הבאים:",searching:"מחפש את [SEARCH_TERM]..."},ta={thanks_to:wt,comments:Nt,direction:yt,strings:zt},jt={};F(jt,{comments:()=>Ut,default:()=>ra,direction:()=>It,strings:()=>Pt,thanks_to:()=>Ot});var Ot="Amit Yadav ",Ut="",It="ltr",Pt={placeholder:"खोजें",clear_search:"साफ करें",load_more:"और अधिक परिणाम लोड करें",search_label:"इस साइट में खोजें",filters_label:"फ़िल्टर",zero_results:"कोई परिणाम [SEARCH_TERM] के लिए नहीं मिला",many_results:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिले",one_result:"[COUNT] परिणाम [SEARCH_TERM] के लिए मिला",alt_search:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। इसके बजाय [DIFFERENT_TERM] के लिए परिणाम दिखा रहा है",search_suggestion:"[SEARCH_TERM] के लिए कोई परिणाम नहीं मिला। निम्नलिखित खोजों में से कोई एक आज़माएं:",searching:"[SEARCH_TERM] की खोज की जा रही है..."},ra={thanks_to:Ot,comments:Ut,direction:It,strings:Pt},Lt={};F(Lt,{comments:()=>qt,default:()=>sa,direction:()=>Vt,strings:()=>Kt,thanks_to:()=>xt});var xt="Diomed ",qt="",Vt="ltr",Kt={placeholder:"Traži",clear_search:"Očisti",load_more:"Učitaj više rezultata",search_label:"Pretraži ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Pokušaj s jednom od ovih pretraga:",searching:"Pretražujem [SEARCH_TERM]..."},sa={thanks_to:xt,comments:qt,direction:Vt,strings:Kt},Gt={};F(Gt,{comments:()=>Wt,default:()=>aa,direction:()=>Zt,strings:()=>Yt,thanks_to:()=>Jt});var Jt="Adam Laki ",Wt="",Zt="ltr",Yt={placeholder:"Keresés",clear_search:"Törlés",load_more:"További találatok betöltése",search_label:"Keresés az oldalon",filters_label:"Szűrés",zero_results:"Nincs találat a(z) [SEARCH_TERM] kifejezésre",many_results:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",one_result:"[COUNT] db találat a(z) [SEARCH_TERM] kifejezésre",alt_search:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Találatok mutatása inkább a(z) [DIFFERENT_TERM] kifejezésre",search_suggestion:"Nincs találat a(z) [SEARCH_TERM] kifejezésre. Próbáld meg a következő keresések egyikét:",searching:"Keresés a(z) [SEARCH_TERM] kifejezésre..."},aa={thanks_to:Jt,comments:Wt,direction:Zt,strings:Yt},Xt={};F(Xt,{comments:()=>$t,default:()=>la,direction:()=>er,strings:()=>ur,thanks_to:()=>Qt});var Qt="Nixentric",$t="",er="ltr",ur={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},la={thanks_to:Qt,comments:$t,direction:er,strings:ur},tr={};F(tr,{comments:()=>sr,default:()=>na,direction:()=>ar,strings:()=>lr,thanks_to:()=>rr});var rr="Cosette Bruhns Alonso, Andrew Janco ",sr="",ar="ltr",lr={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra più risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},na={thanks_to:rr,comments:sr,direction:ar,strings:lr},nr={};F(nr,{comments:()=>or,default:()=>ia,direction:()=>_r,strings:()=>cr,thanks_to:()=>ir});var ir="Tate",or="",_r="ltr",cr={placeholder:"検索",clear_search:"クリア",load_more:"次を読み込む",search_label:"このサイトを検索",filters_label:"フィルタ",zero_results:"[SEARCH_TERM]の検索に一致する情報はありませんでした",many_results:"[SEARCH_TERM]の[COUNT]件の検索結果",one_result:"[SEARCH_TERM]の[COUNT]件の検索結果",alt_search:"[SEARCH_TERM]の検索に一致する情報はありませんでした。[DIFFERENT_TERM]の検索結果を表示しています",search_suggestion:"[SEARCH_TERM]の検索に一致する情報はありませんでした。次のいずれかの検索を試してください",searching:"[SEARCH_TERM]を検索しています"},ia={thanks_to:ir,comments:or,direction:_r,strings:cr},fr={};F(fr,{comments:()=>hr,default:()=>oa,direction:()=>dr,strings:()=>Cr,thanks_to:()=>Er});var Er="Seokho Son ",hr="",dr="ltr",Cr={placeholder:"검색어",clear_search:"비우기",load_more:"검색 결과 더 보기",search_label:"사이트 검색",filters_label:"필터",zero_results:"[SEARCH_TERM]에 대한 결과 없음",many_results:"[SEARCH_TERM]에 대한 결과 [COUNT]건",one_result:"[SEARCH_TERM]에 대한 결과 [COUNT]건",alt_search:"[SEARCH_TERM]에 대한 결과 없음. [DIFFERENT_TERM]에 대한 결과",search_suggestion:"[SEARCH_TERM]에 대한 결과 없음. 추천 검색어: ",searching:"[SEARCH_TERM] 검색 중..."},oa={thanks_to:Er,comments:hr,direction:dr,strings:Cr},mr={};F(mr,{comments:()=>Ar,default:()=>_a,direction:()=>Rr,strings:()=>Br,thanks_to:()=>gr});var gr="",Ar="",Rr="ltr",Br={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta ētahi otinga kē",search_label:"Rapu",filters_label:"Tātari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga kē ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakamātau ki ngā mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},_a={thanks_to:gr,comments:Ar,direction:Rr,strings:Br},vr={};F(vr,{comments:()=>Tr,default:()=>ca,direction:()=>Fr,strings:()=>kr,thanks_to:()=>pr});var pr="Paul van Brouwershaven",Tr="",Fr="ltr",kr={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},ca={thanks_to:pr,comments:Tr,direction:Fr,strings:kr},Dr={};F(Dr,{comments:()=>Mr,default:()=>fa,direction:()=>Sr,strings:()=>Hr,thanks_to:()=>br});var br="Christopher Wingate",Mr="",Sr="ltr",Hr={placeholder:"Søk",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"Søk på denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Prøv en av disse søkeordene i stedet:",searching:"Søker etter [SEARCH_TERM]"},fa={thanks_to:br,comments:Mr,direction:Sr,strings:Hr},wr={};F(wr,{comments:()=>yr,default:()=>Ea,direction:()=>zr,strings:()=>jr,thanks_to:()=>Nr});var Nr="",yr="",zr="ltr",jr={placeholder:"Szukaj",clear_search:"Wyczyść",load_more:"Załaduj więcej",search_label:"Przeszukaj tę stronę",filters_label:"Filtry",zero_results:"Brak wyników dla [SEARCH_TERM]",many_results:"[COUNT] wyników dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wyników dla [SEARCH_TERM]. Wyświetlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wyników dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},Ea={thanks_to:Nr,comments:yr,direction:zr,strings:jr},Or={};F(Or,{comments:()=>Ir,default:()=>ha,direction:()=>Pr,strings:()=>Lr,thanks_to:()=>Ur});var Ur="Jonatah",Ir="",Pr="ltr",Lr={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},ha={thanks_to:Ur,comments:Ir,direction:Pr,strings:Lr},xr={};F(xr,{comments:()=>Vr,default:()=>da,direction:()=>Kr,strings:()=>Gr,thanks_to:()=>qr});var qr="Bogdan Mateescu ",Vr="",Kr="ltr",Gr={placeholder:"Căutare",clear_search:"Ştergeţi",load_more:"Încărcați mai multe rezultate",search_label:"Căutați în acest site",filters_label:"Filtre",zero_results:"Niciun rezultat pentru [SEARCH_TERM]",many_results:"[COUNT] rezultate pentru [SEARCH_TERM]",one_result:"[COUNT] rezultat pentru [SEARCH_TERM]",alt_search:"Niciun rezultat pentru [SEARCH_TERM]. Se afișează în schimb rezultatele pentru [DIFFERENT_TERM]",search_suggestion:"Niciun rezultat pentru [SEARCH_TERM]. Încercați una dintre următoarele căutări:",searching:"Se caută după: [SEARCH_TERM]..."},da={thanks_to:qr,comments:Vr,direction:Kr,strings:Gr},Jr={};F(Jr,{comments:()=>Zr,default:()=>Ca,direction:()=>Yr,strings:()=>Xr,thanks_to:()=>Wr});var Wr="Aleksandr Gordeev",Zr="",Yr="ltr",Xr={placeholder:"Поиск",clear_search:"Очистить поле",load_more:"Загрузить еще",search_label:"Поиск по сайту",filters_label:"Фильтры",zero_results:"Ничего не найдено по запросу: [SEARCH_TERM]",many_results:"[COUNT] результатов по запросу: [SEARCH_TERM]",one_result:"[COUNT] результат по запросу: [SEARCH_TERM]",alt_search:"Ничего не найдено по запросу: [SEARCH_TERM]. Показаны результаты по запросу: [DIFFERENT_TERM]",search_suggestion:"Ничего не найдено по запросу: [SEARCH_TERM]. Попробуйте один из следующих вариантов",searching:"Поиск по запросу: [SEARCH_TERM]"},Ca={thanks_to:Wr,comments:Zr,direction:Yr,strings:Xr},Qr={};F(Qr,{comments:()=>e0,default:()=>ma,direction:()=>u0,strings:()=>t0,thanks_to:()=>$r});var $r="Andrija Sagicc",e0="",u0="ltr",t0={placeholder:"Претрага",clear_search:"Брисање",load_more:"Приказ више резултата",search_label:"Претрага сајта",filters_label:"Филтери",zero_results:"Нема резултата за [SEARCH_TERM]",many_results:"[COUNT] резултата за [SEARCH_TERM]",one_result:"[COUNT] резултата за [SEARCH_TERM]",alt_search:"Нема резултата за [SEARCH_TERM]. Приказ додатник резултата за [DIFFERENT_TERM]",search_suggestion:"Нема резултата за [SEARCH_TERM]. Покушајте са неком од следећих претрага:",searching:"Претрага термина [SEARCH_TERM]..."},ma={thanks_to:$r,comments:e0,direction:u0,strings:t0},r0={};F(r0,{comments:()=>a0,default:()=>ga,direction:()=>l0,strings:()=>n0,thanks_to:()=>s0});var s0="Montazar Al-Jaber ",a0="",l0="ltr",n0={placeholder:"Sök",clear_search:"Rensa",load_more:"Visa fler träffar",search_label:"Sök på denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga träffar",many_results:"[SEARCH_TERM] gav [COUNT] träffar",one_result:"[SEARCH_TERM] gav [COUNT] träff",alt_search:"[SEARCH_TERM] gav inga träffar. Visar resultat för [DIFFERENT_TERM] istället",search_suggestion:"[SEARCH_TERM] gav inga träffar. Försök igen med en av följande sökord:",searching:"Söker efter [SEARCH_TERM]..."},ga={thanks_to:s0,comments:a0,direction:l0,strings:n0},i0={};F(i0,{comments:()=>_0,default:()=>Aa,direction:()=>c0,strings:()=>f0,thanks_to:()=>o0});var o0="Anonymous",_0="",c0="ltr",f0={placeholder:"Tafuta",clear_search:"Futa",load_more:"Pakia matokeo zaidi",search_label:"Tafuta tovuti hii",filters_label:"Vichujio",zero_results:"Hakuna matokeo ya [SEARCH_TERM]",many_results:"Matokeo [COUNT] ya [SEARCH_TERM]",one_result:"Tokeo [COUNT] la [SEARCH_TERM]",alt_search:"Hakuna mayokeo ya [SEARCH_TERM]. Badala yake, inaonyesha matokeo ya [DIFFERENT_TERM]",search_suggestion:"Hakuna matokeo ya [SEARCH_TERM]. Jaribu mojawapo ya utafutaji ufuatao:",searching:"Kutafuta [SEARCH_TERM]..."},Aa={thanks_to:o0,comments:_0,direction:c0,strings:f0},E0={};F(E0,{comments:()=>d0,default:()=>Ra,direction:()=>C0,strings:()=>m0,thanks_to:()=>h0});var h0="",d0="",C0="ltr",m0={placeholder:"தேடுக",clear_search:"அழிக்குக",load_more:"மேலும் முடிவுகளைக் காட்டுக",search_label:"இந்த தளத்தில் தேடுக",filters_label:"வடிகட்டல்கள்",zero_results:"[SEARCH_TERM] க்கான முடிவுகள் இல்லை",many_results:"[SEARCH_TERM] க்கான [COUNT] முடிவுகள்",one_result:"[SEARCH_TERM] க்கான முடிவு",alt_search:"[SEARCH_TERM] இத்தேடலுக்கான முடிவுகள் இல்லை, இந்த தேடல்களுக்கான ஒத்த முடிவுகள் [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] இத் தேடலுக்கான முடிவுகள் இல்லை.இதற்கு பதிலீடான தேடல்களை தேடுக:",searching:"[SEARCH_TERM] தேடப்படுகின்றது"},Ra={thanks_to:h0,comments:d0,direction:C0,strings:m0},g0={};F(g0,{comments:()=>R0,default:()=>Ba,direction:()=>B0,strings:()=>v0,thanks_to:()=>A0});var A0="Taylan Özgür Bildik",R0="",B0="ltr",v0={placeholder:"Araştır",clear_search:"Temizle",load_more:"Daha fazla sonuç",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] için sonuç yok",many_results:"[SEARCH_TERM] için [COUNT] sonuç bulundu",one_result:"[SEARCH_TERM] için [COUNT] sonuç bulundu",alt_search:"[SEARCH_TERM] için sonuç yok. Bunun yerine [DIFFERENT_TERM] için sonuçlar gösteriliyor",search_suggestion:"[SEARCH_TERM] için sonuç yok. Alternatif olarak aşağıdaki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] araştırılıyor..."},Ba={thanks_to:A0,comments:R0,direction:B0,strings:v0},p0={};F(p0,{comments:()=>F0,default:()=>va,direction:()=>k0,strings:()=>D0,thanks_to:()=>T0});var T0="Vladyslav Lyshenko ",F0="",k0="ltr",D0={placeholder:"Пошук",clear_search:"Очистити поле",load_more:"Завантажити ще",search_label:"Пошук по сайту",filters_label:"Фільтри",zero_results:"Нічого не знайдено за запитом: [SEARCH_TERM]",many_results:"[COUNT] результатів на запит: [SEARCH_TERM]",one_result:"[COUNT] результат за запитом: [SEARCH_TERM]",alt_search:"Нічого не знайдено на запит: [SEARCH_TERM]. Показано результати на запит: [DIFFERENT_TERM]",search_suggestion:"Нічого не знайдено на запит: [SEARCH_TERM]. Спробуйте один із таких варіантів",searching:"Пошук за запитом: [SEARCH_TERM]"},va={thanks_to:T0,comments:F0,direction:k0,strings:D0},b0={};F(b0,{comments:()=>S0,default:()=>pa,direction:()=>H0,strings:()=>w0,thanks_to:()=>M0});var M0="Long Nhat Nguyen",S0="",H0="ltr",w0={placeholder:"Tìm kiếm",clear_search:"Xóa",load_more:"Nhiều kết quả hơn",search_label:"Tìm kiếm trong trang này",filters_label:"Bộ lọc",zero_results:"Không tìm thấy kết quả cho [SEARCH_TERM]",many_results:"[COUNT] kết quả cho [SEARCH_TERM]",one_result:"[COUNT] kết quả cho [SEARCH_TERM]",alt_search:"Không tìm thấy kết quả cho [SEARCH_TERM]. Kiểm thị kết quả thay thế với [DIFFERENT_TERM]",search_suggestion:"Không tìm thấy kết quả cho [SEARCH_TERM]. Thử một trong các tìm kiếm:",searching:"Đang tìm kiếm cho [SEARCH_TERM]..."},pa={thanks_to:M0,comments:S0,direction:H0,strings:w0},N0={};F(N0,{comments:()=>z0,default:()=>Ta,direction:()=>j0,strings:()=>O0,thanks_to:()=>y0});var y0="Amber Song",z0="",j0="ltr",O0={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Ta={thanks_to:y0,comments:z0,direction:j0,strings:O0},U0={};F(U0,{comments:()=>P0,default:()=>Fa,direction:()=>L0,strings:()=>x0,thanks_to:()=>I0});var I0="Amber Song",P0="",L0="ltr",x0={placeholder:"搜索",clear_search:"清除",load_more:"加載更多結果",search_label:"站內搜索",filters_label:"篩選",zero_results:"未找到 [SEARCH_TERM] 的相關結果",many_results:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",one_result:"找到 [COUNT] 個 [SEARCH_TERM] 的相關結果",alt_search:"未找到 [SEARCH_TERM] 的相關結果。改為顯示 [DIFFERENT_TERM] 的相關結果",search_suggestion:"未找到 [SEARCH_TERM] 的相關結果。請嘗試以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},Fa={thanks_to:I0,comments:P0,direction:L0,strings:x0},q0={};F(q0,{comments:()=>K0,default:()=>ka,direction:()=>G0,strings:()=>J0,thanks_to:()=>V0});var V0="Amber Song",K0="",G0="ltr",J0={placeholder:"搜索",clear_search:"清除",load_more:"加载更多结果",search_label:"站内搜索",filters_label:"筛选",zero_results:"未找到 [SEARCH_TERM] 的相关结果",many_results:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",one_result:"找到 [COUNT] 个 [SEARCH_TERM] 的相关结果",alt_search:"未找到 [SEARCH_TERM] 的相关结果。改为显示 [DIFFERENT_TERM] 的相关结果",search_suggestion:"未找到 [SEARCH_TERM] 的相关结果。请尝试以下搜索。",searching:"正在搜索 [SEARCH_TERM]..."},ka={thanks_to:V0,comments:K0,direction:G0,strings:J0},Da=[Ru,Fu,Su,zu,Pu,Ku,Yu,ut,lt,ct,Ct,Bt,kt,Ht,jt,Lt,Gt,Xt,tr,nr,fr,mr,vr,Dr,wr,Or,xr,Jr,Qr,r0,i0,E0,g0,p0,b0,N0,U0,q0],ba=Da,Ma=["../../translations/af.json","../../translations/ar.json","../../translations/bn.json","../../translations/ca.json","../../translations/cs.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fa.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/he.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/ko.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ro.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/sw.json","../../translations/ta.json","../../translations/tr.json","../../translations/uk.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function ou(e,t,u){const r=e.slice();return r[51]=t[u],r}function _u(e){let t,u,r;function s(l){e[37](l)}let a={show_empty_filters:e[5],open_filters:e[6],available_filters:e[18],translate:e[20],automatic_translations:e[19],translations:e[7]};return e[0]!==void 0&&(a.selected_filters=e[0]),t=new xs({props:a}),ae.push(()=>ps(t,"selected_filters",s)),{c(){ke(t.$$.fragment)},m(l,n){Ee(t,l,n),r=!0},p(l,n){const i={};n[0]&32&&(i.show_empty_filters=l[5]),n[0]&64&&(i.open_filters=l[6]),n[0]&262144&&(i.available_filters=l[18]),n[0]&524288&&(i.automatic_translations=l[19]),n[0]&128&&(i.translations=l[7]),!u&&n[0]&1&&(u=!0,i.selected_filters=l[0],gs(()=>u=!1)),t.$set(i)},i(l){r||(z(t.$$.fragment,l),r=!0)},o(l){U(t.$$.fragment,l),r=!1},d(l){he(t,l)}}}function cu(e){let t,u,r,s;const a=[Ha,Sa],l=[];function n(i,h){return i[14]?0:1}return u=n(e),r=l[u]=a[u](e),{c(){t=v("div"),r.c(),g(t,"class","pagefind-ui__results-area svelte-e9gkc3")},m(i,h){T(i,t,h),l[u].m(t,null),s=!0},p(i,h){let _=u;u=n(i),u===_?l[u].p(i,h):(le(),U(l[_],1,1,()=>{l[_]=null}),ne(),r=l[u],r?r.p(i,h):(r=l[u]=a[u](i),r.c()),z(r,1),r.m(t,null))},i(i){s||(z(r),s=!0)},o(i){U(r),s=!1},d(i){i&&p(t),l[u].d()}}}function Sa(e){let t,u,r,s=[],a=new Map,l,n,i;function h(o,E){return o[13].results.length===0?ya:o[13].results.length===1?Na:wa}let _=h(e),d=_(e),C=e[13].results.slice(0,e[17]);const f=o=>o[51].id;for(let o=0;oe[17]&&Eu(e);return{c(){t=v("p"),d.c(),u=b(),r=v("ol");for(let o=0;oo[17]?c?c.p(o,E):(c=Eu(o),c.c(),c.m(n.parentNode,n)):c&&(c.d(1),c=null)},i(o){if(!i){for(let E=0;E{i[C]=null}),ne(),s=i[r],s?s.p(t,d):(s=i[r]=n[r](t),s.c()),z(s,1),s.m(a.parentNode,a))},i(_){l||(z(s),l=!0)},o(_){U(s),l=!1},d(_){_&&p(u),i[r].d(_),_&&p(a)}}}function Eu(e){let t,u=e[20]("load_more",e[19],e[7])+"",r,s,a;return{c(){t=v("button"),r=M(u),g(t,"type","button"),g(t,"class","pagefind-ui__button svelte-e9gkc3")},m(l,n){T(l,t,n),B(t,r),s||(a=G(t,"click",e[22]),s=!0)},p(l,n){n[0]&524416&&u!==(u=l[20]("load_more",l[19],l[7])+"")&&j(r,u)},d(l){l&&p(t),s=!1,a()}}}function hu(e){let t,u=e[20]("searching",e[19],e[7]).replace(/\[SEARCH_TERM\]/,e[16])+"",r;return{c(){t=v("p"),r=M(u),g(t,"class","pagefind-ui__message svelte-e9gkc3")},m(s,a){T(s,t,a),B(t,r)},p(s,a){a[0]&589952&&u!==(u=s[20]("searching",s[19],s[7]).replace(/\[SEARCH_TERM\]/,s[16])+"")&&j(r,u)},d(s){s&&p(t)}}}function Oa(e){let t,u,r,s,a,l,n=e[20]("clear_search",e[19],e[7])+"",i,h,_,d,C,f,c,o,E=e[12]&&_u(e),R=e[15]&&cu(e);return{c(){t=v("div"),u=v("form"),r=v("input"),a=b(),l=v("button"),i=M(n),h=b(),_=v("div"),E&&E.c(),d=b(),R&&R.c(),g(r,"class","pagefind-ui__search-input svelte-e9gkc3"),g(r,"type","text"),g(r,"placeholder",s=e[20]("placeholder",e[19],e[7])),g(r,"autocapitalize","none"),g(r,"enterkeyhint","search"),r.autofocus=e[8],g(l,"class","pagefind-ui__search-clear svelte-e9gkc3"),K(l,"pagefind-ui__suppressed",!e[9]),g(_,"class","pagefind-ui__drawer svelte-e9gkc3"),K(_,"pagefind-ui__hidden",!e[15]),g(u,"class","pagefind-ui__form svelte-e9gkc3"),g(u,"role","search"),g(u,"aria-label",C=e[20]("search_label",e[19],e[7])),g(u,"action","javascript:void(0);"),g(t,"class","pagefind-ui svelte-e9gkc3"),K(t,"pagefind-ui--reset",e[1])},m(A,k){T(A,t,k),B(t,u),B(u,r),ze(r,e[9]),e[34](r),B(u,a),B(u,l),B(l,i),e[35](l),B(u,h),B(u,_),E&&E.m(_,null),B(_,d),R&&R.m(_,null),f=!0,e[8]&&r.focus(),c||(o=[G(r,"focus",e[21]),G(r,"keydown",e[32]),G(r,"input",e[33]),G(l,"click",e[36]),G(u,"submit",Ua)],c=!0)},p(A,k){(!f||k[0]&524416&&s!==(s=A[20]("placeholder",A[19],A[7])))&&g(r,"placeholder",s),(!f||k[0]&256)&&(r.autofocus=A[8]),k[0]&512&&r.value!==A[9]&&ze(r,A[9]),(!f||k[0]&524416)&&n!==(n=A[20]("clear_search",A[19],A[7])+"")&&j(i,n),(!f||k[0]&512)&&K(l,"pagefind-ui__suppressed",!A[9]),A[12]?E?(E.p(A,k),k[0]&4096&&z(E,1)):(E=_u(A),E.c(),z(E,1),E.m(_,d)):E&&(le(),U(E,1,1,()=>{E=null}),ne()),A[15]?R?(R.p(A,k),k[0]&32768&&z(R,1)):(R=cu(A),R.c(),z(R,1),R.m(_,null)):R&&(le(),U(R,1,1,()=>{R=null}),ne()),(!f||k[0]&32768)&&K(_,"pagefind-ui__hidden",!A[15]),(!f||k[0]&524416&&C!==(C=A[20]("search_label",A[19],A[7])))&&g(u,"aria-label",C),(!f||k[0]&2)&&K(t,"pagefind-ui--reset",A[1])},i(A){f||(z(E),z(R),f=!0)},o(A){U(E),U(R),f=!1},d(A){A&&p(t),e[34](null),e[35](null),E&&E.d(),R&&R.d(),c=!1,W(o)}}}var Ua=e=>e.preventDefault();function Ia(e,t,u){const r={},s=Ma.map(m=>m.match(/([^\/]+)\.json$/)[1]);for(let m=0;mN[m]??H[m]??"";hs(()=>{let m=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",H=Au(m.toLocaleLowerCase());u(19,He=r[`${H.language}-${H.script}-${H.region}`]||r[`${H.language}-${H.region}`]||r[`${H.language}`]||r.en)}),ds(()=>{S?.destroy?.(),S=null});const we=async()=>{if(!me&&(u(12,me=!0),!S)){let m;try{m=await is(()=>import(`${a}pagefind.js`),[])}catch(N){console.error(N),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI"].join(` +`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}_||u(24,_=h?12:30);let H={...E||{},excerptLength:_};await m.options(H);for(const N of R){if(!N.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");const I=N.bundlePath;delete N.bundlePath,await m.mergeIndex(I,N)}S=m,Y0()}},Y0=async()=>{S&&(Se=await S.filters(),(!ue||!Object.keys(ue).length)&&u(18,ue=Se))},X0=m=>{let H={};return Object.entries(m).filter(([,N])=>N).forEach(([N])=>{let[I,Z]=N.split(/:(.*)$/);H[I]=H[I]||[],H[I].push(Z)}),H};let te;const Q0=async(m,H)=>{if(!m){u(15,Ae=!1),te&&clearTimeout(te);return}const N=X0(H),I=()=>$0(m,N);o>0&&m?(te&&clearTimeout(te),te=setTimeout(I,o),await Ne(),S.preload(m,{filters:N})):I(),es()},Ne=async()=>{for(;!S;)we(),await new Promise(m=>setTimeout(m,50))},$0=async(m,H)=>{u(16,Me=m||""),typeof C=="function"&&(m=C(m)),u(14,ge=!0),u(15,Ae=!0),await Ne();const N=++be,I={filters:H};q&&typeof q=="object"&&(I.sort=q);const Z=await S.search(m,I);be===N&&(Z.filters&&Object.keys(Z.filters)?.length&&u(18,ue=Z.filters),u(13,De=Z),u(14,ge=!1),u(17,Re=l))},es=()=>{const m=x.offsetWidth;m!=W0&&u(10,w.style.paddingRight=`${m+2}px`,w)},us=m=>{m?.preventDefault(),u(17,Re+=l)},ts=m=>{m.key==="Escape"&&(u(9,D=""),w.blur()),m.key==="Enter"&&m.preventDefault()};function rs(){D=this.value,u(9,D),u(23,A)}function ss(m){ae[m?"unshift":"push"](()=>{w=m,u(10,w)})}function as(m){ae[m?"unshift":"push"](()=>{x=m,u(11,x)})}const ls=()=>{u(9,D=""),w.blur()};function ns(m){L=m,u(0,L)}return e.$$set=m=>{"base_path"in m&&u(25,a=m.base_path),"page_size"in m&&u(26,l=m.page_size),"reset_styles"in m&&u(1,n=m.reset_styles),"show_images"in m&&u(2,i=m.show_images),"show_sub_results"in m&&u(3,h=m.show_sub_results),"excerpt_length"in m&&u(24,_=m.excerpt_length),"process_result"in m&&u(4,d=m.process_result),"process_term"in m&&u(27,C=m.process_term),"show_empty_filters"in m&&u(5,f=m.show_empty_filters),"open_filters"in m&&u(6,c=m.open_filters),"debounce_timeout_ms"in m&&u(28,o=m.debounce_timeout_ms),"pagefind_options"in m&&u(29,E=m.pagefind_options),"merge_index"in m&&u(30,R=m.merge_index),"trigger_search_term"in m&&u(23,A=m.trigger_search_term),"translations"in m&&u(7,k=m.translations),"autofocus"in m&&u(8,y=m.autofocus),"sort"in m&&u(31,q=m.sort),"selected_filters"in m&&u(0,L=m.selected_filters)},e.$$.update=()=>{e.$$.dirty[0]&8388608&&A&&(u(9,D=A),u(23,A="")),e.$$.dirty[0]&513&&Q0(D,L)},[L,n,i,h,d,f,c,k,y,D,w,x,me,De,ge,Ae,Me,Re,ue,He,Z0,we,us,A,_,a,l,C,o,E,R,q,ts,rs,ss,as,ls,ns]}var Pa=class extends Ce{constructor(e){super(),de(this,e,Ia,Oa,fe,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},La=Pa,Fe;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(Fe=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{Fe="/pagefind/"}var Va=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",u=e.bundlePath??Fe,r=e.pageSize??5,s=e.resetStyles??!0,a=e.showImages??!0,l=e.showSubResults??!1,n=e.excerptLength??0,i=e.processResult??null,h=e.processTerm??null,_=e.showEmptyFilters??!0,d=e.openFilters??[],C=e.debounceTimeoutMs??300,f=e.mergeIndex??[],c=e.translations??[],o=e.autofocus??!1,E=e.sort??null;delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.openFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,delete e.autofocus,delete e.sort;const R=t instanceof HTMLElement?t:document.querySelector(t);R?this._pfs=new La({target:R,props:{base_path:u,page_size:r,reset_styles:s,show_images:a,show_sub_results:l,excerpt_length:n,process_result:i,process_term:h,show_empty_filters:_,open_filters:d,debounce_timeout_ms:C,merge_index:f,translations:c,autofocus:o,sort:E,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}triggerFilters(e){let t={};for(let[u,r]of Object.entries(e))if(Array.isArray(r))for(let s of r)t[`${u}:${s}`]=!0;else t[`${u}:${r}`]=!0;this._pfs.$$set({selected_filters:t})}destroy(){this._pfs.$destroy()}};export{Va as PagefindUI}; diff --git a/shepherd/blueprints/staticroutes/docs/CytronBoardDocs.pdf b/shepherd/blueprints/staticroutes/docs/assets/CytronBoardDocs.pdf similarity index 100% rename from shepherd/blueprints/staticroutes/docs/CytronBoardDocs.pdf rename to shepherd/blueprints/staticroutes/docs/assets/CytronBoardDocs.pdf diff --git a/shepherd/blueprints/staticroutes/docs/assets/MiniBot-Assembly-Instructions.pdf b/shepherd/blueprints/staticroutes/docs/assets/MiniBot-Assembly-Instructions.pdf new file mode 100644 index 0000000..d2329b1 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/assets/MiniBot-Assembly-Instructions.pdf differ diff --git a/shepherd/blueprints/staticroutes/docs/assets/Rulebook.pdf b/shepherd/blueprints/staticroutes/docs/assets/Rulebook.pdf new file mode 100644 index 0000000..15677da Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/assets/Rulebook.pdf differ diff --git a/shepherd/blueprints/staticroutes/docs/assets/challenges.pdf b/shepherd/blueprints/staticroutes/docs/assets/challenges.pdf new file mode 100644 index 0000000..d3c6f60 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/assets/challenges.pdf differ diff --git a/shepherd/blueprints/staticroutes/docs/assets/css/0.styles.1f091d51.css b/shepherd/blueprints/staticroutes/docs/assets/css/0.styles.1f091d51.css deleted file mode 100644 index 7198ede..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/css/0.styles.1f091d51.css +++ /dev/null @@ -1 +0,0 @@ -.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#0094ff;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #0085e6}.home .hero .action-button:hover{background-color:#1a9fff}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.blockly-snippet{background-color:#1e1e1e;border-radius:6px;overflow-x:scroll}.blockly-snippet div{padding:1.5rem;background-position:50%;background-repeat:no-repeat}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/docs/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#0094ff}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:1.5rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#0094ff}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title{display:block}.dropdown-wrapper .dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:.45rem 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#0094ff}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #0094ff;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper .dropdown-title .arrow{border-left:4px solid transparent;border-right:4px solid transparent;border-top:6px solid #ccc;border-bottom:0}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid #ddd;border-bottom-color:#ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#0094ff}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #149dff}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem;position:relative}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}.navbar .links .nav-links{flex:1}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}}.page-edit,.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit,.page-nav{padding:2rem}}@media (max-width:419px){.page-edit,.page-nav{padding:1.5rem}}.page{padding-bottom:2rem}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#aaa}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#0094ff}a.sidebar-link.active{font-weight:600;color:#0094ff;border-left-color:#0094ff}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar-button{display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem;cursor:pointer}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem 0}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar .sidebar-links{padding:1.5rem 0}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar .sidebar-links{padding:1rem 0}}.sw-update-popup{position:fixed;right:1em;bottom:1em;padding:1em;border:1px solid #0094ff;border-radius:3px;background:#fff;box-shadow:0 4px 16px rgba(0,0,0,.5);text-align:center}.sw-update-popup button{margin-top:.5em;padding:.25em 2em}.sw-update-popup-enter-active,.sw-update-popup-leave-active{transition:opacity .3s,transform .3s}.sw-update-popup-enter,.sw-update-popup-leave-to{opacity:0;transform:translateY(50%) scale(.5)}code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}#nprogress{pointer-events:none}#nprogress .bar{background:#0094ff;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #0094ff,0 0 5px #0094ff;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border:2px solid transparent;border-top-color:#0094ff;border-left-color:#0094ff;border-radius:50%;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.content pre,.content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#1e1e1e;border-radius:6px;overflow:auto}.content pre[class*=language-] code,.content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#1e1e1e;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number,div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#1e1e1e}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.content:not(.custom){padding:2rem}}@media (max-width:419px){.content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:15px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.content:not(.custom)>:first-child{margin-top:3.6rem}.content:not(.custom) a:hover{text-decoration:underline}.content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.content:not(.custom) img{max-width:100%}.content.custom{padding:0;margin:0}.content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#0094ff}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1.2rem;color:#999;border-left:.25rem solid #dfe2e5;margin-left:0;padding-left:1rem}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.content:not(.custom)>h1,.content:not(.custom)>h2,.content:not(.custom)>h3,.content:not(.custom)>h4,.content:not(.custom)>h5,.content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.content:not(.custom)>h1:first-child,.content:not(.custom)>h2:first-child,.content:not(.custom)>h3:first-child,.content:not(.custom)>h4:first-child,.content:not(.custom)>h5:first-child,.content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.content:not(.custom)>h1:first-child+.custom-block,.content:not(.custom)>h1:first-child+p,.content:not(.custom)>h1:first-child+pre,.content:not(.custom)>h2:first-child+.custom-block,.content:not(.custom)>h2:first-child+p,.content:not(.custom)>h2:first-child+pre,.content:not(.custom)>h3:first-child+.custom-block,.content:not(.custom)>h3:first-child+p,.content:not(.custom)>h3:first-child+pre,.content:not(.custom)>h4:first-child+.custom-block,.content:not(.custom)>h4:first-child+p,.content:not(.custom)>h4:first-child+pre,.content:not(.custom)>h5:first-child+.custom-block,.content:not(.custom)>h5:first-child+p,.content:not(.custom)>h5:first-child+pre,.content:not(.custom)>h6:first-child+.custom-block,.content:not(.custom)>h6:first-child+p,.content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.custom-layout{padding-top:3.6rem}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}.theme-container.no-navbar .custom-layout{padding-top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}.icon.outbound{color:#aaa;display:inline-block}.badge[data-v-099ab69c]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff;margin-right:5px;background-color:#42b983}.badge.middle[data-v-099ab69c]{vertical-align:middle}.badge.top[data-v-099ab69c]{vertical-align:top}.badge.green[data-v-099ab69c],.badge.tip[data-v-099ab69c]{background-color:#42b983}.badge.error[data-v-099ab69c]{background-color:#da5961}.badge.warn[data-v-099ab69c],.badge.warning[data-v-099ab69c],.badge.yellow[data-v-099ab69c]{background-color:#e7c000}.sidebar-group:not(.first){margin-top:1em}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading{cursor:auto;color:inherit}.sidebar-heading{color:#999;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:0 1.5rem;margin-top:0;margin-bottom:.5rem}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading:.open .arrow{top:-.18em}.sidebar-group-items{transition:height .1s ease-out;overflow:hidden} \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/favicon.png b/shepherd/blueprints/staticroutes/docs/assets/favicon.png new file mode 100644 index 0000000..caaa52c Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/assets/favicon.png differ diff --git a/shepherd/blueprints/staticroutes/docs/assets/img/search.83621669.svg b/shepherd/blueprints/staticroutes/docs/assets/img/search.83621669.svg deleted file mode 100644 index 03d8391..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/img/search.83621669.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/10.bca11ca3.js b/shepherd/blueprints/staticroutes/docs/assets/js/10.bca11ca3.js deleted file mode 100644 index 5be8df4..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/10.bca11ca3.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{201:function(t,a,e){"use strict";e.r(a);var s=e(0),n=Object(s.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("div",{staticClass:"content"},[e("h1",{attrs:{id:"toggling-12v-and-5v-power"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#toggling-12v-and-5v-power","aria-hidden":"true"}},[t._v("#")]),t._v(" Toggling 12v and 5v power")]),t._v(" "),e("p",[t._v("Output power at both 12v and 5v can be toggled on and off using your code. This can be done in a couple different ways.")]),t._v(" "),e("h2",{attrs:{id:"toggling-12v-power"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#toggling-12v-power","aria-hidden":"true"}},[t._v("#")]),t._v(" Toggling 12v power")]),t._v(" "),e("p",[t._v("The BrainBox provides 12v power to the Aux 12v port on the side of the BrainBox next to the motors. In your code you can toggle whether this power is being supplied using the "),e("code",[t._v("R.enable_12v")]),t._v(" property as shown below:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ...Your code")]),t._v("\n\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("enable_12v "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ...Rest of your code")]),t._v("\n")])])]),e("p",[t._v("This will disable the Aux 12v port until you re-enable it using "),e("code",[t._v("R.enable_12v = True")]),t._v(".\nYou can also check whether the 12v is currently enabled or disabled.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("enable_12v "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("enable_12v"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Outputs "False"')]),t._v("\n")])])]),e("h2",{attrs:{id:"toggling-5v-power"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#toggling-5v-power","aria-hidden":"true"}},[t._v("#")]),t._v(" Toggling 5v power")]),t._v(" "),e("p",[t._v("The BrainBox supplied 5v power to multiple outputs. These are the Servos (all 0-3), as well as the 5v GPIO pin. You can disable these similarly to the 12v power by using the following code:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ...Your code")]),t._v("\n\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("enable_5v "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ...Rest of your code")]),t._v("\n")])])]),e("p",[t._v("This will disable the Servo ports as well as the 5v GPIO pin until you re-enable them using "),e("code",[t._v("R.enable_5v = True")]),t._v(".\nYou can also check whether the 5v is currently enabled or disabled.")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("enable_5v "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("enable_5v"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# Outputs "False"')]),t._v("\n")])])]),e("h2",{attrs:{id:"enabling-or-disabling-power-by-default"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#enabling-or-disabling-power-by-default","aria-hidden":"true"}},[t._v("#")]),t._v(" Enabling or disabling power by default.")]),t._v(" "),e("p",[t._v("You can set the BrainBox to have 5v and 12v disabled by default using the following code:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("start_enable_5v"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" start_enable_12v"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),e("p",[t._v("You can set both to false as in the example, or alternatively only set one. This will disable the power immediately when the brain loads to blinky, rather than you manually disabling it when the code starts execution.")])])}],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/11.113b5eb5.js b/shepherd/blueprints/staticroutes/docs/assets/js/11.113b5eb5.js deleted file mode 100644 index 2e33223..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/11.113b5eb5.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{194:function(t,e,a){"use strict";a.r(e);var i=a(0),s=Object(i.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),a("p",[t._v("I2C is a great way to a components to your BrainBox. Look at the datasheet for your device which you would like to connect and connect the SDA and SDL to the appropriate pins. You should now be able to send data to your device by using the "),a("a",{attrs:{href:"https://pypi.org/project/smbus2/",target:"_blank",rel:"noopener noreferrer"}},[t._v("SMBus2 python library"),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(3),t._v(" "),a("p",[t._v("If you are interested in the I2C protocol there is a good guide to find out more about how it works "),a("a",{attrs:{href:"http://www.circuitbasics.com/basics-of-the-i2c-communication-protocol/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(4),t._v(" "),a("p",[t._v("You can use USB devices using the "),a("a",{attrs:{href:"https://pyserial.readthedocs.io/en/latest/shortintro.html",target:"_blank",rel:"noopener noreferrer"}},[a("code",[t._v("serial")]),a("OutboundLink")],1),t._v(" library. The connection will probably open on something similar to "),a("code",[t._v("dev/ttyUSB0")]),t._v(" but if you can't find it where you expect then connect the device to a Raspberry Pi running a recent OS image and observe where it appears.")]),t._v(" "),t._m(5),t._v(" "),a("p",[t._v("UART is not enabled by default on the BrainBox and you will need to ask on the forums for us to provide a patch to enable it should you wish to use it.")]),t._v(" "),t._m(6)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"expanding-functionality"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#expanding-functionality","aria-hidden":"true"}},[this._v("#")]),this._v(" Expanding Functionality")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Although the I2C and UART are connected to the Raspberry Pi, they operate at 5.1V not 3.3V. Check that your devices are compatible first!")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"i2c"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i2c","aria-hidden":"true"}},[this._v("#")]),this._v(" I2C")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("You should avoid address 0x08 (8) and 0x68 (104) because these are used by critical system components.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usb","aria-hidden":"true"}},[this._v("#")]),this._v(" USB")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"uart"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#uart","aria-hidden":"true"}},[this._v("#")]),this._v(" UART")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Please ask on the forums for more infomation if you wish to expand your BrainBox.")])])}],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/12.f209ccbd.js b/shepherd/blueprints/staticroutes/docs/assets/js/12.f209ccbd.js deleted file mode 100644 index 66255c9..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/12.f209ccbd.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{173:function(t,s,n){"use strict";n.r(s);var a=n(0),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),n("p",[t._v("The GPIO (General Purpose Input Output) allows you to turn on LEDs, react to button presses, or do just about anything.")]),t._v(" "),n("p",[t._v("Our BrainBox has 4 GPIO pins that you can control. Before you do anything with a pin, you must first set its mode.")]),t._v(" "),n("p",[t._v("There are 4 modes:")]),t._v(" "),n("table",[t._m(1),t._v(" "),n("tbody",[t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),n("tr",[n("td",[t._v("Pullup Input")]),t._v(" "),t._m(5),t._v(" "),n("td",[t._v("Like input, but uses a "),n("router-link",{attrs:{to:"/gpio.html#pull-ups"}},[t._v("weak pullup resistor")])],1)])])]),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),n("p",[t._v("To write a digital signal on pin 0:")]),t._v(" "),t._m(8),n("p",[t._v("To read a digital signal on pin 1:")]),t._v(" "),t._m(9),n("p",[t._v("To read an analog signal on pin 2:")]),t._v(" "),t._m(10),n("p",[t._v("To read a pullup signal on pin 3")]),t._v(" "),t._m(11),t._m(12),t._v(" "),n("p",[t._v("Here's a more complete example:")]),t._v(" "),t._m(13),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),n("p",[t._v("The BrainBox possesses the ability to enable a built-in pull-up resistor on any input pin. This takes a small amount of explanation.")]),t._v(" "),n("p",[t._v("Normally, input pins are not connected to anything - known as “floating”. In this state, they might read high or low, or different values depending on their environment (due to anything from cosmic rays to the wiring in the building). This is obviously not good for consistent control.")]),t._v(" "),n("p",[t._v("Many pieces of off-the-shelf electronics that have some form of standard I/O output will connect this pin to 5V (high) and 0V (low) when required, so this is not a problem. However, for simple electronics, a microswitch for example, you would normally be required to connect a resistor between the input pin and 5V (a pull-up resistor), or between the input pin and 0V (a pull-down resistor) to keep the input in a known state until the switch overrides it by connecting directly to the opposite state.")]),t._v(" "),n("p",[t._v("However, the built-in pull-up resistor alleviates this need. It essentially wires in a resistor connected to 5V, meaning that when this option is enabled, an input pin will “default” to being high. This means you can simply connect a switch between the input pin and a ground pin without any need of resistors - when the switch is open, the pin will read high; when closed, it will read low.")]),t._v(" "),t._m(17)])}),[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"gpio"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#gpio","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO")])},function(){var t=this.$createElement,s=this._self._c||t;return s("thead",[s("tr",[s("th",[this._v("Mode")]),this._v(" "),s("th",[this._v("Python")]),this._v(" "),s("th",[this._v("Description")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("tr",[s("td",[this._v("Digital Output")]),this._v(" "),s("td",[s("code",[this._v("robot.OUTPUT")])]),this._v(" "),s("td",[this._v("Allows you to write a high or low signal")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("tr",[s("td",[this._v("Digital Input")]),this._v(" "),s("td",[s("code",[this._v("robot.INPUT")])]),this._v(" "),s("td",[this._v("Allows you to read a high or low signal")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("tr",[s("td",[this._v("Analog Input")]),this._v(" "),s("td",[s("code",[this._v("robot.INPUT_ANALOG")])]),this._v(" "),s("td",[this._v("Allows you to read a voltage, like a voltmeter")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("td",[s("code",[this._v("robot.INPUT_PULLUP")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),s("p",[this._v("The GPIO are numbered 0-3")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"python"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#python","aria-hidden":"true"}},[this._v("#")]),this._v(" Python")])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-python extra-class"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OUTPUT\nR"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-python extra-class"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-python extra-class"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT_ANALOG\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("analog"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-python extra-class"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT_PULLUP\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Note that this output will be inverted - True when the connnection is open, and False when closed.")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),s("p",[this._v("All modes can be used on all pins. Note that you only need to set this mode once in your code, not every time you read an input or send an output.")])])},function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("div",{staticClass:"language-python extra-class"},[n("pre",{pre:!0,attrs:{class:"language-python"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n\nR "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT\nR"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT_ANALOG\nR"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OUTPUT\nR"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT_PULLUP\n\noutputState "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("False")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Read the values of 0 and 1")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("analog"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Switch output state and send it to 2")]),t._v("\n outputState "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" !outputState\n R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" outputState\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Read the value of 3")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Pause for 2 seconds")]),t._v("\n time"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"blockly"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#blockly","aria-hidden":"true"}},[this._v("#")]),this._v(" Blockly")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The GPIO blocks can be found in the "),s("strong",[this._v("GPIO")]),this._v(" section, and function similarly to the python.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"pull-ups"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pull-ups","aria-hidden":"true"}},[this._v("#")]),this._v(" Pull-ups")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[s("img",{attrs:{src:"/images/capture.png",alt:"An example weak pull up"}})])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/13.5958dc4c.js b/shepherd/blueprints/staticroutes/docs/assets/js/13.5958dc4c.js deleted file mode 100644 index 6541152..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/13.5958dc4c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{193:function(e,t,a){"use strict";a.r(t);var o=a(0),r=Object(o.a)({},(function(){var e=this.$createElement;this._self._c;return this._m(0)}),[function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"challenges"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#challenges","aria-hidden":"true"}},[e._v("#")]),e._v(" Challenges")]),e._v(" "),a("p",[e._v("The following are challenges for you to attempt and might give you a some help for the competition...")]),e._v(" "),a("ol",[a("li",[e._v("Create a program that turns a LED on when a button is pressed.")]),e._v(" "),a("li",[e._v("Create a program that makes the robot move a given distance.")]),e._v(" "),a("li",[e._v("Create a program that makes a robot turn towards the first marker it sees.")]),e._v(" "),a("li",[e._v("Create a program that makes the robot move towards the first marker it sees.")])]),e._v(" "),a("h1",{attrs:{id:"more-challenges"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#more-challenges","aria-hidden":"true"}},[e._v("#")]),e._v(" More challenges")]),e._v(" "),a("p",[e._v("At the launch, we gave teams a PDF of challenges to complete. "),a("a",{attrs:{href:"/images/challenges.pdf"}},[e._v("You can find a\ncopy of that here")]),e._v(".\nNote that quite a few of these require input from the red shirts, so you may have to adapt them to suit what you have available!")]),e._v(" "),a("h1",{attrs:{id:"next-steps"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#next-steps","aria-hidden":"true"}},[e._v("#")]),e._v(" Next Steps")]),e._v(" "),a("p",[e._v("You are now familiar with the RoboCon kit! We recomend that you now start thinking about your strategy for how you will win. Design your robot in little steps, and test along the way - getting a prototype up and rolling is the best way to ensure your robot will be achieving your goals by the time the competition rolls around! So best of luck, and don't delay - you've got some engineering to do...")])])}],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/14.601e8d7c.js b/shepherd/blueprints/staticroutes/docs/assets/js/14.601e8d7c.js deleted file mode 100644 index 825d223..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/14.601e8d7c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{192:function(t,s,e){"use strict";e.r(s);var n=e(0),a=Object(n.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"content"},[t._m(0),t._v(" "),e("p",[t._v("GPIO, or General Purpose Input Output, is the main way you'll interface with simple or obscure bits of hardware. This tutorial will introduce the GPIO system and how to use it.")]),t._v(" "),t._m(1),t._v(" "),e("p",[t._v('On the side of your BrainBox, there are 4 regular pins and a "+5V" and "-" pin. The top of the BrainBox labels which pin corresponds to which number. Different devices need to be plugged into different pins.')]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),e("p",[t._v("Try using a loop to make the light turn on and off every 2 seconds. You'll need the time library from the motors exercise.")]),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._m(9),t._v(" "),e("p",[t._v("Try making a light turn on or off depending on if a button is pressed. An explanation of why it is needed to use "),e("code",[t._v("INPUT_PULLUP")]),t._v(" can be found in the "),e("router-link",{attrs:{to:"/gpio.html#pull-ups"}},[t._v("GPIO documentation")]),t._v(".")],1),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._m(13),t._v(" "),e("p",[t._v("You can also use retroreflective sensors with your robot's GPIO. This can be configured in the code as follows:")]),t._v(" "),t._m(14),t._m(15)])}),[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"gpio"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#gpio","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"gpio-pins"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#gpio-pins","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO Pins")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"led-output"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#led-output","aria-hidden":"true"}},[this._v("#")]),this._v(" LED Output")])},function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),s("p",[this._v("GPIO outputs are already protected by a 1k Ohm current limiting resistor, you can connect LEDs directly!")])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("If you want to put an LED on your robot, for testing or just for looks, you'll need to plug the short side of the LED into the "),s("code",[this._v("-")]),this._v(" (ground) pin, and the long side of the LED into any regular pin (such as 1). Then, use the following code to set up the pin in "),s("code",[this._v("OUTPUT")]),this._v(" mode and turn the LED on:")])},function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# If you're not using GPIO pin 1, change this number to whatever pin you're using.")]),t._v("\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OUTPUT\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"buttons"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#buttons","aria-hidden":"true"}},[this._v("#")]),this._v(" Buttons")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("While your robot hopefully won't be colliding with much, buttons are a good way for a robot to know if it's driven into something. Buttons should be plugged into the - pin and a regular pin (such as 0). Using the "),s("code",[this._v("INPUT_PULLUP")]),this._v(" mode, you can detect when a button is pressed.")])},function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# If you're not using GPIO pin 0, change this number to whatever pin you're using.")]),t._v("\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT_PULLUP\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("not")]),t._v(" R"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pressed"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Not Pressed"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("p",[t._v("Note that "),e("code",[t._v("INPUT_PULLUP")]),t._v(" returns inverted values - "),e("code",[t._v("True")]),t._v(" when it isn't pressed and "),e("code",[t._v("False")]),t._v(" when it is. This means we use "),e("code",[t._v("not")]),t._v(" to invert the output we get back to something more sensible for our use.")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"potentiometers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#potentiometers","aria-hidden":"true"}},[this._v("#")]),this._v(" Potentiometers")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Another form of input is a potentiometer or a variable resistor. Potentiometers should be plugged into the +5V, a regular pin (such as 3) and the - pin. Using "),s("code",[this._v("INPUT_ANALOG")]),this._v(" mode, you can read the voltage output of the resistor (between 0V and 5V).")])},function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nPOT_PIN "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v("\n\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("POT_PIN"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT_ANALOG\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("POT_PIN"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("analog"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"using-sensors-with-retroreflective-tape"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-sensors-with-retroreflective-tape","aria-hidden":"true"}},[this._v("#")]),this._v(" Using sensors with retroreflective tape")])},function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("INPUT\n\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("not")]),t._v(" R"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("gpio"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("digital"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Reflecting!"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n time"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("This is a piece of code, that when run, should detect things very close to the sensor, or reflective objects further away (such as the retroreflective tape in the arena)."),s("br"),this._v("\nNote that the detector also returns "),s("code",[this._v("False")]),this._v(" when it detects something, so "),s("code",[this._v("not")]),this._v(" is used. Retroreflective tape is used in the arena to mark the borders of each quadrant. Using a sensor like this facing downwards can allow your robot to detect when it passes into a new quadrant. This could be used for a whole variety of helpful tasks when navigating the arena. We look forward to seeing your creativity!")])}],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/15.5f711227.js b/shepherd/blueprints/staticroutes/docs/assets/js/15.5f711227.js deleted file mode 100644 index b09bd72..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/15.5f711227.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{191:function(t,s,a){"use strict";a.r(s);var e=a(0),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"content"},[t._m(0),t._v(" "),a("p",[t._v("Your robot is unlikely to score many points if it doesn't go anywhere. This tutorial will show you how to access and turn the motors on your robot.")]),t._v(" "),t._m(1),t._v(" "),a("p",[t._v("First things first, make sure that your robot is not about to drive off a table. Even if you're planning on turning on the spot, it's best to put your robot on the floor in case it does something unexpected.")]),t._v(" "),a("p",[t._v("Next, you'll need to initialise the robot. For this exercise, you'll also need the \"time\" Python library - remember that we used this last chapter to help our camera code along.")]),t._v(" "),t._m(2),t._m(3),t._v(" "),a("div",{staticClass:"tip custom-block"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Motor power is automatically scaled for the 3-6V motors included in the kit, if you are sourcing your own motors then see "),a("router-link",{attrs:{to:"/motors.html"}},[t._v("the motors reference")]),t._v(" for how to allow faster speeds.")],1)]),t._v(" "),t._m(4),t._v(" "),a("p",[t._v("Changing the speed of the motor is easy - just set the motor to a number from -100 to 100. Immediately setting the power to 100 can have unwanted side effects, so we'll start by setting them to half power:")]),t._v(" "),t._m(5),a("p",[t._v("Running this program will either make you move forwards or make your robot turn on the spot, depending on how you have set up the motors. If your motor is spinning, try setting one of the motors to the negative value, spinning it in the other direction, and swap which one is negative until your robot drives forwards in a way you are happy with.")]),t._v(" "),t._m(6),t._v(" "),t._m(7),t._m(8),t._v(" "),a("p",[t._v("To turn the robot, you just need to set one motor going forwards and the second motor going backwards. The following program makes the robot do a little dance - try it out! (Note that if your robot had inverted motors from earlier, you may have differing results)")]),t._v(" "),t._m(9),a("p",[t._v("A final note, even if you set both motors the same power, your robot probably won't drive in a perfectly straight line. This is due to defects in the motors, and unless you get specialised motors, no two motors will have the same offset. How your robot deals with this is up to you!")]),t._v(" "),t._m(10),t._v(" "),a("p",[a("router-link",{attrs:{to:"/connecting.html"}},[t._v("Connecting to the robot")]),t._v(" "),a("br"),t._v(" "),a("router-link",{attrs:{to:"/uploading.html"}},[t._v("Uploading and running code")]),t._v(" "),a("br"),t._v(" "),a("router-link",{attrs:{to:"/editor.html"}},[t._v("Using the editor")]),t._v(" "),a("br"),t._v(" "),a("router-link",{attrs:{to:"/motors.html"}},[t._v("Motors")])],1)])}),[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"making-the-robot-go"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#making-the-robot-go","aria-hidden":"true"}},[this._v("#")]),this._v(" Making The Robot Go")])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"getting-ready"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#getting-ready","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting Ready")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h2",{attrs:{id:"driving-around"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#driving-around","aria-hidden":"true"}},[this._v("#")]),this._v(" Driving Around")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("Now that everything is set up, it's time to set the motors. All the motors are stored in a list inside the Robot variable - to access the first motor, you can use "),s("code",[this._v("R.motors[0]")]),this._v(", the second motor is found with "),s("code",[this._v("R.motors[1]")]),this._v(".")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("The issue with this code is that unfortunately, it will never tell it to stop moving forwards, so hopefully you put it on the floor and it hasn't driven off the table."),s("br"),this._v("\nTo fix this we can set the power of the motors to 0 after a couple of seconds:")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n\ntime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("This is where "),s("code",[this._v("sleep()")]),this._v(" becomes handy. It pauses the execution of your code with the motors still at 50, and so they stay running until we stop them after the "),s("code",[this._v("sleep()")]),this._v(" call ends.")])},function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"language-python extra-class"},[a("pre",{pre:!0,attrs:{class:"language-python"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nspeed "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" speed\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" speed\n\ntime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" speed\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("speed\n\ntime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("speed\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("speed\n\ntime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("speed\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" speed\n\ntime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\nR"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])])},function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"troubleshooting-and-further-reading"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-and-further-reading","aria-hidden":"true"}},[this._v("#")]),this._v(" Troubleshooting and Further Reading")])}],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/16.ddf8cf64.js b/shepherd/blueprints/staticroutes/docs/assets/js/16.ddf8cf64.js deleted file mode 100644 index 773a51e..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/16.ddf8cf64.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{172:function(t,s,o){"use strict";o.r(s);var e=o(0),a=Object(e.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,s=t.$createElement,o=t._self._c||s;return o("div",{staticClass:"content"},[o("h1",{attrs:{id:"servos"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#servos","aria-hidden":"true"}},[t._v("#")]),t._v(" Servos")]),t._v(" "),o("p",[t._v("Servos are a type of motor with internal feedback they can move to a set position. The type of servo you will come across most frequently have a set range of motion, but with precise position control you can do a whole manner of actions within the mechanics of your robot! Servo motors (or anything else you connect to the servo ports of your BrainBox) are controlled by accessing "),o("code",[t._v("R.servos[]")]),t._v(", similar to how motors are accessed.")]),t._v(" "),o("div",{staticClass:"language-python extra-class"},[o("pre",{pre:!0,attrs:{class:"language-python"}},[o("code",[o("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),o("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\n\nR "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("mode "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("PWM_SERVO\n\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n")])])]),o("p",[t._v("However, where the value of a motor determines the "),o("em",[t._v("speed")]),t._v(" it turns, the value of a servo controls the "),o("em",[t._v("position")]),t._v(" it is at on its rotation, with a range of -100 to 100. Try it out on your robot to see which values correspond to each position!")]),t._v(" "),o("div",{staticClass:"tip custom-block"},[o("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),o("p",[t._v("When your robot is turned off, the brain will automatically set all of its servos to the 0 position. Make sure you factor this in when you run your robots!")])])])}],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/17.68044e32.js b/shepherd/blueprints/staticroutes/docs/assets/js/17.68044e32.js deleted file mode 100644 index 887f00d..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/17.68044e32.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{189:function(t,e,s){"use strict";s.r(e);var a=s(0),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("p",[t._v("Your robot can use its camera to see markers to identify tokens and walls. This tutorial will help you make a program that makes the robot output the number of cubes it can see.")]),t._v(" "),t._m(1),t._v(" "),s("p",[t._v('Create a new script called "VisionTest".')]),t._v(" "),s("p",[t._v("Unlike in the previous tutorial, "),s("router-link",{attrs:{to:"/hello-world.html"}},[t._v("Hello World")]),t._v(", the use of the first couple lines of code is important here. So let's break them down:")],1),t._v(" "),t._m(2),t._m(3),t._v(" "),s("p",[s("a",{attrs:{href:"https://www.makeuseof.com/tag/object-oriented-programming-explained/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Here"),s("OutboundLink")],1),t._v(" is a basic introduction into what Object Oriented Programming is.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),s("p",[t._v("Every item in the list contains information about the type of the marker, the distance/angle to the marker, and more! For now all we want to do is to find the number of markers the robot can see, so we just need to print the length of the list:")]),t._v(" "),t._m(7),t._m(8),t._v(" "),s("p",[t._v("The complete code is as follows:")]),t._v(" "),t._m(9),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),s("p",[t._v("Place a few markers infront of the camera on the robot about 10-20cm away and run the code. In the logs the number of markers visible will be outputted, and in addition to the logs, the raw images taken by the camera can be seen, which can be useful for working out if something is blocking the camera.")]),t._v(" "),t._m(13),t._v(" "),s("p",[s("router-link",{attrs:{to:"/connecting.html"}},[t._v("Connecting to the robot")]),t._v(" "),s("br"),t._v(" "),s("router-link",{attrs:{to:"/init-robot.html"}},[t._v("Initalising the robot")]),s("br"),t._v(" "),s("router-link",{attrs:{to:"/editor.html"}},[t._v("Using the editor")]),t._v(" "),s("br"),t._v(" "),s("router-link",{attrs:{to:"/vision.html"}},[t._v("Vision Code")])],1)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"making-the-robot-see"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#making-the-robot-see","aria-hidden":"true"}},[this._v("#")]),this._v(" Making the Robot See")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"initialising-the-robot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#initialising-the-robot","aria-hidden":"true"}},[this._v("#")]),this._v(" Initialising the Robot")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v('This creates a "Robot" object, and places it inside the variable "R". This allows us to use robot functions through the R variable, such as '),e("code",[this._v("R.See()")]),this._v(". If you are using Blockly, the robot is initialised automatically.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"counting-markers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#counting-markers","aria-hidden":"true"}},[this._v("#")]),this._v(" Counting Markers")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v('To make the robot "see" what is in front of it we have to call the function '),e("code",[this._v("R.see()")]),this._v(" and assign the result to a variable. This will set that variable to a list of every marker the robot can see:")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("markers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("markers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# len gets the length of something,")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# in this case a list of all the markers we can see")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If we run this code as it is, it will output the number of markers it can see once and then stop. To make it continue looking we need to put it in a "),e("code",[this._v("while True")]),this._v(" loop, so it will repeat our program forever (or until we turn it off).")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" time\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n markers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("len")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("markers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n time"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("sleep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You'll notice some new lines we snuck in there - an "),e("code",[this._v("import time")]),this._v(" and a "),e("code",[this._v("time.sleep(2)")]),this._v(". The first of these adds another toolset to our code, the "),e("code",[this._v("time")]),this._v(" library. This most notably adds the sleep function we used just now, which pauses the code's execution for the number of seconds specified - in this case two.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The camera takes a moment to process the images it takes. While you can run it without any delay in the loop, this can lead to some buggy behaviour, and will act more like running every 0.6 or so seconds. In general, adding a "),e("code",[this._v("sleep()")]),this._v(" gives you more control over what your robot is doing.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"running-the-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-the-code","aria-hidden":"true"}},[this._v("#")]),this._v(" Running the code")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"troubleshooting-and-further-reading"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-and-further-reading","aria-hidden":"true"}},[this._v("#")]),this._v(" Troubleshooting and Further Reading")])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/18.156352bb.js b/shepherd/blueprints/staticroutes/docs/assets/js/18.156352bb.js deleted file mode 100644 index 00cb2be..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/18.156352bb.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{188:function(t,e,r){"use strict";r.r(e);var n=r(0),o=Object(n.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("p",[t._v("Ready? Let's go!")]),t._v(" "),r("blockquote",[r("p",[t._v("These tutorials will always assume that you have connected to the robot, started on the homepage and completed the previous tutorials. To find out how to connect to your robot click "),r("router-link",{attrs:{to:"/connecting.html"}},[t._v("here")])],1)]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),r("p",[t._v("Both can be used to program a winning robot for the competition and it is up to you which one you develop your robot with. However for the following tutorials, Python will be used.")]),t._v(" "),r("p",[t._v("Details on both these methods can be found in the programming section of the documentation.")]),t._v(" "),r("p",[t._v("If you are running into problems using the editor, more details can be found "),r("router-link",{attrs:{to:"/editor.html"}},[t._v("here")]),t._v(".")],1),t._v(" "),r("p",[t._v("In the editor window write:")]),t._v(" "),t._m(10),t._m(11),t._v(" "),t._m(12),t._v(" "),r("p",[t._v("Click on the green run button in the top right corner:")]),t._v(" "),t._m(13),t._v(" "),r("p",[t._v('The logs should then appear with a friendly "Hello World!"')]),t._v(" "),t._m(14),t._v(" "),r("p",[r("router-link",{attrs:{to:"/connecting.html"}},[t._v("Connecting to the robot")]),t._v(" "),r("br"),t._v(" "),r("router-link",{attrs:{to:"/uploading.html"}},[t._v("Uploading and running code")]),t._v(" "),r("br"),t._v(" "),r("router-link",{attrs:{to:"/editor.html"}},[t._v("Using the editor")])],1)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"hello"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hello","aria-hidden":"true"}},[this._v("#")]),this._v(" Hello")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Welcome to the RoboCon tutorials!"),e("br"),this._v("\nFollowing each of the tasks in this category will start you on your way to getting your robot doing stuff.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"creating-your-first-program"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-your-first-program","aria-hidden":"true"}},[this._v("#")]),this._v(" Creating your first program")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("As this is the first program that your robot will run we'll make it as simple and clichéd as it can get:"),e("br"),this._v('\nWe\'re going to make the robot write "Hello World!" into the output logs!')])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"create-a-new-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-file","aria-hidden":"true"}},[this._v("#")]),this._v(" Create a new file")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/shepherd-editor.png",alt:"Run Button"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("ol",[e("li",[this._v('On the main page click the "Editor" button.')]),this._v(" "),e("li",[this._v('On the tabs click new file and name it something (e.g. "HelloWorld")')])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"writing-the-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#writing-the-code","aria-hidden":"true"}},[this._v("#")]),this._v(" Writing the Code")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("There are two ways to go about writing code for the robot:"),e("br")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ol",[e("li",[this._v("Python - The main language used to program robots with the BrainBox."),e("br")]),this._v(" "),e("li",[this._v("Blockly - A Scratch-like language that allows you to write programs connecting blocks. This will automatically produce a python script that can be run in the robot.")])])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"language-python extra-class"},[r("pre",{pre:!0,attrs:{class:"language-python"}},[r("code",[r("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),r("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),r("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),r("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World!"')]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You don't need to know much about what the first couple lines do - they are covered in later chapters, and do setup for the robot to be able to run. The important bit for you to understand is the last bit - the "),e("code",[this._v("print()")]),this._v(" statement.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"running-the-code"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-the-code","aria-hidden":"true"}},[this._v("#")]),this._v(" Running the code")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/editor-robot-run.png",alt:"Run Button"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"troubleshooting-and-further-reading"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-and-further-reading","aria-hidden":"true"}},[this._v("#")]),this._v(" Troubleshooting and Further Reading")])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/19.99502a83.js b/shepherd/blueprints/staticroutes/docs/assets/js/19.99502a83.js deleted file mode 100644 index 9e43105..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/19.99502a83.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{187:function(t,e,o){"use strict";o.r(e);var s=o(0),n=Object(s.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("div",{staticClass:"content"},[o("h1",{attrs:{id:"initialising-the-robot"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#initialising-the-robot","aria-hidden":"true"}},[t._v("#")]),t._v(" Initialising the Robot")]),t._v(" "),o("p",[t._v("When using Python to program your robot, you must remember to initialise the robot. If you're using Blockly, this is done automatically.")]),t._v(" "),o("p",[t._v("All of the code required to control the Robot is located in the "),o("code",[t._v("robot")]),t._v(" python module.\nTo import the module, and initialise the robot use the following code:")]),t._v(" "),o("div",{staticClass:"language-py extra-class"},[o("pre",{pre:!0,attrs:{class:"language-py"}},[o("code",[o("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\nR "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),o("p",[t._v("When you initialise the robot with "),o("code",[t._v("robot.Robot()")]),t._v(", your code will be paused until the hardware start button or web interface run button is pressed. When the Robot is waiting for either of these buttons to be pressed, the blue user LED will flash on and off.")])])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/2.d0c532a6.js b/shepherd/blueprints/staticroutes/docs/assets/js/2.d0c532a6.js deleted file mode 100644 index d33f286..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/2.d0c532a6.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{167:function(t,i,e){},169:function(t,i,e){"use strict";var n=e(167);e.n(n).a},171:function(t,i,e){"use strict";e.r(i);var n={name:"blockly-snippet",props:{img:{type:String,required:!0},width:{required:!0},height:{required:!0}}},s=(e(169),e(0)),r=Object(s.a)(n,(function(){var t=this.$createElement,i=this._self._c||t;return i("div",{staticClass:"blockly-snippet"},[i("div",{style:{backgroundImage:"url(/images/"+this.img+")",width:this.width+"px",height:this.height+"px"}})])}),[],!1,null,null,null);i.default=r.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/20.fe3fc9bb.js b/shepherd/blueprints/staticroutes/docs/assets/js/20.fe3fc9bb.js deleted file mode 100644 index de873a7..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/20.fe3fc9bb.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{202:function(t,e,i){"use strict";i.r(e);var a=i(0),r=Object(a.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[i("h2",{attrs:{id:"the-robocon-kit"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#the-robocon-kit","aria-hidden":"true"}},[t._v("#")]),t._v(" The RoboCon kit")]),t._v(" "),i("p",[t._v("We hope that the RoboCon kit was useful to you, we ask that all kits are returned to us over the summer so that we can improve them and keep this competition free for years to come.")]),t._v(" "),i("h2",{attrs:{id:"packing-and-returning-the-kit"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#packing-and-returning-the-kit","aria-hidden":"true"}},[t._v("#")]),t._v(" Packing and returning the kit")]),t._v(" "),i("p",[t._v("Shipping can sometimes be quite rough for the kit and so we require the following standards to be adheared to if the kit is to be shipped:")]),t._v(" "),i("ul",[i("li",[t._v("The kit it should be returned inside of the Really Useful Box (RUB) provided")]),t._v(" "),i("li",[t._v("All space inside the RUB should be filled with a packing material (cardboard etc) such that the kit can not move around inside the RUB.")]),t._v(" "),i("li",[t._v("The RUB should be wrapped in a protective layer of cardboard.")]),t._v(" "),i("li",[t._v("Most couriers have rules and regulations regarding shippment of lithium batteries, you must check with any courier beforehand about lithium batteries. In most cases it is required for the batteries to be in a device meaning that the "),i("strong",[t._v("loose batteries provided in the RoboCon kit can not be shipped")]),t._v(". You may find it easier to return the kit to Hills Road in person. Shipment is at your own risk.")]),t._v(" "),i("li",[t._v("Hills Road Robotics will "),i("strong",[t._v("not")]),t._v(" fund the shipment of kit back to us.")])]),t._v(" "),i("p",[t._v("If you plan to return the kit to Hills Road in person then please email "),i("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[t._v("robotics@hrsfc.ac.uk")]),t._v(" and we will organise a time to have someone meet you at reception.")]),t._v(" "),i("h2",{attrs:{id:"items-to-be-returned"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#items-to-be-returned","aria-hidden":"true"}},[t._v("#")]),t._v(" Items to be returned:")]),t._v(" "),i("h3",{attrs:{id:"containers"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#containers","aria-hidden":"true"}},[t._v("#")]),t._v(" Containers:")]),t._v(" "),i("ul",[i("li",[t._v("1 x 12L Really Useful Box")])]),t._v(" "),i("h2",{attrs:{id:"electronics-kit"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#electronics-kit","aria-hidden":"true"}},[t._v("#")]),t._v(" Electronics Kit:")]),t._v(" "),i("ul",[i("li",[t._v("1 BrainBox")]),t._v(" "),i("li",[t._v("1 microservo 9g SG90")]),t._v(" "),i("li",[t._v("1 6 pin GPIO connector")]),t._v(" "),i("li",[t._v("1 2 pin 12V connector")])]),t._v(" "),i("h3",{attrs:{id:"switches"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#switches","aria-hidden":"true"}},[t._v("#")]),t._v(" Switches:")]),t._v(" "),i("ul",[i("li",[t._v("Red switch, black connector: ON/OFF (latching)")]),t._v(" "),i("li",[t._v("Black switch, green connector: Start (momentary)")])]),t._v(" "),i("h3",{attrs:{id:"batteries"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#batteries","aria-hidden":"true"}},[t._v("#")]),t._v(" Batteries:")]),t._v(" "),i("ul",[i("li",[t._v("2 x 12 V LiPo Battery")]),t._v(" "),i("li",[t._v("1 x Turnigy E3 Compact 2S/3S Lipo Charger")]),t._v(" "),i("li",[t._v("1 x Lithium Polymer Charge Pack")])]),t._v(" "),i("h3",{attrs:{id:"computer"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#computer","aria-hidden":"true"}},[t._v("#")]),t._v(" Computer:")]),t._v(" "),i("ul",[i("li",[t._v("1 Tablet computer")]),t._v(" "),i("li",[t._v("1 Charging brick")]),t._v(" "),i("li",[t._v("1 Kettle lead")])]),t._v(" "),i("h3",{attrs:{id:"note"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#note","aria-hidden":"true"}},[t._v("#")]),t._v(" Note")]),t._v(" "),i("p",[t._v("Please return any surviving parts of the minibot")])])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/21.36e5a51c.js b/shepherd/blueprints/staticroutes/docs/assets/js/21.36e5a51c.js deleted file mode 100644 index 3290c84..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/21.36e5a51c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{185:function(t,e,o){"use strict";o.r(e);var n=o(0),r=Object(n.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("div",{staticClass:"content"},[t._m(0),t._v(" "),o("p",[t._v("Python is an interpreted high-level programming language for general-purpose programming. First released in 1991, Python has a design philosophy that emphasises code readability, notably using significant whitespace.")]),t._v(" "),t._m(1),t._v(" "),o("p",[t._v("There are many resources online for learning Python, here are a few good ones that we would recommend:")]),t._v(" "),o("ul",[o("li",[o("a",{attrs:{href:"https://www.studentrobotics.org/docs/tutorials/python",target:"_blank",rel:"noopener noreferrer"}},[t._v("Student Robotics' tutorial"),o("OutboundLink")],1),t._v(" has a tutorial called Python: a whirlwind tour. This was written for Student Robotics competitors (a similar competition to the one you are taking part in), and explains the basics while trying not to overwhelm you.")]),t._v(" "),o("li",[o("a",{attrs:{href:"https://www.csnewbs.com/python",target:"_blank",rel:"noopener noreferrer"}},[t._v("CSNewbs"),o("OutboundLink")],1),t._v(" has a very comprehensive tutorial, that takes you through from the basics to the slightly more advanced. The later chapters cover things like File Handling and UIs - you shouldn't be using these on your brains, but go wild on your own devices!")]),t._v(" "),o("li",[o("a",{attrs:{href:"http://docs.python.org/tutorial/",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Official Python Tutorial"),o("OutboundLink")],1),t._v(" can be pretty handy - the good stuff starts at chapter 3, but you should at least skim the stuff before it; there is a lot there and it may be a little overwhelming.")]),t._v(" "),o("li",[t._v("A number of tutorials for beginners are linked to from "),o("a",{attrs:{href:"http://wiki.python.org/moin/BeginnersGuide/NonProgrammers",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),o("OutboundLink")],1),t._v(".")]),t._v(" "),o("li",[o("a",{attrs:{href:"https://learnxinyminutes.com/docs/python/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Learn X in Y minutes"),o("OutboundLink")],1),t._v(" is quite nice if you've programmed before in another language and just want to learn the syntax. (Tip: If you're trying to complete the challenges, here's where we say you can learn Python in \"Y\" minutes)")]),t._v(" "),o("li",[o("a",{attrs:{href:"https://docs.python.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("The Official Docs"),o("OutboundLink")],1),t._v(" can be handy, but a little dense! Give them a shot, but don't worry if you can't find what you are looking for.")])]),t._v(" "),t._m(2)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"learning-python"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#learning-python","aria-hidden":"true"}},[this._v("#")]),this._v(" Learning Python")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("If you don't know Python, why not try out Blockly? It's just as powerful, but lets you use a simple drag and drop interface to program the robot - and if you have any struggles with it, why not drop us "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("an email")]),this._v("! We want to make it as easy for you to get started as possible.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Running code on your brain may have unintended side effects if it does not call "),e("code",[this._v("import robot")]),this._v(", and doesn't create a robot object ("),e("code",[this._v("R = robot.Robot()")]),this._v("). Its best to leave those lines in, even if you don't need to run anything related to the hardware on the brain.")])])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/22.23bffa63.js b/shepherd/blueprints/staticroutes/docs/assets/js/22.23bffa63.js deleted file mode 100644 index 95ade03..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/22.23bffa63.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{184:function(t,e,r){"use strict";r.r(e);var n=r(0),a=Object(n.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),r("table",[t._m(3),t._v(" "),r("tbody",[r("tr",[r("td",[r("a",{attrs:{href:"https://chardet.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("chardet"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("2018.8.24")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://entrypoints.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("entrypoints"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("0.3")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://www.gevent.org/contents.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("gevent"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("21.8.0")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://gpiozero.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("gpiozero"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.6.2")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://greenlet.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("greenlet"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.1.1")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://keyring.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("keyrings"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("17.1.1")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://numpy.org/doc/1.21",target:"_blank",rel:"noopener noreferrer"}},[t._v("numpy"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.21.2")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://picamera.readthedocs.io/en/release-1.13/",target:"_blank",rel:"noopener noreferrer"}},[t._v("picamera"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.13")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://pillow.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"}},[t._v("pillow"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("8.3.2")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://pluggy.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"}},[t._v("pluggy"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.0.0")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://pycairo.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("pycairo"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.20.1")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://pygobject.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("pygobject"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("3.30.4")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://pyserial.readthedocs.io/en/latest/",target:"_blank",rel:"noopener noreferrer"}},[t._v("pyserial"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("3.5")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://sourceforge.net/p/raspberry-gpio-python/wiki/Home/",target:"_blank",rel:"noopener noreferrer"}},[t._v("rpi.gpio"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("0.7.0")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://docs.scipy.org/doc/scipy/",target:"_blank",rel:"noopener noreferrer"}},[t._v("scipy"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("1.7.1")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://buildmedia.readthedocs.org/media/pdf/smbus2/latest/smbus2.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("smbus2"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("0.4.1")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"https://www.sigmdel.ca/michel/ha/rpi/dnld/draft_spidev_doc.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("spidev"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("3.5")])]),t._v(" "),r("tr",[r("td",[r("a",{attrs:{href:"http://wiringpi.com/reference/",target:"_blank",rel:"noopener noreferrer"}},[t._v("wiringpi"),r("OutboundLink")],1)]),t._v(" "),r("td",[t._v("2.60.1")])])])]),t._v(" "),t._m(4)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"libraries"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#libraries","aria-hidden":"true"}},[this._v("#")]),this._v(" Libraries")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("if you wish to use a library that is not on the list, please contact us.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"the-following-libraries-are-installed-on-your-robot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-following-libraries-are-installed-on-your-robot","aria-hidden":"true"}},[this._v("#")]),this._v(" the following libraries are installed on your robot.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",[this._v("Package")]),this._v(" "),e("th",[this._v("Version")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("documentation might not align with used version, please verify documentation is set to the specified version as that is what is installed on the robot")])])}],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/23.e9aee0fa.js b/shepherd/blueprints/staticroutes/docs/assets/js/23.e9aee0fa.js deleted file mode 100644 index 4a12a65..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/23.e9aee0fa.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{183:function(t,s,e){"use strict";e.r(s);var r=e(0),a=Object(r.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[s("h1",{attrs:{id:"markers"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#markers","aria-hidden":"true"}},[this._v("#")]),this._v(" Markers")]),this._v(" "),s("p",[this._v("You can download a zip of all of the markers "),s("a",{attrs:{href:"/docs/markers.zip"}},[this._v("here")]),this._v(".")])])}],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/24.530cce0c.js b/shepherd/blueprints/staticroutes/docs/assets/js/24.530cce0c.js deleted file mode 100644 index 3c27389..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/24.530cce0c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{182:function(t,s,i){"use strict";i.r(s);var e=i(0),a=Object(e.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"content"},[this._m(0),this._v(" "),this._m(1),this._v(" "),s("Embed",{attrs:{"aspect-ratio":1/1.4142}},[s("iframe",{attrs:{width:"100",height:"141",src:"/images/MiniBot%20assembly%20instruction%20manual%20.pdf"}})])],1)}),[function(){var t=this.$createElement,s=this._self._c||t;return s("h1",{attrs:{id:"minibot-assembly"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#minibot-assembly","aria-hidden":"true"}},[this._v("#")]),this._v(" Minibot Assembly")])},function(){var t=this.$createElement,s=this._self._c||t;return s("p",[this._v("You can download instructions on how to make your minibot "),s("a",{attrs:{href:"/images/MiniBot%20assembly%20instruction%20manual%20.pdf"}},[this._v("here")]),this._v(".")])}],!1,null,null,null);s.default=a.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/25.2af56fb1.js b/shepherd/blueprints/staticroutes/docs/assets/js/25.2af56fb1.js deleted file mode 100644 index 0d4e20a..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/25.2af56fb1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{181:function(t,s,o){"use strict";o.r(s);var a=o(0),e=Object(a.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,s=t.$createElement,o=t._self._c||s;return o("div",{staticClass:"content"},[o("h1",{attrs:{id:"motors"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#motors","aria-hidden":"true"}},[t._v("#")]),t._v(" Motors")]),t._v(" "),o("p",[t._v("Motors can be used for all sorts of things, besides just moving your robot. For instance, they could also be used as part of a mechanism to collect cubes. However you decide to use them, they're really simple to control.")]),t._v(" "),o("p",[t._v("When you control motors, you can choose how much power you want to give them. This is expressed as a percentage, so 0% means a stopped motor and 100% means a motor at full power.")]),t._v(" "),o("div",{staticClass:"tip custom-block"},[o("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),o("p",[t._v("If you have large motors you should avoid using 100% power when the motor is stalled or stationary, otherwise the rush of current may cause the robot to shut down the motor output. Instead of jumping from 0% to 100% start at a lower value such as 50% and work your way up.")])]),t._v(" "),o("p",[t._v("If you want to spin your motors in reverse, just stick a negative sign in front of your percentage.")]),t._v(" "),o("h2",{attrs:{id:"python"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#python","aria-hidden":"true"}},[t._v("#")]),t._v(" Python")]),t._v(" "),o("p",[t._v("You can control motors using the "),o("code",[t._v("motors")]),t._v(" property of the "),o("code",[t._v("Robot")]),t._v(" object. To set the power of the first motor to 60% use:")]),t._v(" "),o("div",{staticClass:"language-python extra-class"},[o("pre",{pre:!0,attrs:{class:"language-python"}},[o("code",[t._v("R"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),t._v("\n")])])]),o("p",[t._v("Remember that indexes start at 0; To control the second motor instead, replace "),o("code",[t._v("motors[0]")]),t._v(" with "),o("code",[t._v("motors[1]")]),t._v(".")]),t._v(" "),o("p",[t._v("To stop both motors:")]),t._v(" "),o("div",{staticClass:"language-python extra-class"},[o("pre",{pre:!0,attrs:{class:"language-python"}},[o("code",[t._v("R"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),o("p",[t._v("Here's a more complete example:")]),t._v(" "),o("div",{staticClass:"language-python extra-class"},[o("pre",{pre:!0,attrs:{class:"language-python"}},[o("code",[o("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),o("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set motor 1 to 60% power")]),t._v("\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),t._v("\n\n"),o("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set motor 2 to 60% power in the backwards direction")]),t._v("\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),t._v("\n\n"),o("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# turn both motors off")]),t._v("\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\nR"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("motors"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),o("div",{staticClass:"tip custom-block"},[o("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),o("p",[t._v("By default the BrainBox is designed to work safely with the TT motors supplied, these are 6V motors. If you choose to use motors that have a different nominal voltage, then you can specify this when initalising the robot object. For example when using 9V motors:")]),t._v(" "),o("div",{staticClass:"language-python extra-class"},[o("pre",{pre:!0,attrs:{class:"language-python"}},[o("code",[t._v("R "),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("max_motor_voltage"),o("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),o("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),o("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),o("p",[t._v("We do not recommend running motors above their design voltage, it may (sometimes dramatically) shorten the lifespan of your motors. If you choose to overvolt your motors you should be prepared to swap them with spares and design your robot to ensure you have access to replace them.")])]),t._v(" "),o("h2",{attrs:{id:"blockly"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#blockly","aria-hidden":"true"}},[t._v("#")]),t._v(" Blockly")]),t._v(" "),o("p",[t._v("Blocks for controlling motors can be found in the "),o("strong",[t._v("Movement")]),t._v(" section. It follows a similar structure to how the python is layed out, with motors being set to a value between -100 and 100 to control their rotation speed.")])])}],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/26.9bdb8712.js b/shepherd/blueprints/staticroutes/docs/assets/js/26.9bdb8712.js deleted file mode 100644 index c59a826..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/26.9bdb8712.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{180:function(t,e,o){"use strict";o.r(e);var r=o(0),i=Object(r.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),o("ol",[o("li",[o("p",[t._v("Download the patch from the email we sent, or our "),o("a",{attrs:{href:"https://robocon.uk/blog",target:"_blank",rel:"noopener noreferrer"}},[t._v("blog"),o("OutboundLink")],1),t._v(", onto the computer you will be connecting your BrainBox to.")])]),t._v(" "),o("li",[o("p",[o("router-link",{attrs:{to:"/turning-everything-on.html"}},[t._v("Turn on")]),t._v(" and "),o("router-link",{attrs:{to:"/connecting.html"}},[t._v("connect")]),t._v(" to your robot.")],1)]),t._v(" "),o("li",[o("p",[t._v("Navigate to the editor by visiting "),o("a",{attrs:{href:"http://robot.local/",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://robot.local/"),o("OutboundLink")],1),t._v(" and clicking the orange button")])]),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10)]),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),o("p",[t._v("This joke is just pomme de terrible.")])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"patching-the-robot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#patching-the-robot","aria-hidden":"true"}},[this._v("#")]),this._v(" Patching the Robot")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("An important part of looking after your robot is making sure its software is up to date. Over time "),e("strong",[this._v("RoboCon")]),this._v(" may release patches that allow you to update your robot. Follow the steps below to bring your robot up to date.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"steps-to-patch"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-patch","aria-hidden":"true"}},[this._v("#")]),this._v(" Steps to Patch")])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("Click the upload button (indicated below).")]),this._v(" "),e("p",[e("img",{attrs:{src:"/images/upload-button.png",alt:""}})])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("Navigate to where you have saved the patch and click OK.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("Select the patch file in the left-hand panel. The patch will show on the code view as Base64 encoded data (random-looking text characters).")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v('Click the "Run" button (green arrow on the right-hand panel).')]),this._v(" "),e("p",[e("img",{attrs:{src:"/images/run-button.jpg",alt:""}})])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("After a few moments, your BrainBox should reboot, and the LED will either turn off or remain on. You will lose connection with it while it does this. "),e("strong",[this._v("Do not turn off your BrainBox")]),this._v(" - the LED may stay off for a couple minutes.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("The BrainBox LED will eventually start flashing again to show it has rebooted successfully.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("If your PC has not automatically connected, connect to it using the WiFi. Once reconnected, refresh your browser and open a project from the left-hand side of the editor. Check that the patch version is correct in the right-hand panel.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[e("p",[this._v("If you have any issues, please "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("contact us")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Your robot will restart as part of the patching process, so you will lose connectivity with it for about half a minute. Your laptop should automatically reconnect to the robot when it turns back on. If you cannot connect to your robot, please "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("contact us")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"this-patch-s-passphrase-is"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#this-patch-s-passphrase-is","aria-hidden":"true"}},[this._v("#")]),this._v(" This patch's passphrase is:")])}],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/27.a45c4b84.js b/shepherd/blueprints/staticroutes/docs/assets/js/27.a45c4b84.js deleted file mode 100644 index e6a1045..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/27.a45c4b84.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{179:function(t,e,i){"use strict";i.r(e);var s=i(0),o=Object(s.a)({},(function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),i("p",[t._v("When started, using the start button the robot will default to running the last piece of code written in the editor. In some cases at the competition it can be useful to be able to run code from a USB stick.")]),t._v(" "),t._m(5),t._v(" "),i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("Code copied from USB sticks is not "),i("a",{attrs:{href:"https://en.wikipedia.org/wiki/Lint_%28software%29",target:"_blank",rel:"noopener noreferrer"}},[t._v("Linted"),i("OutboundLink")],1),t._v(', sufficiently broken code may crash not just the user code, but also the web interface preventing the robot from reaching "Blinky". See '),i("router-link",{attrs:{to:"/troubleshooting.html#troubleshooting"}},[t._v("troubleshooting")]),t._v(" for details about what the LEDs mean. It is highly recommended for users to export working code from the editor to the USB stick rather than editing code directly. See "),i("router-link",{attrs:{to:"/troubleshooting.html#the-brainbox-appears-to-power-up-but-i-can-t-connect-to-the-website-and-the-blue-led-lights-but-never-starts-flashing"}},[t._v("troubleshooting")]),t._v(" for how to recover a robot which does not boot to Blinky.")],1)]),t._v(" "),t._m(6),t._v(" "),i("p",[t._v("When running your robot code you can see the logs from the robot in the editor. Sometimes it's useful to be able to view the logs later to analyse what happened.")]),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),i("p",[t._v("These can safely be ignored unless you also see them on the web interface.")]),t._v(" "),t._m(11),t._v(" "),i("p",[t._v("Every time the robot takes a picture it is updated on the web interface, during development it is occasionally useful to be able to also keep a log of pictures that have been analysed to check camera focus, motion blur etc.")]),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),i("p",[t._v("When the robot boots, it loads a default image which is displayed until the robot takes a picture, in the arena these images are displayed on an overhead projector. You can change the default image.")]),t._v(" "),t._m(14),t._v(" "),t._m(15)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"usb-tricks"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usb-tricks","aria-hidden":"true"}},[this._v("#")]),this._v(" USB Tricks")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/usbstick.jpg",alt:"USB Stick"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("The BrainBox only checks for the presence of USB sticks at boot - only plug and unplug USB sticks when the BrainBox is off (front panel blue light off).")])])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticClass:"warning custom-block"},[i("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),i("p",[t._v("During the competition "),i("strong",[t._v("RoboCon")]),t._v(" requires unrestricted access to at least one USB port. If you are running a "),i("strong",[t._v("red BrainBox")]),t._v(", only one USB port is available, and this must be unused during the competition.\nIf you have a "),i("strong",[t._v("green BrainBox")]),t._v(" and want to use a USB stick during the competition it must leave enough space around at least one port to insert our low profile arena stick.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"running-your-code-from-a-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#running-your-code-from-a-usb","aria-hidden":"true"}},[this._v("#")]),this._v(" Running your code from a USB:")])},function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("ol",[i("li",[t._v("Place a file called "),i("code",[t._v("main.py")]),t._v(" or "),i("code",[t._v("code.zip")]),t._v(" (which must include a file called "),i("code",[t._v("main.py")]),t._v(") in the root directory of the USB stick on another computer.")]),t._v(" "),i("li",[t._v("Turn on the robot using the red power button.")]),t._v(" "),i("li",[t._v("The file will be automatically copied from the USB stick")]),t._v(" "),i("li",[t._v("Press the black start button")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"getting-logs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-logs","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting Logs")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("ul",[e("li",[this._v("Be careful when reusing USB sticks to avoid accidentally running code from the USB Stick!")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ol",[e("li",[this._v("Insert a USB stick in the robot before turning it on.")]),this._v(" "),e("li",[this._v("The log file will be automatically written to the USB stick as "),e("code",[this._v("logs.txt")])]),this._v(" "),e("li",[this._v("Remember to fully power down the robot before removing the USB stick")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("ul",[e("li",[this._v("Logs are collected whatever way the code is run, but only the most recent logs are preserved")]),this._v(" "),e("li",[this._v("The log files are also collected during system shutdown leading to worrying messages like:")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v('Exception in thread Thread-2:\nTraceback (most recent call last):\n File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner\n self.run()\n File "/usr/lib/python2.7/threading.py", line 754, in run\n self.\\_\\_target(\\*self.\\_\\_args, \\**self.__kwargs)\n File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site\n self.run()\n File "/usr/lib/python2.7/threading.py", line 754, in run\n self.\\_\\_target(\\*self.\\_\\_args, \\**self.__kwargs)\n -packages/robot/wrapper.py", line 251, in wait_start_blink\n self._internal.set_status_led(v)\n File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site-packages/robot/greengiant.py", line 87, in set_status_led\n self._bus.write_byte_data(_GG_I2C_ADDR, _GG_STATUS, int(on))\n File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site-packages/smbus2/smbus2.py", line 377, in write_byte_data\n ioctl(self.fd, I2C_SMBUS, msg)\nIOError: \\[Errno 121] Remote I/O error\n')])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"collecting-images-and-raw-analysis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#collecting-images-and-raw-analysis","aria-hidden":"true"}},[this._v("#")]),this._v(" Collecting images and raw analysis")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ol",[e("li",[this._v('Add a file with the name "collect_images.txt" to the USB stick to collect the images')]),this._v(" "),e("li",[this._v('Add a file with the name "log_markers.txt" to the USB stick to collect analysis of images')]),this._v(" "),e("li",[this._v("Insert the stick before turning the robot on")]),this._v(" "),e("li",[this._v("Remember to fully shut down the robot before removing the USB stick\nWARNING: Collecting all images may slow down the processing time from your robot - Use with care!")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"updating-your-team-image"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#updating-your-team-image","aria-hidden":"true"}},[this._v("#")]),this._v(" Updating your team image")])},function(){var t=this.$createElement,e=this._self._c||t;return e("ol",[e("li",[this._v('Save your Image as 440x330 pixels in jpeg format onto the USB stick as "team_logo.jpg"')]),this._v(" "),e("li",[this._v("Boot the robot once to install the image")]),this._v(" "),e("li",[this._v("Fully shut down the robot")]),this._v(" "),e("li",[this._v("The image will be used from the next time the robot is booted")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("We may ask that your image includes either a Team Name or your institution (e.g. Systemetric or Hills Road Sixth Form College) to assist the Marshalls, but if you have a iconic robot design then we may waive this rule")])])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/28.5a32b60a.js b/shepherd/blueprints/staticroutes/docs/assets/js/28.5a32b60a.js deleted file mode 100644 index d744f17..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/28.5a32b60a.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{178:function(t,s,e){"use strict";e.r(s);var a=e(0),n=Object(a.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"content"},[e("h1",{attrs:{id:"servos"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#servos","aria-hidden":"true"}},[t._v("#")]),t._v(" Servos")]),t._v(" "),e("p",[t._v("Servos are a bit like motors, except their position is fixed. This is useful for building an arm mechanism that grabs cubes, or anything else that has fixed states that it needs to be in.")]),t._v(" "),e("p",[t._v("Similarly to motors, the position of a servo is expressed as a percentage. This can be negative.")]),t._v(" "),e("p",[t._v("Servos are plugged into the "),e("strong",[t._v("Servo")]),t._v(" ports on the BrainBox. The numbers present on each port correspond to the index used in your code.")]),t._v(" "),e("h2",{attrs:{id:"python"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python","aria-hidden":"true"}},[t._v("#")]),t._v(" Python")]),t._v(" "),e("p",[t._v("You can control servos using the "),e("code",[t._v("servos")]),t._v(" property of the "),e("code",[t._v("Robot")]),t._v(" object. To set the first servo to the 50% position use:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[t._v("R"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n")])])]),e("p",[t._v("To control the fourth servo instead, replace "),e("code",[t._v("servos[0]")]),t._v(" with "),e("code",[t._v("servos[3]")]),t._v(". Again, remember that indexes start at 0.")]),t._v(" "),e("p",[t._v("Here's a more complete example:")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set servo 0 to the 50% position")]),t._v("\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set servo 2 to the -100% position")]),t._v("\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set servos 0 & 2 to the default positions")]),t._v("\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\nR"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("servos"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n")])])]),e("h2",{attrs:{id:"blockly"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#blockly","aria-hidden":"true"}},[t._v("#")]),t._v(" Blockly")]),t._v(" "),e("p",[t._v("Blocks for controlling servos can be found in the "),e("strong",[t._v("Movement")]),t._v(" section.")]),t._v(" "),e("h1",{attrs:{id:"default-positions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#default-positions","aria-hidden":"true"}},[t._v("#")]),t._v(" Default positions")]),t._v(" "),e("p",[t._v("Servos default to a starting position 1/2 way through their travel, for some uses teams may need to start with a different resting position to ensure their robot fits within the set sizes, you can set the position that the servo holds while waiting for the start button to be pressed by initilizing the robot object with "),e("code",[t._v("servo_defaults=((servo_number,position)...,(servo_number,position))")])]),t._v(" "),e("p",[t._v("E.g. to set servo 0 to "),e("code",[t._v("100%")]),t._v(" and servo 2 to "),e("code",[t._v("50%")]),t._v(" use")]),t._v(" "),e("div",{staticClass:"language-python extra-class"},[e("pre",{pre:!0,attrs:{class:"language-python"}},[e("code",[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nservo_values "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("50")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\nR "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("servo_defaults"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("servo_values"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/29.2343127b.js b/shepherd/blueprints/staticroutes/docs/assets/js/29.2343127b.js deleted file mode 100644 index 1c28f44..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/29.2343127b.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{177:function(t,e,r){"use strict";r.r(e);var a=r(0),s=Object(a.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),r("p",[t._v("Pressing the start button will cause the battery status LEDs on the front of the BrainBox flash in an upwards direction and the power LED turns green. When the user light starts flashing blue your BrainBox is ready to run code. You can now turn connect to your robot. The user LED will go solid while code is running.")]),t._v(" "),t._m(3),t._v(" "),r("p",[t._v("The BrainBox distributes power to the robot from the battery. It provides both 12V and 5V power out. All power must go through the BrainBox and the fuse should never be replaced.")]),t._v(" "),r("p",[t._v("The On/Off switch also plugs into the BrainBox as well as the Start button which is used to start your robot code running.")]),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),r("p",[t._v("When you are done for the day, press the power button, the user LED will flash rapidly, when this turns off you may unplug the battery.")]),t._v(" "),t._m(9),t._v(" "),r("p",[t._v("On the new brainBox, there is only one USB port. If you want to use something that requires a USB port such as a USB camera, you will need to get your own USB hub.")]),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),r("p",[t._v("All of the BrainBox's GPIO pins are connected in-series with a 1K Ohm resistor, to provide current limiting. This means that you can plug devices such as LED's straight into your BrainBox.")]),t._v(" "),r("p",[t._v("Nominally they operate at 5V but depending on your load the true output will vary. You can calculate the voltage you will get across your load by measuring its resistance, then doing the sum:")]),t._v(" "),r("p",[t._v("(5*Load_resistance)/(Load_resistance+1000)")]),t._v(" "),t._m(12),t._v(" "),r("p",[t._v("We advise against you using analogue inputs with an impedance (You can think of impedance as \"effective resistance in an analogue circuit\") of greater than 9K Ohm's as this will result in values which do not necessarily correspond to what you'd expect.")]),t._v(" "),r("p",[t._v("If you need to sense something with an impedance of more than 9K then you will need to use an Op-amp to buffer the input. If you would like more details on how to do this please contact us on the forums.")]),t._v(" "),t._m(13),t._v(" "),r("p",[t._v("Do not try and sink or source more than 25mA into the BrainBox's GPIO, it may damage some of the internal components.")]),t._v(" "),t._m(14),t._v(" "),r("p",[t._v("PWM (Pulse Width Modulation) is a technique used for sending signals to a device for how much it should do a thing. This could be how fast to spin a motor, or the position to turn an RC Servo to. It does this by sending regular pulses, which vary in width. The length of the pulse tells the device how much to do the thing. If you are interested you can find out more about using PWM for control "),r("a",{attrs:{href:"http://smartmicrocontroller.com/how-to-control-a-servo-using-pulse-width-modulation-pwm/",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),r("OutboundLink")],1),t._v(".")]),t._v(" "),r("p",[t._v("Please note you will not be able to drive large motors over the PWM pin's supplied as the maximum which they can supply is 3A at 5V.")]),t._v(" "),r("p",[t._v("The PWM pins ranges:")]),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),r("p",[t._v("For expansion please see the "),r("router-link",{attrs:{to:"/expanding-functionality.html"}},[t._v("expansion page")]),t._v(".")],1)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"the-brainbox"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-brainbox","aria-hidden":"true"}},[this._v("#")]),this._v(" The BrainBox")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v('The BrainBox is the core of the kit which we provide. In it is all of the electronics and software you need to power a robot. Lets start by turning it on. Take a battery from the kit and plug it into the yellow socket labelled battery, then take a red "power button" and connect that to the black connector along the side of the BrainBox. The battery and start button are both labelled on the red surface of the BrainBox.\n'),e("img",{attrs:{src:"/images/angled.png",alt:"The brain box"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"how-to-turn-everything-on"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-turn-everything-on","aria-hidden":"true"}},[this._v("#")]),this._v(" How to turn everything on")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"power"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#power","aria-hidden":"true"}},[this._v("#")]),this._v(" Power")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"motors-12v-power"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#motors-12v-power","aria-hidden":"true"}},[this._v("#")]),this._v(" Motors & 12V Power")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The specifications for the motor board can be found "),e("a",{attrs:{href:"/docs/CytronBoardDocs.pdf"}},[this._v("here")]),this._v(", however to summarize:")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Condition per channel")]),t._v(" "),r("th",[t._v("Maximum Value")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[t._v("Continuous current")]),t._v(" "),r("td",[t._v("10A")])]),t._v(" "),r("tr",[r("td",[t._v("Peak current (10 seconds)")]),t._v(" "),r("td",[t._v("30A")])]),t._v(" "),r("tr",[r("td",[t._v("Operating Voltage")]),t._v(" "),r("td",[t._v("12V")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("You can toggle the 12V which allows you to turn 12V devices on and off easily. However, this will also cut power to the motor board.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"how-to-turn-everything-off"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-turn-everything-off","aria-hidden":"true"}},[this._v("#")]),this._v(" How to turn everything off")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"usb-s"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usb-s","aria-hidden":"true"}},[this._v("#")]),this._v(" USB's")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"gpio"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gpio","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"gpio-out"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gpio-out","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO - Out")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"gpio-in"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gpio-in","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO - In")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"gpio-limits"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#gpio-limits","aria-hidden":"true"}},[this._v("#")]),this._v(" GPIO - Limits")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"pwm-pins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pwm-pins","aria-hidden":"true"}},[this._v("#")]),this._v(" PWM Pins")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("Value")]),t._v(" "),r("th",[t._v("Pulse")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[t._v("0")]),t._v(" "),r("td",[t._v("1.5ms")])]),t._v(" "),r("tr",[r("td",[t._v("100")]),t._v(" "),r("td",[t._v("2ms")])]),t._v(" "),r("tr",[r("td",[t._v("-100")]),t._v(" "),r("td",[t._v("1ms")])]),t._v(" "),r("tr",[r("td",[t._v("178")]),t._v(" "),r("td",[t._v("2.39ms")])]),t._v(" "),r("tr",[r("td",[t._v("-178")]),t._v(" "),r("td",[t._v("0.61ms")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"pin-out"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pin-out","aria-hidden":"true"}},[this._v("#")]),this._v(" Pin Out")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"io"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#io","aria-hidden":"true"}},[this._v("#")]),this._v(" IO")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/powerconnector.png",alt:"USB's"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"motors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#motors","aria-hidden":"true"}},[this._v("#")]),this._v(" Motors")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/brainboxmotors.png",alt:"Motors"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"front"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#front","aria-hidden":"true"}},[this._v("#")]),this._v(" Front")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/redpanel.png",alt:"Front"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"expansion-i2c-uart-usb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#expansion-i2c-uart-usb","aria-hidden":"true"}},[this._v("#")]),this._v(" Expansion I2C, UART & USB")])}],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/3.285ebf03.js b/shepherd/blueprints/staticroutes/docs/assets/js/3.285ebf03.js deleted file mode 100644 index 040a690..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/3.285ebf03.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{166:function(t,n,e){},168:function(t,n,e){"use strict";var a=e(166);e.n(a).a},186:function(t,n,e){"use strict";e.r(n);var a={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,n){var e=n.props,a=n.slots;return t("span",{class:["badge",e.type,e.vertical]},e.text||a().default)}},r=(e(168),e(0)),i=Object(r.a)(a,void 0,void 0,!1,null,"099ab69c",null);n.default=i.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/30.61a20ca4.js b/shepherd/blueprints/staticroutes/docs/assets/js/30.61a20ca4.js deleted file mode 100644 index f540c6d..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/30.61a20ca4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{176:function(t,e,s){"use strict";s.r(e);var a=s(0),r=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("p",[t._v("Here are a few "),s("em",[t._v("common")]),t._v(" issues you might have and some solutions to them. Student Robotics has a "),s("a",{attrs:{href:"https://studentrobotics.org/docs/troubleshooting/",target:"_blank",rel:"noopener noreferrer"}},[t._v("similar section"),s("OutboundLink")],1),t._v(" on their website which is also relevant.")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),s("p",[t._v('The BrainBox will automatically cut power to the 12V socket and the motor outputs if it detects a current surge exceeding 20A. When this happens, the centre LED ("Error/Wait") next to where the battery LEDS are will flash red. First disconnect the motors and power cycle the BrainBox to see if this resolves the problem. If it does, then your motors are probably too large.')]),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),s("p",[t._v("When you call R.see() the camera preview in the top right should show you what the camera can see. If this image is consistently blurred, incorrect looking, or not loading, try placing some markers in front of the camera and try:")]),t._v(" "),t._m(17),t._m(18),t._v(" "),t._m(19),t._v(" "),t._m(20),t._v(" "),s("p",[t._v("We can post kits from Hills Road however you will need to cover the costs of shipping. To return kits, see "),s("router-link",{attrs:{to:"/kit-list-of-parts.html"}},[t._v("Kit List of Parts")])],1),t._v(" "),t._m(21),t._v(" "),s("p",[t._v("The patch is an update which improve your BrainBox, by adding more docs, more blocks to blocky, faster boot times and more! To patch your robot please follow the instructions "),s("router-link",{attrs:{to:"/patching-the-robot.html"}},[t._v("here")]),t._v(".")],1),t._v(" "),t._m(22),t._v(" "),s("p",[t._v("The Raspberry Pi does not keep time when it is off and so has no way of knowing how much time has passed since it was turned off. This should not affect your code.")])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting","aria-hidden":"true"}},[this._v("#")]),this._v(" Troubleshooting")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"i-ve-connected-a-battery-and-the-power-switch-to-the-black-connector-but-never-get-any-lights-on-the-brainbox"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-ve-connected-a-battery-and-the-power-switch-to-the-black-connector-but-never-get-any-lights-on-the-brainbox","aria-hidden":"true"}},[this._v("#")]),this._v(" I've connected a battery and the power switch to the black connector but never get any lights on The BrainBox.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Unless the battery is really very low the front led will blink very briefly when the switch is first pressed. If this happens you need to charge the battery. The BrainBox will not switch on at all when the voltage of the battery is very low. If the battery is freshly charged, it's possible that the switch has failed or become internally disconnected. For testing purposes, you can swap the power switch for a single piece of wire. NOTE: at the competition, you must have a red power switch to control your robot as per the rules. Finally - in exceptional circumstances the fuse in the cable may have failed, if this has happened then there must have been some terminal problem internal to the BrainBox - "),e("a",{attrs:{href:"mailto:robotics@hillsroad.ac.uk"}},[this._v("contact us")]),this._v(" for instructions.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-brainbox-appears-to-power-up-but-i-can-t-connect-to-the-website-and-the-blue-led-lights-up-but-never-starts-flashing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-brainbox-appears-to-power-up-but-i-can-t-connect-to-the-website-and-the-blue-led-lights-up-but-never-starts-flashing","aria-hidden":"true"}},[this._v("#")]),this._v(" The BrainBox appears to power up, but I can't connect to the website and the blue LED lights up but never starts flashing.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("This can happen if erroneous code which does not start with "),e("code",[this._v("R = robot.Robot()")]),this._v(" is uploaded to The BrainBox. If you think this may have happened, download "),e("a",{attrs:{href:"/docs/main.py"}},[this._v("this file")]),this._v(" and place it on a USB stick. Put the USB stick into The BrainBox and turn the robot on normally. Wait 5 minutes, if you do not at this point get the flashing blue light, "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("contact us")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Using this file will overwrite the current robot code. It will not touch any other files you have stored in the editor.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"i-ve-connected-a-battery-and-the-power-switch-to-the-black-connector-but-never-get-any-lights-on-the-brainbox-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-ve-connected-a-battery-and-the-power-switch-to-the-black-connector-but-never-get-any-lights-on-the-brainbox-2","aria-hidden":"true"}},[this._v("#")]),this._v(" I've connected a battery and the power switch to the black connector but never get any lights on the Brainbox")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If the battery is fresh, it's possible that the switch has failed or become internally disconnected. For testing purposes, you can swap the power switch for a single piece of wire. NOTE: at the competition, you must have a red power switch to control your robot as per the rules. Finally - in exceptional circumstances the fuse in the cable may have failed, if this has happened then there must have been some terminal problem internal to the BrainBox - "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("contact us")]),this._v(" for instructions.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-brainbox-appears-to-power-up-the-blue-led-light-flashes-but-i-cannot-connect-to-it-using-the-wifi"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-brainbox-appears-to-power-up-the-blue-led-light-flashes-but-i-cannot-connect-to-it-using-the-wifi","aria-hidden":"true"}},[this._v("#")]),this._v(" The BrainBox appears to power up, the blue LED light flashes but I cannot connect to it using the WiFi.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("We apologise for the poor choice of font, zeroes and capital-o's can be confused as can capital-i's and number ones. Try swapping these. If this does not help, or the status LEDs stop behaving as expected, try restarting your brain. If the issue persists, "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("contact us")]),this._v(" for further advice.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-brainbox-appears-to-power-up-i-can-connect-to-it-with-wifi-but-am-unable-to-reach-the-web-interface"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-brainbox-appears-to-power-up-i-can-connect-to-it-with-wifi-but-am-unable-to-reach-the-web-interface","aria-hidden":"true"}},[this._v("#")]),this._v(" The BrainBox appears to power up, I can connect to it with WiFi, but am unable to reach the web interface.")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("p",[t._v("Some modern browsers default to a web search if they do not understand the web address. Try putting "),s("code",[t._v("http://")]),t._v(" in front of the address, e.g. "),s("code",[t._v("http://robot.local")]),t._v(" instead of "),s("code",[t._v("robot.local")]),t._v(". If this does not help, or the status LEDs stop behaving as expected, try restarting your brain. If the issue persists, "),s("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[t._v("contact us")]),t._v(" for further advice.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"i-ve-connected-to-the-web-interface-and-can-run-code-but-my-motors-never-turn-on"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-ve-connected-to-the-web-interface-and-can-run-code-but-my-motors-never-turn-on","aria-hidden":"true"}},[this._v("#")]),this._v(" I've connected to the web interface and can run code, but my motors never turn on.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("It is possible to enable/disable this power output from software. When the output is disabled, there will be no light at all visible through this hole. If you can see no light through the hole when the robot is running code check that you have not disabled the motor output by uploading a "),e("a",{attrs:{href:"/docs/simple.py"}},[this._v("simple file")]),this._v(" and running it.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"i-m-trying-to-read-an-analog-value-from-gpios-but-i-m-getting-strange-values"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-m-trying-to-read-an-analog-value-from-gpios-but-i-m-getting-strange-values","aria-hidden":"true"}},[this._v("#")]),this._v(" I'm trying to read an analog value from GPIOs, but I'm getting strange values.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Check you're actually reading the pin you're trying to read. "),e("code",[this._v("R.gpio[0]")]),this._v(" is Pin 0, "),e("code",[this._v("R.gpio[3]")]),this._v(" is Pin 3, etc. If everything's connected correctly, try setting the other pins to output and writing "),e("code",[this._v("False")]),this._v(" to them.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"r-see-doesn-t-seem-to-work"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#r-see-doesn-t-seem-to-work","aria-hidden":"true"}},[this._v("#")]),this._v(" R.see() doesn't seem to work.")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-py extra-class"},[s("pre",{pre:!0,attrs:{class:"language-py"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If this prints out the markers you placed in front of the robot in the debug console, the issue is most likely just with the editor's camera preview. "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("Contact us")]),this._v(" if the issue persists, but this shouldn't prevent your robot from running the code.\nHowever, if the robot cannot find markers, then the camera itself is most likely having problems. Contact us about changing the focus of the camera. Note that the robot being in motion may add blur to the images taken, and prevent the marker detection system from functioning.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Calling "),e("code",[this._v("R.see()")]),this._v(" at a high rate (with a sleep of less than 2 seconds between each call, or no sleep at all) may result in issues with the camera preview such as frames being dropped or blurred. Try slowing down your loop to see if this helps with the issue.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"can-you-post-a-kit-to-or-from-hills-road"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-you-post-a-kit-to-or-from-hills-road","aria-hidden":"true"}},[this._v("#")]),this._v(" Can you post a kit to or from Hills Road")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"what-is-the-patch-and-how-do-i-install-it"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-patch-and-how-do-i-install-it","aria-hidden":"true"}},[this._v("#")]),this._v(" What is the patch and how do I install it?")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"why-is-the-time-wrong"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-is-the-time-wrong","aria-hidden":"true"}},[this._v("#")]),this._v(" Why is the time wrong")])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/31.80129410.js b/shepherd/blueprints/staticroutes/docs/assets/js/31.80129410.js deleted file mode 100644 index 5ab7c64..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/31.80129410.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{175:function(t,e,n){"use strict";n.r(e);var o=n(0),r=Object(o.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),n("p",[t._v("Pressing the start button will cause the blue status LED on the front of the BrainBox to turn on. When the light starts flashing your BrainBox is ready to run code. You can now turn on your tablet by pressing the power button on the left-hand side and "),n("router-link",{attrs:{to:"/connecting.html"}},[t._v("connect to your robot")]),t._v(". The status LED will go solid while code is running.")],1),t._v(" "),t._m(3),t._v(" "),n("p",[t._v("When you are done for the day, press the power button, the status LED will flash rapidly. When this has turned off you may unplug the battery.")]),t._v(" "),t._m(4)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"the-brainbox"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-brainbox","aria-hidden":"true"}},[this._v("#")]),this._v(" The BrainBox")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The BrainBox is the core of the kit which we provide. In it is all of the electronics and software you need to power a robot. Lets start by turning it on. Take a battery from the kit and plug the "),e("strong",[this._v("yellow end")]),this._v(' into the corresponding port on the brain box (Labelled "Battery"), ensuring that it is the right way round. Then take a red "power button" and connect that to the '),e("strong",[this._v("black")]),this._v(" connector along the top of the BrainBox. Using the green ended button provided will not work, as this button is momentary and will not maintain power to the BrainBox.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/BrainBox%20power%20input%20side%20profile%20labelled.png",alt:"Diagram showing the pinout of the top of the BrainBox"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"how-to-turn-everything-off"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-turn-everything-off","aria-hidden":"true"}},[this._v("#")]),this._v(" How to turn everything off")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("Unplugging the battery before the status LED turns off will cause the Pi to lose power before it has finished shutting down which could permanently damage its SD card. "),e("strong",[this._v("Always")]),this._v(" wait till all the lights turn off before unplugging power.")])])}],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/32.dd8a434e.js b/shepherd/blueprints/staticroutes/docs/assets/js/32.dd8a434e.js deleted file mode 100644 index f9b5906..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/32.dd8a434e.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{174:function(t,e,s){"use strict";s.r(e);var a=s(0),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[t._m(0),t._v(" "),s("p",[t._v("Computer Vision allows your robots to understand their environment. For the competition, this is used to locate markers. It will give you information about the type of the marker, the distance/angle to the marker, etc.")]),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._m(4),t._v(" "),t._m(5),s("p",[t._v("Full reference of the properties are further below but some useful properties are:")]),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),s("p",[t._v("Every april tag has a code:")]),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),s("p",[t._v("Here's an example of a Blockly program that does some basic vision:")]),t._v(" "),s("BlocklySnippet",{attrs:{img:"vissnip.png",width:"779",height:"188"}}),t._v(" "),t._m(13),t._v(" "),s("p",[t._v("After reading the "),s("router-link",{attrs:{to:"./motors.html"}},[t._v("motors documentation")]),t._v(" you should be able to create a function which moves your robot by a number of meters as well as turn. We can then use this to write some code where a robot:")],1),t._v(" "),t._m(14),t._v(" "),t._m(15),t._m(16),t._v(" "),s("p",[t._v("Details about the markers can be accessed using the following syntax:")]),t._v(" "),t._m(17),t._m(18),t._v(" "),s("table",[t._m(19),t._v(" "),s("tbody",[t._m(20),t._v(" "),t._m(21),t._v(" "),t._m(22),t._v(" "),t._m(23),t._v(" "),t._m(24),t._v(" "),t._m(25),t._v(" "),t._m(26),t._v(" "),t._m(27),t._v(" "),t._m(28),t._v(" "),t._m(29),t._v(" "),t._m(30),t._v(" "),t._m(31),t._v(" "),t._m(32),t._v(" "),t._m(33),t._v(" "),t._m(34),t._v(" "),t._m(35),t._v(" "),t._m(36),t._v(" "),t._m(37),t._v(" "),t._m(38),t._v(" "),t._m(39),t._v(" "),t._m(40),t._v(" "),t._m(41),t._v(" "),t._m(42),t._v(" "),t._m(43),t._v(" "),s("tr",[t._m(44),t._v(" "),s("td",[t._v("The uncertainty of the detection in meters. This number can vary massively between detections depending on if local minima were bypassed. See "),s("a",{attrs:{href:"https://ieeexplore.ieee.org/document/5979561",target:"_blank",rel:"noopener noreferrer"}},[t._v("Apriltag: A robust and flexible visual fiducial system"),s("OutboundLink")],1)])]),t._v(" "),t._m(45),t._v(" "),t._m(46),t._v(" "),t._m(47)])]),t._v(" "),t._m(48),t._v(" "),t._m(49),t._v(" "),t._m(50),t._v(" "),s("p",[t._v("An interface to the camera is provided incase you want to do additional computer vision.")]),t._v(" "),t._m(51),t._v(" "),t._m(52),t._v(" "),t._m(53),s("p",[t._v("You must use one of the following resolutions:")]),t._v(" "),t._m(54),t._v(" "),t._m(55),t._v(" "),t._m(56),t._v(" "),t._m(57),t._v(" "),t._m(58),t._v(" "),t._m(59),t._m(60),t._v(" "),s("p",[t._v("The built-in Pi Camera inside your brain should be great for your robot, however if you would like to use your own USB Camera (perhaps you want to put a camera somewhere else on your robot), you can!")]),t._v(" "),s("p",[t._v("USB cameras can have slightly different functionality than the built-in Pi Camera, so they'll need some fine tuning before you can use them. The basic steps outlined below should get you up and running.")]),t._v(" "),t._m(61),t._v(" "),t._m(62),t._v(" "),t._m(63),t._m(64),t._v(" "),t._m(65),t._v(" "),t._m(66),t._v(" "),t._m(67),t._v(" "),t._m(68),t._m(69),t._v(" "),t._m(70),t._v(" "),t._m(71),t._v(" "),t._m(72),t._v(" "),t._m(73),s("p",[t._v("It's worth noting that this is only an average value.")]),t._v(" "),t._m(74),t._v(" "),t._m(75),t._v(" "),t._m(76)],1)}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"vision"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#vision","aria-hidden":"true"}},[this._v("#")]),this._v(" Vision")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"python"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python","aria-hidden":"true"}},[this._v("#")]),this._v(" Python")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("To look for markers call "),e("code",[this._v("see()")]),this._v(":")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("markers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("markers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("code",[this._v("markers")]),this._v(' is a Python list of "marker objects", which each look like the following:')])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[this._v("[arena Marker 0: 0.856m @0.754 degrees\n{\n info.type = POTATO\n info.id = 15\n info.owning_team = ARENA\n dist = 0.856\n bearing.y = 0.754\n bearing.x = 1.03e+02\n rotation.y = 5.1\n rotation.x = -11.4\n rotation.z = 9.47\n info = TOO BIG TO PRINT\n detection = TOO BIG TO PRINT\n}\n]\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",[t._v("Property")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v("marker.dist")])]),t._v(" "),s("td",[t._v("Distance to the marker in metres")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("marker.bearing.y")])]),t._v(" "),s("td",[t._v("The angle your robot needs to turn to get to the marker in degrees")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("marker.info.id")])]),t._v(" "),s("td",[t._v("Numeric code of the marker")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("marker.info.type")])]),t._v(" "),s("td",[t._v("One of "),s("code",[t._v("ARENA")]),t._v(" or "),s("code",[t._v("POTATO")])])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("marker.info.owning_team")])]),t._v(" "),s("td",[t._v("A team ("),s("code",[t._v("PURPLE")]),t._v(", "),s("code",[t._v("MARIS_PIPER")]),t._v(", etc), "),s("code",[t._v("ARENA")]),t._v(" for hot potato or "),s("code",[t._v("None")]),t._v(" for walls")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"codes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#codes","aria-hidden":"true"}},[this._v("#")]),this._v(" Codes")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("You do not need to use the marker ids themselves for your calculations. Use "),e("code",[this._v("marker.type")]),this._v(" and "),e("code",[this._v("marker.owning_team")]),this._v(" instead to find out the information you need (see above).")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[e("p",[this._v("April tags 0-39 will be used for cubes. Although only 20 are used in each round, there are another 20 spare in case some get damaged.")])]),this._v(" "),e("li",[e("p",[this._v("April tags 100+ will around the arena on the walls. See the rules for\nspecifics on where around the rules they will be placed")])]),this._v(" "),e("li",[e("p",[this._v("You do not need to use the marker numbers, and can instead use marker.type and marker.owning_team")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("table",[s("thead",[s("tr",[s("th",[t._v("Function")]),t._v(" "),s("th",[t._v("Codes")]),t._v(" "),s("th")])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Arena Marker")]),t._v(" "),s("td",[t._v("100 - 123")]),t._v(" "),s("td")]),t._v(" "),s("tr",[s("td",[t._v("Ruby")]),t._v(" "),s("td",[t._v("24, 25")]),t._v(" "),s("td",[t._v("Lair marker - 50")])]),t._v(" "),s("tr",[s("td",[t._v("Jade")]),t._v(" "),s("td",[t._v("26, 27")]),t._v(" "),s("td",[t._v("Lair marker - 51")])]),t._v(" "),s("tr",[s("td",[t._v("Topaz")]),t._v(" "),s("td",[t._v("28, 29")]),t._v(" "),s("td",[t._v("Lair marker - 52")])]),t._v(" "),s("tr",[s("td",[t._v("Diamond")]),t._v(" "),s("td",[t._v("30, 30")]),t._v(" "),s("td",[t._v("Lair marker - 53")])]),t._v(" "),s("tr",[s("td",[t._v("Sheep")]),t._v(" "),s("td",[t._v("0 - 23")]),t._v(" "),s("td")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"blockly"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#blockly","aria-hidden":"true"}},[this._v("#")]),this._v(" Blockly")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Blocks for vision can be found in the "),e("strong",[this._v("Vision")]),this._v(" section.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"example"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#example","aria-hidden":"true"}},[this._v("#")]),this._v(" Example")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ul",[s("li",[s("p",[t._v("Looks for a marker")])]),t._v(" "),s("li",[s("p",[t._v("If it can see a marker:")]),t._v(" "),s("ul",[s("li",[t._v("Turn so that it is facing the marker")]),t._v(" "),s("li",[t._v("Drive the distance to the marker")])])]),t._v(" "),s("li",[s("p",[t._v("If there is no marker in sight turn a bit and look again, maybe there is a marker out of view.")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("move")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("distance"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token triple-quoted-string string"}},[t._v('"""The robot drives `distance` meters forwards"""')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PUT YOUR MOVE CODE HERE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("def")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("turn")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("rotation"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token triple-quoted-string string"}},[t._v('"""The robot turns `rotation` degrees"""')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PUT YOUR TURN CODE HERE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("True")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" marker "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n turn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bearing"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Face the marker")]),t._v("\n move"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("dist"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Drive to the marker")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n turn"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The robot didn't see anything and so we turn and maybe see")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# another marker")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-marker-object"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-marker-object","aria-hidden":"true"}},[this._v("#")]),this._v(" The "),e("code",[this._v("Marker")]),this._v(" object")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[t._v("markers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# returns list of markers which the robot can see")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" marker "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" markers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("dist"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The distance to the marker in meters")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("bearing"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("y"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The rotation the robot would need to turn to")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# face the marker")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The number of the marker")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"The robot didn\'t see any markers and skipped the for loop!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("A "),e("code",[this._v("Marker")]),this._v(" object contains information about a "),e("em",[this._v("detected")]),this._v(" marker. It has the following attributes:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("thead",[e("tr",[e("th",[this._v("Attribute")]),this._v(" "),e("th",[this._v("What it does")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("dist")])]),this._v(" "),e("td",[this._v("The distance to the Marker from the camera in meters.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("bearing")])]),this._v(" "),e("td",[this._v("How far the "),e("strong",[this._v("BrainBox")]),this._v(" would have to rotate to face that "),e("strong",[this._v("Marker")]),this._v(" in degrees")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("bearing.x")])]),this._v(" "),e("td",[this._v("The "),e("strong",[this._v("up/down")]),this._v(" bearing. 0 is vertically bellow the camera")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("bearing.y")])]),this._v(" "),e("td",[this._v("The "),e("strong",[this._v("left/right")]),this._v(" bearing. 0 is straight ahead from the camera")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",[s("code",[t._v("rotation")])]),t._v(" "),s("td",[t._v("How much the "),s("strong",[t._v("Marker")]),t._v(" would need to be rotated to face the "),s("strong",[t._v("BrainBox")]),t._v(". "),s("code",[t._v("(0,0,0)")]),t._v(" Is if the marker was facing the BrainBox in the upright position")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("rotation.x")])]),this._v(" "),e("td",[this._v("The "),e("strong",[this._v("roll")]),this._v(" of the marker")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("rotation.y")])]),this._v(" "),e("td",[this._v("The "),e("strong",[this._v("pitch")]),this._v(" of the marker")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("rotation.z")])]),this._v(" "),e("td",[this._v("The "),e("strong",[this._v("yaw")]),this._v(" of the marker")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("info")])]),this._v(" "),e("td",[this._v("An object with various information about the marker")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("info.id")])]),this._v(" "),e("td",[this._v("The ID number of the marker")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("info.size")])]),this._v(" "),e("td",[this._v("The length of the black edge of the marker in meters")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",[s("code",[t._v("info.type")])]),t._v(" "),s("td",[t._v("The type of marker, a "),s("code",[t._v("MARKER_TYPE")]),t._v(". This is set to either "),s("code",[t._v("ARENA")]),t._v(" (walls) or "),s("code",[t._v("POTATO")]),t._v(" (potatoes)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("info.owning_team")])]),this._v(" "),e("td",[this._v("Which team owns the marker, a "),e("code",[this._v("TEAM")]),this._v(". If this is set to "),e("code",[this._v("ARENA")]),this._v(" then the potato is a hot potato - make sure you don't get burnt!")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("info.bounding_box_colour")])]),this._v(" "),e("td",[this._v("A tuple describing the colour which is drawn around the marker in the preview image (Blue, Red, Green)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection")])]),this._v(" "),e("td",[this._v("Technical information which has been inferred from the image.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.tag_family")])]),this._v(" "),e("td",[this._v("The family of AprilTag which is detected. RoboCon currently only uses "),e("code",[this._v("tag36h11")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.tag_id")])]),this._v(" "),e("td",[this._v("The ID number of the detected marker. Aliased by "),e("code",[this._v("marker.info.id")]),this._v(".")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.hamming")])]),this._v(" "),e("td",[this._v("The number of bits which were corrected. The detector cannon detect tags with a hamming distance greater than 2.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.decision_margin")])]),this._v(" "),e("td",[this._v("A measure of the quality of the binary decoding process; the average difference between the intensity of a data bit versus the decision threshold. Higher numbers roughly indicate better decodes. Only effective for tags which appear small.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.homography")])]),this._v(" "),e("td",[this._v('The 3x3 homography matrix describing the projection from an "ideal" tag (with corners at (-1,1), (1,1), (1,-1), and (-1, -1)) to pixels in the image.')])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.center")])]),this._v(" "),e("td",[this._v("The image pixel coordinates of the center of the marker.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.corners")])]),this._v(" "),e("td",[this._v("The image pixel coordinates of corners of the detected marker")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.pose_R")])]),this._v(" "),e("td",[this._v("The 3x3 Rotational matrix which describes the rotation of the marker relative to the origin.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.pose_T")])]),this._v(" "),e("td",[this._v("The 1x3 translation vector of the marker in meters.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("td",[e("code",[this._v("detection.pose_err")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("dectection.dist")])]),this._v(" "),e("td",[this._v("The distance to the marker in meters.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("tr",[s("td",[s("code",[t._v("detection.rotation")])]),t._v(" "),s("td",[t._v("How much the "),s("strong",[t._v("Marker")]),t._v(" would need to be rotated to face the "),s("strong",[t._v("BrainBox")]),t._v(". "),s("code",[t._v("(0,0,0)")]),t._v(" Is if the marker was facing the BrainBox in the upright position.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("tr",[e("td",[e("code",[this._v("detection.bearing")])]),this._v(" "),e("td",[this._v("How far the "),e("strong",[this._v("BrainBox")]),this._v(" would have to rotate to face that "),e("strong",[this._v("Marker")]),this._v(" in degrees.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Axes are all defined relative to the camera not your robot. Since we have\nno way to know how you've mounted your camera. You may need to account for this.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"tip custom-block"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("You can import "),s("code",[t._v("MARKER_TYPE")]),t._v(" and "),s("code",[t._v("TEAM")]),t._v(" from "),s("code",[t._v("robot")]),t._v(", for example...")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nmarkers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" marker "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" markers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("owner "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MARKER_OWNER"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ARENA"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"Marker ')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(' is owned by the arena"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("elif")]),t._v(" marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("owning_team "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zone"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"I own ')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"Marker ')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("id")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" is owned by ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("owning_team"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-camera-object"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-camera-object","aria-hidden":"true"}},[this._v("#")]),this._v(" The "),e("code",[this._v("Camera")]),this._v(" object")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"changing-the-resolution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#changing-the-resolution","aria-hidden":"true"}},[this._v("#")]),this._v(" Changing the resolution")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("By default the camera takes pictures at a resolution of "),e("strong",[this._v("640x480px")]),this._v(". You can change this by setting the "),e("code",[this._v("res")]),this._v(" parameter.")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"The current res is set to ')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("res "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1920")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1440")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string-interpolation"}},[s("span",{pre:!0,attrs:{class:"token string"}},[t._v('f"The current res is set to ')]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ul",[s("li",[s("code",[t._v("(640, 480)")]),t._v(" "),s("em",[t._v("(default)")])]),t._v(" "),s("li",[s("code",[t._v("(1296, 736)")])]),t._v(" "),s("li",[s("code",[t._v("(1296, 976)")])]),t._v(" "),s("li",[s("code",[t._v("(1920, 1088)")])]),t._v(" "),s("li",[s("code",[t._v("(1920, 1440)")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Using a higher resolution will increase the amount of time it takes to process the image, but you may be able to see more. Using a smaller resolution will be faster, but markers further away may stop being visible.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"warning custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("WARNING")]),this._v(" "),e("p",[this._v("The resolution values may be different on a USB camera. Please see "),e("em",[this._v("Using USB Cameras")]),this._v(" (below) for more information.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"get-data-straight-from-the-camera"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-data-straight-from-the-camera","aria-hidden":"true"}},[this._v("#")]),this._v(" Get data straight from the camera")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If you wish to do your own computer vision you can capture frames directly from the camera using "),e("code",[this._v("robot.camera.capture()")]),this._v(".")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nimage "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("capture"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nimage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("grey_frame "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# A 2d numpy array of the image data uint8")]),t._v("\nimage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("colour_frame "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# A 3d numpy array of the image data")]),t._v("\nimage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("colour_type "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# The encoding method used to store the colour_frame defaults to 8 bit RGB.")]),t._v("\nimage"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("time "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# A `datetime` object representing approximately the capture time.")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"using-usb-cameras"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-usb-cameras","aria-hidden":"true"}},[this._v("#")]),this._v(" Using USB cameras")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Please "),e("strong",[this._v("turn your robot off")]),this._v(" before plugging in your USB Camera of choice.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("To use a USB camera you will need to initialize the "),e("code",[this._v("Robot")]),this._v(" with something which inherits from "),e("code",[this._v("robot.vision.Camera")]),this._v(". Then just call "),e("code",[this._v("R.see()")]),this._v(" as you would normally.")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("vision "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" RoboConUSBCamera\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("RoboConUSBCamera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"setting-the-resolution"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setting-the-resolution","aria-hidden":"true"}},[this._v("#")]),this._v(" Setting the resolution")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You may now wish to change the resolution of your camera, this can be done the same as before with "),e("code",[this._v("R.camera.res = (width,height)")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Some resolutions may not work with your USB camera, as different cameras support different resolutions. Check your camera's documentation. If you try and use a resolution that your camera doesn't support, you will get an error that will state the closest resolution to the value you attempted to use. Try changing your resolution to the value that the error message suggests!")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("For example, to set a USB Camera's resolution to "),e("code",[this._v("800x600")]),this._v(":")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("vision "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" RoboConUSBCamera\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("RoboConUSBCamera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("res "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("800")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("600")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("h3",{attrs:{id:"calibrating-the-camera"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#calibrating-the-camera","aria-hidden":"true"}},[this._v("#")]),this._v(" Calibrating the camera")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You will then need to calibrate your USB camera as the distance that it reports will not be accurate. You can do this by changing the value in the "),e("code",[this._v("R.camera.focal_lengths")]),this._v(' dictionary up or down. By default, the robot will use the focal lengths for a "Logitech C270" camera, it\'s unlikely this is your camera - so see the steps below on how to calibrate it.')])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("Remember that focal lengths vary for different resolutions. You will need to run the calibration code below to find the focal length for each resolution you intend to use with your USB camera.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("ul",[e("li",[this._v("Place a marker exactly 1m away from the camera (measure this distance). Make sure there are no other markers in sight of the camera.")]),this._v(" "),e("li",[this._v("Copy and paste the following code into your editor. Please set the "),e("code",[this._v("resolution")]),this._v(" value to a resolution you wish to use.")])])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("vision "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" RoboConUSBCamera\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("RoboConUSBCamera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nresolution "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("640")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("480")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("focal_lengths"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("resolution"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set the focal lengths to a known bad value")]),t._v("\nR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("res "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resolution "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# set resolution")]),t._v("\n\nmarker "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# get first marker")]),t._v("\nd "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" marker"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("dist\nfocal_length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("120")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),t._v(" d "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# focal length = focal length / distance")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Focal length is around:"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("focal_length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Use this in your code to set the correct focal length: R.camera.focal_lengths[resolution] = ("')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("focal_length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", "')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token builtin"}},[t._v("str")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("focal_length"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('")"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The code above will output a focal length value which you should use "),e("strong",[this._v("before")]),this._v(" setting "),e("code",[this._v("R.camera.res")]),this._v(" or "),e("code",[this._v("R.see()")]),this._v(". You can also copy the line of code it produces and paste that into your code to set the focal lengths.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("For example, if your focal length was "),e("code",[this._v("123")]),this._v(" at the resolution of "),e("code",[this._v("800x600")]),this._v(", you should use the following lines of code, in the "),e("strong",[this._v("same order")]),this._v(":")])},function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("vision "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" RoboConUSBCamera\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("RoboConUSBCamera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("focal_lengths"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("resolution"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("123")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("camera"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("res "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" resolution\n\nmarker "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("see"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n")])])])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/33.c2580167.js b/shepherd/blueprints/staticroutes/docs/assets/js/33.c2580167.js deleted file mode 100644 index 21f93e8..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/33.c2580167.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{190:function(t,e,s){"use strict";s.r(e);var a=s(0),n=Object(a.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"content"},[s("h1",{attrs:{id:"zones"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#zones","aria-hidden":"true"}},[t._v("#")]),t._v(" Zones")]),t._v(" "),s("p",[t._v("Your code will probably need to look for different markers depending on the zone your robot starts in. Whilst you could have different files for each zone, there's also a property on the robot object for this.")]),t._v(" "),s("h2",{attrs:{id:"python"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#python","aria-hidden":"true"}},[t._v("#")]),t._v(" Python")]),t._v(" "),s("p",[s("code",[t._v("R.zone")]),t._v(" will be equal to the the start zone of the robot, and will be equal to one of the teams.")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[s("strong",[t._v("Team")])]),t._v(" "),s("th",[s("strong",[t._v("Code")])])])]),t._v(" "),s("tbody",[s("tr",[s("td",[t._v("Ruby")]),t._v(" "),s("td",[s("code",[t._v("robot.TEAM.RUBY")])])]),t._v(" "),s("tr",[s("td",[t._v("Jade")]),t._v(" "),s("td",[s("code",[t._v("robot.TEAM.JADE")])])]),t._v(" "),s("tr",[s("td",[t._v("Topaz")]),t._v(" "),s("td",[s("code",[t._v("robot.TEAM.TOPAZ")])])]),t._v(" "),s("tr",[s("td",[t._v("Diamond")]),t._v(" "),s("td",[s("code",[t._v("robot.TEAM.DIAMOND")])])])])]),t._v(" "),s("p",[t._v("Here's an example:")]),t._v(" "),s("div",{staticClass:"language-python extra-class"},[s("pre",{pre:!0,attrs:{class:"language-python"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" robot\n\nR "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" R"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("zone "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("==")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" robot"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TEAM"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("RUBY"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Do something!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("print")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Do something else!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("This code checks if the first marker in the list belongs to the current robot.")]),t._v(" "),s("h2",{attrs:{id:"blockly"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#blockly","aria-hidden":"true"}},[t._v("#")]),t._v(" Blockly")]),t._v(" "),s("p",[t._v("You can find the zone block in the "),s("strong",[t._v("Movement")]),t._v(" section.")])])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/34.c4e3023f.js b/shepherd/blueprints/staticroutes/docs/assets/js/34.c4e3023f.js deleted file mode 100644 index c716b75..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/34.c4e3023f.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{170:function(n,w,o){}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/4.86014d5c.js b/shepherd/blueprints/staticroutes/docs/assets/js/4.86014d5c.js deleted file mode 100644 index 7685533..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/4.86014d5c.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{195:function(t,e,r){"use strict";r.r(e);var o=r(0),s=Object(o.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),t._m(1),t._v(" "),r("p",[t._v("We suggest you first grasp the idea of the "),r("a",{attrs:{href:"http://robot.local/docs/RoboCon-2024-Rulebook.pdf",target:"_blank",rel:"noopener noreferrer"}},[t._v("rules"),r("OutboundLink")],1),t._v(".")]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),r("p",[t._v("To begin, get familiar with the kit provided. It includes : ")]),t._v(" "),t._m(4),t._v(" "),r("div",{staticClass:"warning custom-block"},[r("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),r("p",[t._v("Handling batteries incorrectly can be dangerous. Make sure you follow these "),r("router-link",{attrs:{to:"/charging.html"}},[t._v("safety guidelines")]),t._v(" at all times.")],1)]),t._v(" "),r("div",{staticClass:"tip custom-block"},[r("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),r("p",[t._v("You can also access these docs from your robot. Go to "),r("a",{attrs:{href:"http://robot.local/docs",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://robot.local/docs"),r("OutboundLink")],1),t._v(" when you're connected to your robot.")])]),t._v(" "),t._m(5)])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started","aria-hidden":"true"}},[this._v("#")]),this._v(" Getting Started")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Welcome to the docs for "),e("strong",[this._v("Robocon 2025")]),this._v("!")])},function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"tip custom-block"},[e("p",{staticClass:"custom-block-title"},[this._v("TIP")]),this._v(" "),e("p",[this._v("If you are viewing this page on your BrainBox then please check the website for the latest revision.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/roboconHeader.jpg",alt:"Game logo"}}),this._v("\nOnce you've done that, you'll need to turn your robot on.")])},function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("table",[r("thead",[r("tr",[r("th",[t._v("C\ufeffount")]),t._v(" "),r("th",[t._v("P\ufeffarts")])])]),t._v(" "),r("tbody",[r("tr",[r("td",[t._v("2")]),t._v(" "),r("td",[t._v("L\ufeffithium Polymer Batteries")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("B\ufeffattery Bag")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("B\ufeffattery Charger")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("B\ufeffrainBox")])]),t._v(" "),r("tr",[r("td",[t._v("2")]),t._v(" "),r("td",[t._v("M\ufeffotor")])]),t._v(" "),r("tr",[r("td",[t._v("2")]),t._v(" "),r("td",[t._v("W\ufeffheels")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("C\ufeffaster Wheel")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("C\ufeffhassis")])]),t._v(" "),r("tr",[r("td",[t._v("2")]),t._v(" "),r("td",[t._v("S\ufeffervo Motor")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("S\ufefftart Button")])]),t._v(" "),r("tr",[r("td",[t._v("1")]),t._v(" "),r("td",[t._v("P\ufeffower Switch")])])])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("If you have any questions related to the competition, the brainboxes, or any ideas or struggles you have, feel free to "),e("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[this._v("drop us an email")]),this._v(" - we are happy to help!")])}],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/5.3b2d80b8.js b/shepherd/blueprints/staticroutes/docs/assets/js/5.3b2d80b8.js deleted file mode 100644 index 52c00cc..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/5.3b2d80b8.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{196:function(t,e,a){"use strict";a.r(e);var r=a(0),o=Object(r.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[a("p",[a("img",{attrs:{src:"/images/63391_m_1__6.jpg",alt:"Zippy Compact 2200mAh battery"}})]),t._v(" "),a("h1",{attrs:{id:"batteries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#batteries","aria-hidden":"true"}},[t._v("#")]),t._v(" Batteries")]),t._v(" "),a("p",[t._v("The electronics kit contains two lithium-ion polymer (LiPo) batteries. These are similar to those used in laptops and are small and light for the amount of energy they contain. This is great for your robot but it is vital to treat such a high concentration of energy with respect. If you do not, there is a serious risk of fire and injury. To avoid this, you should follow the safety information on this page closely, at all times.")]),t._v(" "),a("p",[t._v("Your kit will come with several pieces of battery-related equipment:")]),t._v(" "),a("ul",[a("li",[t._v("Two 11.1V 2200mAh LiPo Batteries.")]),t._v(" "),a("li",[t._v("One battery charger.")]),t._v(" "),a("li",[t._v("One battery charging bag.")])]),t._v(" "),a("p",[t._v("You must not use any batteries, chargers, bags or cables "),a("strong",[t._v("not")]),t._v(" explicitly authorised by "),a("strong",[t._v("Hills Road RoboCon")]),t._v(". If you have any doubts or wish to request permission to use a battery, charger, charging bag or battery cable not provided by "),a("strong",[t._v("Hills Road RoboCon")]),t._v(", please contact "),a("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[t._v("robotics@hrsfc.ac.uk")]),t._v(".")]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("ul",[a("li",[t._v("Never leave batteries unattended when they are in use or charging.")]),t._v(" "),a("li",[t._v("Always place the batteries in the provided charging bag when charging or storing.")]),t._v(" "),a("li",[t._v("Do not charge or use a damaged battery.")]),t._v(" "),a("li",[t._v("Do not tamper with the battery wires.")]),t._v(" "),a("li",[t._v("If a battery has any cuts, nicks, exposed copper on wires or is bulging, "),a("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[t._v("contact us")]),t._v(" immediately.")])])]),t._v(" "),a("h2",{attrs:{id:"storing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#storing","aria-hidden":"true"}},[t._v("#")]),t._v(" Storing")]),t._v(" "),a("p",[t._v("When your batteries are not actively in use, they should be safely stored. You must disconnect the batteries from all electrical equipment, and place them in the battery charging bag. You should then store the charging bag in a safe location.")]),t._v(" "),a("p",[t._v("If you are not going to use the batteries for a long period of time, such as more than a week, then you should charge the batteries beforehand. By themselves, batteries will discharge very slowly, and over-discharging will lead to damage. We recommend that you charge all batteries to at least 70% of capacity before being stored for a long period.")]),t._v(" "),a("h2",{attrs:{id:"operating-batteries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#operating-batteries","aria-hidden":"true"}},[t._v("#")]),t._v(" Operating Batteries")]),t._v(" "),a("p",[t._v("To use your batteries, you must connect them to the "),a("strong",[t._v("Hills Road RoboCon")]),t._v(" BrainBox. Do not tamper with the cable or connect the batteries to anything other than the power board (or the charger when charging).")]),t._v(" "),a("p",[t._v("During operation, the battery is protected by over-current protection by a regulator on the power board. If any equipment is short circuited, the over-current protection will activate - protecting the battery. There is a fuse placed inline with the power cord. If you suspect the fuse has gone something "),a("em",[t._v("very")]),t._v(" wrong has happened. This is an important safety feature.")]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Do "),a("strong",[t._v("NOT")]),t._v(", under any circumstances, bypass or replace the fuse. If the fuse has blown then the power board has failed and "),a("strong",[t._v("must")]),t._v(" be replaced for safe operation. If you suspect the fuse has blown then please contact "),a("a",{attrs:{href:"mailto:robotics@hrsfc.ac.uk"}},[t._v("mailto:robotics@hrsfc.ac.uk")]),t._v(" straight away.")])]),t._v(" "),a("p",[t._v("Mechanical damage to a battery can be dangerous, and a puncture or large force applied to a battery causes a serious risk of fire. To avoid this, your battery should be shielded from mechanical damage while you operate it. Secure your battery to your robot, so that it does not move or fall off while the robot moves. You should also build a compartment for the battery to be placed in to prevent accidental collisions damaging the battery.")]),t._v(" "),a("h2",{attrs:{id:"flat-batteries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#flat-batteries","aria-hidden":"true"}},[t._v("#")]),t._v(" Flat batteries")]),t._v(" "),a("p",[t._v("When the battery has been almost completely discharged, the Power Board will automatically go into a low power state and shut everything down. You should immediately disconnect the battery, and begin charging it. You should keep your second battery charged so that you can immediately switch to using it.")]),t._v(" "),a("p",[t._v("Do not store a discharged battery for more than a few days without charging it, as it may discharge further and become damaged.")]),t._v(" "),a("h2",{attrs:{id:"charging-batteries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#charging-batteries","aria-hidden":"true"}},[t._v("#")]),t._v(" Charging batteries")]),t._v(" "),a("p",[t._v("You should only use the battery charger provided by "),a("strong",[t._v("Hills Road RoboCon")]),t._v(" to charge the batteries provided in the kit. Plug your battery in and put it in a LiPo safe bag until all the lights turn green.")])])}],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/6.109ba5d1.js b/shepherd/blueprints/staticroutes/docs/assets/js/6.109ba5d1.js deleted file mode 100644 index 976c8eb..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/6.109ba5d1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{197:function(t,e,a){"use strict";a.r(e);var r=a(0),h=Object(r.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[a("h1",{attrs:{id:"charging"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#charging","aria-hidden":"true"}},[t._v("#")]),t._v(" Charging")]),t._v(" "),a("p",[t._v("The exact charger you have will vary, however the one you have should look a bit like this one:")]),t._v(" "),a("p",[a("img",{attrs:{src:"/images/charger.png",alt:"A charger"}})]),t._v(" "),a("p",[t._v("To charge the battery find an adapter and plug the charger into the mains. All three LEDs should light up red. Take the battery and place it in the LiPo-safe bag so that only the leads protrude then take the four pin lead from the battery. Then plug that into the four pin connector on the charger, noting the direction they are keyed in.")]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Always make sure that you charge the battery in a LiPo-safe bag. If you have any reason to suspect that the battery is damaged "),a("strong",[t._v("do NOT use it")]),t._v(".")])]),t._v(" "),a("p",[t._v("When the battery is charged all 3 LEDs will turn green, if the LED's flash red it means that there is a problem with your battery and you should contact us immediately.")])])}],!1,null,null,null);e.default=h.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/7.0df13433.js b/shepherd/blueprints/staticroutes/docs/assets/js/7.0df13433.js deleted file mode 100644 index 7ac1946..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/7.0df13433.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{198:function(t,e,a){"use strict";a.r(e);var i=a(0),s=Object(i.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"content"},[a("p",[a("img",{attrs:{src:"",alt:""}})]),t._v(" "),a("h1",{attrs:{id:"collecting-images-and-raw-analysis"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#collecting-images-and-raw-analysis","aria-hidden":"true"}},[t._v("#")]),t._v(" Collecting Images and Raw Analysis")]),t._v(" "),a("p",[t._v("Every time the robot takes a picture it is updated on the web interface, during development it is occasionally useful to be able to also keep a log of pictures that have been analysed to check the camera focus, motion blur etc.")]),t._v(" "),a("h2",{attrs:{id:"gathering-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#gathering-data","aria-hidden":"true"}},[t._v("#")]),t._v(" Gathering Data:")]),t._v(" "),a("ol",[a("li",[t._v('Add a file with the name "collect_images.txt" to the USB stick to collect the images')]),t._v(" "),a("li",[t._v('Add a file with the name "log_markers.txt" to the USB stick to collect analysis of images')]),t._v(" "),a("li",[t._v("Insert the USB stick before turning the robot on")]),t._v(" "),a("li",[t._v("Remember to fully shut down the robot before removing the USB stick")])]),t._v(" "),a("div",{staticClass:"warning custom-block"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Collecting all images may slow down the processing time from your robot - Use with care!")])])])}],!1,null,null,null);e.default=s.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/8.27193943.js b/shepherd/blueprints/staticroutes/docs/assets/js/8.27193943.js deleted file mode 100644 index c091eaa..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/8.27193943.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{199:function(t,e,r){"use strict";r.r(e);var o=r(0),n=Object(o.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"content"},[t._m(0),t._v(" "),r("ol",[r("li",[t._v("Turn on the robot by following the instructions "),r("router-link",{attrs:{to:"/turning-everything-on.html"}},[t._v("here")]),t._v(".")],1),t._v(" "),r("li",[t._v("Turn on your computer and wait until you reach the Windows desktop.")]),t._v(" "),t._m(1),t._v(" "),r("li",[t._v("Navigate to "),r("a",{attrs:{href:"http://robot.local",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://robot.local"),r("OutboundLink")],1),t._v(" in your web browser of choice ("),r("strong",[t._v("Chrome")]),t._v(" or "),r("strong",[t._v("Firefox")]),t._v(" is recommended). You should see an interface similar to this:")])]),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),r("ul",[r("li",[r("router-link",{attrs:{to:"/editor.html"}},[t._v("Learn to use the editor")]),t._v(" right here in the browser!")],1),t._v(" "),r("li",[r("router-link",{attrs:{to:"/troubleshooting.html"}},[t._v("Troubleshooting")])],1)])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"connecting-to-the-robot"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-to-the-robot","aria-hidden":"true"}},[this._v("#")]),this._v(" Connecting to the Robot")])},function(){var t=this.$createElement,e=this._self._c||t;return e("li",[this._v("Click on the WiFi icon in the bottom right and connect to "),e("code",[this._v("RoboConYYYY-TeamXX")]),this._v(" where "),e("code",[this._v("YYYY")]),this._v(" is the competition year and "),e("code",[this._v("XX")]),this._v(" is your team number. Your WiFi password should be on the bottom of your BrainBox, underneath its network name.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/shepherd.png",alt:"The Interface"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("From now on, this will be referred to as the "),e("strong",[this._v("Shepherd Homepage")]),this._v(".")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"next-steps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#next-steps","aria-hidden":"true"}},[this._v("#")]),this._v(" Next Steps")])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/9.90ca42dd.js b/shepherd/blueprints/staticroutes/docs/assets/js/9.90ca42dd.js deleted file mode 100644 index f30aacf..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/9.90ca42dd.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{200:function(t,e,o){"use strict";o.r(e);var r=o(0),n=Object(r.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("div",{staticClass:"content"},[t._m(0),t._v(" "),o("p",[t._v("We recommend you use the code editor that's included with Shepherd to program your robot. You can either program in Python or use Blockly, a powerful Scratch-like programming tool.")]),t._v(" "),o("p",[t._v("Assuming you've "),o("router-link",{attrs:{to:"/connecting.html"}},[t._v("connected to your robot")]),t._v(", head to "),o("a",{attrs:{href:"http://robot.local/editor",target:"_blank",rel:"noopener noreferrer"}},[t._v("http://robot.local/editor"),o("OutboundLink")],1),t._v(" or click the orange\neditor button on the Shepherd homepage.")],1),t._v(" "),t._m(1),t._v(" "),t._m(2),t._v(" "),t._m(3),t._v(" "),t._m(4),t._v(" "),t._m(5),t._v(" "),t._m(6),t._v(" "),t._m(7),t._v(" "),t._m(8),t._v(" "),t._m(9),t._v(" "),t._m(10),t._v(" "),t._m(11),t._v(" "),t._m(12),t._v(" "),t._m(13),t._v(" "),t._m(14),t._v(" "),o("p",[t._v("Your new project will open in the editor. See the sections below for more information on "),o("a",{attrs:{href:"#python-projects"}},[t._v("Python")]),t._v(" and\n"),o("a",{attrs:{href:"#blockly-projects"}},[t._v("Blockly")]),t._v(" projects. Once you've read these, why not start learning "),o("router-link",{attrs:{to:"/init-robot.html"}},[t._v("how to program your robot")]),t._v(".")],1),t._v(" "),t._m(15),t._v(" "),t._m(16),t._v(" "),t._m(17),t._v(" "),o("p",[t._v("Google's Blockly is a programming environment similar to Scratch that allows you to program your robot with blocks. You still have access to all the features of the robot so you are not disadvantaged if you decide to use this over Python.")])])}),[function(){var t=this.$createElement,e=this._self._c||t;return e("h1",{attrs:{id:"using-the-editor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-editor","aria-hidden":"true"}},[this._v("#")]),this._v(" Using the Editor")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/shepherd-editor.png",alt:"Upload Button"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"the-editor-interface"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-editor-interface","aria-hidden":"true"}},[this._v("#")]),this._v(" The Editor Interface")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("You should now see the editor interface. "),e("em",[this._v("(yours will look slightly different to this)")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/shepherd-editor-annotated.png",alt:"Annotated Editor Interface"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[e("span",{staticStyle:{color:"#00A510"}},[this._v("green sidebar")])]),this._v(" is the "),e("strong",[this._v("projects panel")]),this._v(". This is where you can access or\nexport your existing projects, and create or import new ones. Clicking on a project in this list will open it in the\neditor.")])},function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("ul",[o("li",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#FF6A00"}},[t._v("orange button")])]),t._v(" is the "),o("strong",[t._v("import button")]),t._v(". This lets you load a saved project\ninto the editor.")]),t._v(" "),o("li",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#0094FF"}},[t._v("blue button")])]),t._v(" is the "),o("strong",[t._v("create project button")]),t._v(". This is how you\n"),o("a",{attrs:{href:"#creating-a-new-project"}},[t._v("create a project")]),t._v(".")]),t._v(" "),o("li",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#FF0000"}},[t._v("red button")])]),t._v(" is the "),o("strong",[t._v("export button")]),t._v(". This allows you to save the project\nto your computer as a backup.")]),t._v(" "),o("li",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#FF00DC"}},[t._v("pink button")])]),t._v(" is the "),o("strong",[t._v("delete project button")]),t._v(". This will allow you to\ndelete a project if you don't want it. There is no way to undo this action.")])])},function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("p",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#FFD800"}},[t._v("yellow toolbar")])]),t._v(" is the "),o("strong",[t._v("tab list")]),t._v(". This is where you can find all your open\nprojects. If your project has a "),o("strong",[t._v("white circle")]),t._v(" at the end of the tab, it means you have "),o("strong",[t._v("unsaved")]),t._v(" content. Projects are\nauto-saved after you stop editing them or when you run your project, but you can also manually save by pressing the "),o("strong",[t._v("CTRL")]),t._v("\nand "),o("strong",[t._v("S")]),t._v(" keys simultaneously.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[e("span",{staticStyle:{color:"#007F7F"}},[this._v("teal sidebar")])]),this._v(" is the "),e("strong",[this._v("logs panel")]),this._v(". This is where you can see the output\nfrom your robot when you run your program.")])},function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("ul",[o("li",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#006327"}},[t._v("dark green button")])]),t._v(" is the "),o("strong",[t._v("run button")]),t._v(". Pressing this will prompt you to\nsave your project to your computer, just as a backup, and then run your code on the robot.")]),t._v(" "),o("li",[t._v("The "),o("strong",[o("span",{staticStyle:{color:"#630000"}},[t._v("dark red button")])]),t._v(" is the "),o("strong",[t._v("stop button")]),t._v(". Pressing this will force the robot\nto stop what it's doing, useful if your robot is out of control.")])])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("The "),e("strong",[this._v("main section")]),this._v(" in the middle is the "),e("strong",[this._v("editor")]),this._v(". This will be different depending on whether you're editing a Python or a\nBlockly project.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"creating-a-new-project"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-new-project","aria-hidden":"true"}},[this._v("#")]),this._v(" Creating a new project")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Click on the "),e("strong",[this._v("create project button")]),this._v(" (marked in "),e("strong",[e("span",{staticStyle:{color:"#0094FF"}},[this._v("blue")])]),this._v(" in the above screenshot).\nThe create project dialog will appear:")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[e("img",{attrs:{src:"/images/shepherd-editor-create-project.png",alt:"Create Project Interface"}})])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Give your project a name, then select the type of project you would like. Choose either Python or Blockly. Then click the "),e("strong",[this._v("create")]),this._v(" button.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"python-projects"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#python-projects","aria-hidden":"true"}},[this._v("#")]),this._v(" Python Projects")])},function(){var t=this.$createElement,e=this._self._c||t;return e("p",[this._v("Python projects provide a powerful development tool with syntax highlighting and code completion for the standard Python libraries and also the "),e("code",[this._v("robot")]),this._v(" module. If you are interested, it uses the text editor that powers Visual Studio Code.")])},function(){var t=this.$createElement,e=this._self._c||t;return e("h2",{attrs:{id:"blockly-projects"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#blockly-projects","aria-hidden":"true"}},[this._v("#")]),this._v(" Blockly Projects")])}],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/assets/js/app.c7785c4a.js b/shepherd/blueprints/staticroutes/docs/assets/js/app.c7785c4a.js deleted file mode 100644 index 7edae2d..0000000 --- a/shepherd/blueprints/staticroutes/docs/assets/js/app.c7785c4a.js +++ /dev/null @@ -1,8 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,a,s=e[0],c=e[1],u=e[2],f=0,p=[];f0?o(r(t),9007199254740991):0}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e,n){for(var r=n(20),o=n(28),i=n(11),a=n(3),s=n(10),c=n(18),u=n(1),l=u("iterator"),f=u("toStringTag"),p=c.Array,h={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},d=o(h),v=0;v=t.length?(this._t=void 0,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])}),"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e,n){"use strict";var r=n(6);t.exports=function(t,e){return!!t&&r((function(){e?t.call(null,(function(){}),1):t.call(null)}))}},function(t,e,n){"use strict";var r=n(2),o=n(32)(3);r(r.P+r.F*!n(21)([].some,!0),"Array",{some:function(t){return o(this,t,arguments[1])}})},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e,n){var r=n(8).f,o=n(14),i=n(1)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){var r=n(2);r(r.S+r.F,"Object",{assign:n(104)})},function(t,e,n){var r=n(80),o=n(63);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(61),o=n(16);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(19),o=n(28);n(83)("keys",(function(){return function(t){return o(r(t))}}))},function(t,e,n){"use strict";var r=n(2),o=n(32)(0),i=n(21)([].forEach,!0);r(r.P+r.F*!i,"Array",{forEach:function(t){return o(this,t,arguments[1])}})},function(t,e,n){var r=n(9),o=n(61),i=n(19),a=n(15),s=n(112);t.exports=function(t,e){var n=1==t,c=2==t,u=3==t,l=4==t,f=6==t,p=5==t||f,h=e||s;return function(e,s,d){for(var v,m,g=i(e),y=o(g),b=r(s,d,3),_=a(y.length),w=0,x=n?h(e,_):c?h(e,0):void 0;_>w;w++)if((p||w in y)&&(m=b(v=y[w],w,g),t))if(n)x[w]=m;else if(m)switch(t){case 3:return!0;case 5:return v;case 6:return w;case 2:x.push(v)}else if(l)return!1;return f?-1:u||l?l:x}}},function(t,e,n){"use strict";var r=n(2),o=n(32)(2);r(r.P+r.F*!n(21)([].filter,!0),"Array",{filter:function(t){return o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(2),o=n(32)(1);r(r.P+r.F*!n(21)([].map,!0),"Array",{map:function(t){return o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(5),o=n(19),i=n(15),a=n(25),s=n(68),c=n(69),u=Math.max,l=Math.min,f=Math.floor,p=/\$([$&`']|\d\d?|<[^>]*>)/g,h=/\$([$&`']|\d\d?)/g;n(71)("replace",2,(function(t,e,n,d){return[function(r,o){var i=t(this),a=null==r?void 0:r[e];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)},function(t,e){var o=d(n,t,this,e);if(o.done)return o.value;var f=r(t),p=String(this),h="function"==typeof e;h||(e=String(e));var m=f.global;if(m){var g=f.unicode;f.lastIndex=0}for(var y=[];;){var b=c(f,p);if(null===b)break;if(y.push(b),!m)break;""===String(b[0])&&(f.lastIndex=s(p,i(f.lastIndex),g))}for(var _,w="",x=0,k=0;k=x&&(w+=p.slice(x,$)+T,x=$+C.length)}return w+p.slice(x)}];function v(t,e,r,i,a,s){var c=r+t.length,u=i.length,l=h;return void 0!==a&&(a=o(a),l=p),n.call(s,l,(function(n,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return t;case"`":return e.slice(0,r);case"'":return e.slice(c);case"<":s=a[o.slice(1,-1)];break;default:var l=+o;if(0===l)return n;if(l>u){var p=f(l/10);return 0===p?n:p<=u?void 0===i[p-1]?o.charAt(1):i[p-1]+o.charAt(1):n}s=i[l-1]}return void 0===s?"":s}))}}))},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){},function(t,e,n){var r,o; -/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress - * @license MIT */void 0===(o="function"==typeof(r=function(){var t,e,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function o(t,e,n){return tn?n:t}function i(t){return 100*(-1+t)}n.configure=function(t){var e,n;for(e in t)void 0!==(n=t[e])&&t.hasOwnProperty(e)&&(r[e]=n);return this},n.status=null,n.set=function(t){var e=n.isStarted();t=o(t,r.minimum,1),n.status=1===t?null:t;var c=n.render(!e),u=c.querySelector(r.barSelector),l=r.speed,f=r.easing;return c.offsetWidth,a((function(e){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,function(t,e,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(t)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(t)+"%,0)"}:{"margin-left":i(t)+"%"}).transition="all "+e+"ms "+n,o}(t,l,f)),1===t?(s(c,{transition:"none",opacity:1}),c.offsetWidth,setTimeout((function(){s(c,{transition:"all "+l+"ms linear",opacity:0}),setTimeout((function(){n.remove(),e()}),l)}),l)):setTimeout(e,l)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var t=function(){setTimeout((function(){n.status&&(n.trickle(),t())}),r.trickleSpeed)};return r.trickle&&t(),this},n.done=function(t){return t||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(t){var e=n.status;return e?("number"!=typeof t&&(t=(1-e)*o(Math.random()*e,.1,.95)),e=o(e+t,0,.994),n.set(e)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},t=0,e=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===e&&n.start(),t++,e++,r.always((function(){0==--e?(t=0,n.done()):n.set((t-e)/t)})),this):this},n.render=function(t){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var e=document.createElement("div");e.id="nprogress",e.innerHTML=r.template;var o,a=e.querySelector(r.barSelector),c=t?"-100":i(n.status||0),l=document.querySelector(r.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+c+"%,0,0)"}),r.showSpinner||(o=e.querySelector(r.spinnerSelector))&&p(o),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(e),e},n.remove=function(){l(document.documentElement,"nprogress-busy"),l(document.querySelector(r.parent),"nprogress-custom-parent");var t=document.getElementById("nprogress");t&&p(t)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var t=document.body.style,e="WebkitTransform"in t?"Webkit":"MozTransform"in t?"Moz":"msTransform"in t?"ms":"OTransform"in t?"O":"";return e+"Perspective"in t?"translate3d":e+"Transform"in t?"translate":"margin"};var a=function(){var t=[];function e(){var n=t.shift();n&&n(e)}return function(n){t.push(n),1==t.length&&e()}}(),s=function(){var t=["Webkit","O","Moz","ms"],e={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(t,e){return e.toUpperCase()})),e[n]||(e[n]=function(e){var n=document.body.style;if(e in n)return e;for(var r,o=t.length,i=e.charAt(0).toUpperCase()+e.slice(1);o--;)if((r=t[o]+i)in n)return r;return e}(n))}function r(t,e,r){e=n(e),t.style[e]=r}return function(t,e){var n,o,i=arguments;if(2==i.length)for(n in e)void 0!==(o=e[n])&&e.hasOwnProperty(n)&&r(t,n,o);else r(t,i[1],i[2])}}();function c(t,e){return("string"==typeof t?t:f(t)).indexOf(" "+e+" ")>=0}function u(t,e){var n=f(t),r=n+e;c(n,e)||(t.className=r.substring(1))}function l(t,e){var n,r=f(t);c(t,e)&&(n=r.replace(" "+e+" "," "),t.className=n.substring(1,n.length-1))}function f(t){return(" "+(t.className||"")+" ").replace(/\s+/gi," ")}function p(t){t&&t.parentNode&&t.parentNode.removeChild(t)}return n})?r.call(e,n,e,t):r)||(t.exports=o)},function(t,e){t.exports=!1},function(t,e,n){var r=n(12),o=n(1)("toStringTag"),i="Arguments"==r(function(){return arguments}());t.exports=function(t){var e,n,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),o))?n:i?r(e):"Object"==(a=r(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,n){var r=n(13),o=n(3),i=o["__core-js_shared__"]||(o["__core-js_shared__"]={});(t.exports=function(t,e){return i[t]||(i[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(52)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(t,e,n){var r=n(4),o=n(3).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){t.exports=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t}},function(t,e,n){var r=n(9),o=n(96),i=n(97),a=n(5),s=n(15),c=n(98),u={},l={};(e=t.exports=function(t,e,n,f,p){var h,d,v,m,g=p?function(){return t}:c(t),y=r(n,f,e?2:1),b=0;if("function"!=typeof g)throw TypeError(t+" is not iterable!");if(i(g)){for(h=s(t.length);h>b;b++)if((m=e?y(a(d=t[b])[0],d[1]):y(t[b]))===u||m===l)return m}else for(v=g.call(t);!(d=v.next()).done;)if((m=o(v,y,d.value,e))===u||m===l)return m}).BREAK=u,e.RETURN=l},function(t,e,n){var r=n(11);t.exports=function(t,e,n){for(var o in e)r(t,o,e[o],n);return t}},function(t,e,n){"use strict";var r=n(3),o=n(8),i=n(7),a=n(1)("species");t.exports=function(t){var e=r[t];i&&e&&!e[a]&&o.f(e,a,{configurable:!0,get:function(){return this}})}},function(t,e,n){var r=n(12);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(54)("keys"),o=n(24);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(24)("meta"),o=n(4),i=n(14),a=n(8).f,s=0,c=Object.isExtensible||function(){return!0},u=!n(6)((function(){return c(Object.preventExtensions({}))})),l=function(t){a(t,r,{value:{i:"O"+ ++s,w:{}}})},f=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!e)return"E";l(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!c(t))return!0;if(!e)return!1;l(t)}return t[r].w},onFreeze:function(t){return u&&f.NEED&&c(t)&&!i(t,r)&&l(t),t}}},function(t,e,n){"use strict";var r=n(52),o=n(2),i=n(11),a=n(10),s=n(18),c=n(109),u=n(26),l=n(111),f=n(1)("iterator"),p=!([].keys&&"next"in[].keys()),h=function(){return this};t.exports=function(t,e,n,d,v,m,g){c(n,e,d);var y,b,_,w=function(t){if(!p&&t in $)return $[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},x=e+" Iterator",k="values"==v,C=!1,$=t.prototype,S=$[f]||$["@@iterator"]||v&&$[v],O=S||w(v),E=v?k?w("entries"):O:void 0,A="Array"==e&&$.entries||S;if(A&&(_=l(A.call(new t)))!==Object.prototype&&_.next&&(u(_,x,!0),r||"function"==typeof _[f]||a(_,f,h)),k&&S&&"values"!==S.name&&(C=!0,O=function(){return S.call(this)}),r&&!g||!p&&!C&&$[f]||a($,f,O),s[e]=O,s[x]=h,v)if(y={values:k?O:w("values"),keys:m?O:w("keys"),entries:E},g)for(b in y)b in $||i($,b,y[b]);else o(o.P+o.F*(p||C),e,y);return y}},function(t,e,n){var r=n(8).f,o=Function.prototype,i=/^\s*function ([^ (]*)/;"name"in o||n(7)&&r(o,"name",{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(t){return""}}})},function(t,e,n){"use strict";var r=n(2),o=n(81)(!1),i=[].indexOf,a=!!i&&1/[1].indexOf(1,-0)<0;r(r.P+r.F*(a||!n(21)(i)),"Array",{indexOf:function(t){return a?i.apply(this,arguments)||0:o(this,t,arguments[1])}})},function(t,e,n){"use strict";var r=n(88)(!0);t.exports=function(t,e,n){return e+(n?r(t,e).length:1)}},function(t,e,n){"use strict";var r=n(53),o=RegExp.prototype.exec;t.exports=function(t,e){var n=t.exec;if("function"==typeof n){var i=n.call(t,e);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(t))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(t,e)}},function(t,e,n){"use strict";var r,o,i=n(89),a=RegExp.prototype.exec,s=String.prototype.replace,c=a,u=(r=/a/,o=/b*/g,a.call(r,"a"),a.call(o,"a"),0!==r.lastIndex||0!==o.lastIndex),l=void 0!==/()??/.exec("")[1];(u||l)&&(c=function(t){var e,n,r,o,c=this;return l&&(n=new RegExp("^"+c.source+"$(?!\\s)",i.call(c))),u&&(e=c.lastIndex),r=a.call(c,t),u&&r&&(c.lastIndex=c.global?r.index+r[0].length:e),l&&r&&r.length>1&&s.call(r[0],n,(function(){for(o=1;o")})),f=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var n="ab".split(t);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();t.exports=function(t,e,n){var p=s(t),h=!i((function(){var e={};return e[p]=function(){return 7},7!=""[t](e)})),d=h?!i((function(){var e=!1,n=/a/;return n.exec=function(){return e=!0,null},"split"===t&&(n.constructor={},n.constructor[u]=function(){return n}),n[p](""),!e})):void 0;if(!h||!d||"replace"===t&&!l||"split"===t&&!f){var v=/./[p],m=n(a,p,""[t],(function(t,e,n,r,o){return e.exec===c?h&&!o?{done:!0,value:v.call(e,n,r)}:{done:!0,value:t.call(n,e,r)}:{done:!1}})),g=m[0],y=m[1];r(String.prototype,t,g),o(RegExp.prototype,p,2==e?function(t,e){return y.call(t,this,e)}:function(t){return y.call(t,this)})}}},function(t,e,n){"use strict";var r,o,i,a,s=n(52),c=n(3),u=n(9),l=n(53),f=n(2),p=n(4),h=n(23),d=n(57),v=n(58),m=n(75),g=n(76).set,y=n(100)(),b=n(78),_=n(101),w=n(102),x=n(103),k=c.TypeError,C=c.process,$=C&&C.versions,S=$&&$.v8||"",O=c.Promise,E="process"==l(C),A=function(){},T=o=b.f,j=!!function(){try{var t=O.resolve(1),e=(t.constructor={})[n(1)("species")]=function(t){t(A,A)};return(E||"function"==typeof PromiseRejectionEvent)&&t.then(A)instanceof e&&0!==S.indexOf("6.6")&&-1===w.indexOf("Chrome/66")}catch(t){}}(),P=function(t){var e;return!(!p(t)||"function"!=typeof(e=t.then))&&e},L=function(t,e){if(!t._n){t._n=!0;var n=t._c;y((function(){for(var r=t._v,o=1==t._s,i=0,a=function(e){var n,i,a,s=o?e.ok:e.fail,c=e.resolve,u=e.reject,l=e.domain;try{s?(o||(2==t._h&&M(t),t._h=1),!0===s?n=r:(l&&l.enter(),n=s(r),l&&(l.exit(),a=!0)),n===e.promise?u(k("Promise-chain cycle")):(i=P(n))?i.call(n,c,u):c(n)):u(r)}catch(t){l&&!a&&l.exit(),u(t)}};n.length>i;)a(n[i++]);t._c=[],t._n=!1,e&&!t._h&&I(t)}))}},I=function(t){g.call(c,(function(){var e,n,r,o=t._v,i=R(t);if(i&&(e=_((function(){E?C.emit("unhandledRejection",o,t):(n=c.onunhandledrejection)?n({promise:t,reason:o}):(r=c.console)&&r.error&&r.error("Unhandled promise rejection",o)})),t._h=E||R(t)?2:1),t._a=void 0,i&&e.e)throw e.v}))},R=function(t){return 1!==t._h&&0===(t._a||t._c).length},M=function(t){g.call(c,(function(){var e;E?C.emit("rejectionHandled",t):(e=c.onrejectionhandled)&&e({promise:t,reason:t._v})}))},N=function(t){var e=this;e._d||(e._d=!0,(e=e._w||e)._v=t,e._s=2,e._a||(e._a=e._c.slice()),L(e,!0))},D=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw k("Promise can't be resolved itself");(e=P(t))?y((function(){var r={_w:n,_d:!1};try{e.call(t,u(D,r,1),u(N,r,1))}catch(t){N.call(r,t)}})):(n._v=t,n._s=1,L(n,!1))}catch(t){N.call({_w:n,_d:!1},t)}}};j||(O=function(t){d(this,O,"Promise","_h"),h(t),r.call(this);try{t(u(D,this,1),u(N,this,1))}catch(t){N.call(this,t)}},(r=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=n(59)(O.prototype,{then:function(t,e){var n=T(m(this,O));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=E?C.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&L(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),i=function(){var t=new r;this.promise=t,this.resolve=u(D,t,1),this.reject=u(N,t,1)},b.f=T=function(t){return t===O||t===a?new i(t):o(t)}),f(f.G+f.W+f.F*!j,{Promise:O}),n(26)(O,"Promise"),n(60)("Promise"),a=n(13).Promise,f(f.S+f.F*!j,"Promise",{reject:function(t){var e=T(this);return(0,e.reject)(t),e.promise}}),f(f.S+f.F*(s||!j),"Promise",{resolve:function(t){return x(s&&this===a?O:this,t)}}),f(f.S+f.F*!(j&&n(79)((function(t){O.all(t).catch(A)}))),"Promise",{all:function(t){var e=this,n=T(e),r=n.resolve,o=n.reject,i=_((function(){var n=[],i=0,a=1;v(t,!1,(function(t){var s=i++,c=!1;n.push(void 0),a++,e.resolve(t).then((function(t){c||(c=!0,n[s]=t,--a||r(n))}),o)})),--a||r(n)}));return i.e&&o(i.v),n.promise},race:function(t){var e=this,n=T(e),r=n.reject,o=_((function(){v(t,!1,(function(t){e.resolve(t).then(n.resolve,r)}))}));return o.e&&r(o.v),n.promise}})},function(t,e,n){t.exports=!n(7)&&!n(6)((function(){return 7!=Object.defineProperty(n(55)("div"),"a",{get:function(){return 7}}).a}))},function(t,e,n){var r=n(4);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e,n){var r=n(5),o=n(23),i=n(1)("species");t.exports=function(t,e){var n,a=r(t).constructor;return void 0===a||null==(n=r(a)[i])?e:o(n)}},function(t,e,n){var r,o,i,a=n(9),s=n(99),c=n(77),u=n(55),l=n(3),f=l.process,p=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,v=l.Dispatch,m=0,g={},y=function(){var t=+this;if(g.hasOwnProperty(t)){var e=g[t];delete g[t],e()}},b=function(t){y.call(t.data)};p&&h||(p=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return g[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},h=function(t){delete g[t]},"process"==n(12)(f)?r=function(t){f.nextTick(a(y,t,1))}:v&&v.now?r=function(t){v.now(a(y,t,1))}:d?(i=(o=new d).port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(t){l.postMessage(t+"","*")},l.addEventListener("message",b,!1)):r="onreadystatechange"in u("script")?function(t){c.appendChild(u("script")).onreadystatechange=function(){c.removeChild(this),y.call(t)}}:function(t){setTimeout(a(y,t,1),0)}),t.exports={set:p,clear:h}},function(t,e,n){var r=n(3).document;t.exports=r&&r.documentElement},function(t,e,n){"use strict";var r=n(23);function o(t){var e,n;this.promise=new t((function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r})),this.resolve=r(e),this.reject=r(n)}t.exports.f=function(t){return new o(t)}},function(t,e,n){var r=n(1)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,(function(){throw 2}))}catch(t){}t.exports=function(t,e){if(!e&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},t(i)}catch(t){}return n}},function(t,e,n){var r=n(14),o=n(29),i=n(81)(!1),a=n(62)("IE_PROTO");t.exports=function(t,e){var n,s=o(t),c=0,u=[];for(n in s)n!=a&&r(s,n)&&u.push(n);for(;e.length>c;)r(s,n=e[c++])&&(~i(u,n)||u.push(n));return u}},function(t,e,n){var r=n(29),o=n(15),i=n(105);t.exports=function(t){return function(e,n,a){var s,c=r(e),u=o(c.length),l=i(a,u);if(t&&n!=n){for(;u>l;)if((s=c[l++])!=s)return!0}else for(;u>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){var r=n(2),o=n(13),i=n(6);t.exports=function(t,e){var n=(o.Object||{})[t]||Object[t],a={};a[t]=e(n),r(r.S+r.F*i((function(){n(1)})),"Object",a)}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){var r=n(5),o=n(110),i=n(63),a=n(62)("IE_PROTO"),s=function(){},c=function(){var t,e=n(55)("iframe"),r=i.length;for(e.style.display="none",n(77).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write(" - - diff --git a/shepherd/blueprints/staticroutes/docs/charging.html b/shepherd/blueprints/staticroutes/docs/charging.html deleted file mode 100644 index 2d80c7c..0000000 --- a/shepherd/blueprints/staticroutes/docs/charging.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Charging | Robocon - - - - - - - -

Charging

The exact charger you have will vary, however the one you have should look a bit like this one:

A charger

To charge the battery find an adapter and plug the charger into the mains. All three LEDs should light up red. Take the battery and place it in the LiPo-safe bag so that only the leads protrude then take the four pin lead from the battery. Then plug that into the four pin connector on the charger, noting the direction they are keyed in.

WARNING

Always make sure that you charge the battery in a LiPo-safe bag. If you have any reason to suspect that the battery is damaged do NOT use it.

When the battery is charged all 3 LEDs will turn green, if the LED's flash red it means that there is a problem with your battery and you should contact us immediately.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/collecting-images-and-raw-analysis.html b/shepherd/blueprints/staticroutes/docs/collecting-images-and-raw-analysis.html deleted file mode 100644 index 2a52068..0000000 --- a/shepherd/blueprints/staticroutes/docs/collecting-images-and-raw-analysis.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Collecting Images and Raw Analysis | Robocon - - - - - - - -

Collecting Images and Raw Analysis

Every time the robot takes a picture it is updated on the web interface, during development it is occasionally useful to be able to also keep a log of pictures that have been analysed to check the camera focus, motion blur etc.

Gathering Data:

  1. Add a file with the name "collect_images.txt" to the USB stick to collect the images
  2. Add a file with the name "log_markers.txt" to the USB stick to collect analysis of images
  3. Insert the USB stick before turning the robot on
  4. Remember to fully shut down the robot before removing the USB stick

WARNING

Collecting all images may slow down the processing time from your robot - Use with care!

- - - diff --git a/shepherd/blueprints/staticroutes/docs/connecting.html b/shepherd/blueprints/staticroutes/docs/connecting.html deleted file mode 100644 index 0b053e4..0000000 --- a/shepherd/blueprints/staticroutes/docs/connecting.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Connecting | Robocon - - - - - - - -

Connecting to the Robot

  1. Turn on the robot by following the instructions here.
  2. Turn on your computer and wait until you reach the Windows desktop.
  3. Click on the WiFi icon in the bottom right and connect to RoboConYYYY-TeamXX where YYYY is the competition year and XX is your team number. Your WiFi password should be on the bottom of your BrainBox, underneath its network name.
  4. Navigate to http://robot.local in your web browser of choice (Chrome or Firefox is recommended). You should see an interface similar to this:

The Interface

From now on, this will be referred to as the Shepherd Homepage.

Next Steps

- - - diff --git a/shepherd/blueprints/staticroutes/docs/editor.html b/shepherd/blueprints/staticroutes/docs/editor.html deleted file mode 100644 index 3e63f37..0000000 --- a/shepherd/blueprints/staticroutes/docs/editor.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - Using the Editor | Robocon - - - - - - - -

Using the Editor

We recommend you use the code editor that's included with Shepherd to program your robot. You can either program in Python or use Blockly, a powerful Scratch-like programming tool.

Assuming you've connected to your robot, head to http://robot.local/editor or click the orange -editor button on the Shepherd homepage.

Upload Button

The Editor Interface

You should now see the editor interface. (yours will look slightly different to this)

Annotated Editor Interface

The green sidebar is the projects panel. This is where you can access or -export your existing projects, and create or import new ones. Clicking on a project in this list will open it in the -editor.

  • The orange button is the import button. This lets you load a saved project -into the editor.
  • The blue button is the create project button. This is how you -create a project.
  • The red button is the export button. This allows you to save the project -to your computer as a backup.
  • The pink button is the delete project button. This will allow you to -delete a project if you don't want it. There is no way to undo this action.

The yellow toolbar is the tab list. This is where you can find all your open -projects. If your project has a white circle at the end of the tab, it means you have unsaved content. Projects are -auto-saved after you stop editing them or when you run your project, but you can also manually save by pressing the CTRL -and S keys simultaneously.

The teal sidebar is the logs panel. This is where you can see the output -from your robot when you run your program.

  • The dark green button is the run button. Pressing this will prompt you to -save your project to your computer, just as a backup, and then run your code on the robot.
  • The dark red button is the stop button. Pressing this will force the robot -to stop what it's doing, useful if your robot is out of control.

The main section in the middle is the editor. This will be different depending on whether you're editing a Python or a -Blockly project.

Creating a new project

Click on the create project button (marked in blue in the above screenshot). -The create project dialog will appear:

Create Project Interface

Give your project a name, then select the type of project you would like. Choose either Python or Blockly. Then click the create button.

Your new project will open in the editor. See the sections below for more information on Python and -Blockly projects. Once you've read these, why not start learning how to program your robot.

Python Projects

Python projects provide a powerful development tool with syntax highlighting and code completion for the standard Python libraries and also the robot module. If you are interested, it uses the text editor that powers Visual Studio Code.

Blockly Projects

Google's Blockly is a programming environment similar to Scratch that allows you to program your robot with blocks. You still have access to all the features of the robot so you are not disadvantaged if you decide to use this over Python.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/enabling-and-disabling-power.html b/shepherd/blueprints/staticroutes/docs/enabling-and-disabling-power.html deleted file mode 100644 index b1b6116..0000000 --- a/shepherd/blueprints/staticroutes/docs/enabling-and-disabling-power.html +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Toggling 12v and 5v power | Robocon - - - - - - - -

Toggling 12v and 5v power

Output power at both 12v and 5v can be toggled on and off using your code. This can be done in a couple different ways.

Toggling 12v power

The BrainBox provides 12v power to the Aux 12v port on the side of the BrainBox next to the motors. In your code you can toggle whether this power is being supplied using the R.enable_12v property as shown below:

import robot
-R = robot.Robot()
-
-# ...Your code
-
-R.enable_12v = False
-
-# ...Rest of your code
-

This will disable the Aux 12v port until you re-enable it using R.enable_12v = True. -You can also check whether the 12v is currently enabled or disabled.

import robot
-R = robot.Robot()
-
-R.enable_12v = False
-print(R.enable_12v) # Outputs "False"
-

Toggling 5v power

The BrainBox supplied 5v power to multiple outputs. These are the Servos (all 0-3), as well as the 5v GPIO pin. You can disable these similarly to the 12v power by using the following code:

import robot
-R = robot.Robot()
-
-# ...Your code
-
-R.enable_5v = False
-
-# ...Rest of your code
-

This will disable the Servo ports as well as the 5v GPIO pin until you re-enable them using R.enable_5v = True. -You can also check whether the 5v is currently enabled or disabled.

import robot
-R = robot.Robot()
-
-R.enable_5v = False
-print(R.enable_5v) # Outputs "False"
-

Enabling or disabling power by default.

You can set the BrainBox to have 5v and 12v disabled by default using the following code:

import robot
-R = robot.Robot(start_enable_5v=False, start_enable_12v=False)
-

You can set both to false as in the example, or alternatively only set one. This will disable the power immediately when the brain loads to blinky, rather than you manually disabling it when the code starts execution.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/expanding-functionality.html b/shepherd/blueprints/staticroutes/docs/expanding-functionality.html deleted file mode 100644 index fbad0ef..0000000 --- a/shepherd/blueprints/staticroutes/docs/expanding-functionality.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Expanding Functionality | Robocon - - - - - - - -

Expanding Functionality

WARNING

Although the I2C and UART are connected to the Raspberry Pi, they operate at 5.1V not 3.3V. Check that your devices are compatible first!

I2C

I2C is a great way to a components to your BrainBox. Look at the datasheet for your device which you would like to connect and connect the SDA and SDL to the appropriate pins. You should now be able to send data to your device by using the SMBus2 python library.

WARNING

You should avoid address 0x08 (8) and 0x68 (104) because these are used by critical system components.

If you are interested in the I2C protocol there is a good guide to find out more about how it works here.

USB

You can use USB devices using the serial library. The connection will probably open on something similar to dev/ttyUSB0 but if you can't find it where you expect then connect the device to a Raspberry Pi running a recent OS image and observe where it appears.

UART

UART is not enabled by default on the BrainBox and you will need to ask on the forums for us to provide a patch to enable it should you wish to use it.

TIP

Please ask on the forums for more infomation if you wish to expand your BrainBox.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/first-steps/getting-started/index.html b/shepherd/blueprints/staticroutes/docs/first-steps/getting-started/index.html new file mode 100644 index 0000000..36f3159 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/first-steps/getting-started/index.html @@ -0,0 +1,142 @@ + Getting Started | RoboCon Docs + + Skip to content

Getting Started

Welcome to the docs for Robocon 2026!

+

RoboCon2025 Game Header

+

If you haven’t already, it’s a good idea to take a look at the rules for this year’s competition.

+ +

Once you’ve done that, you’ll need to turn your robot on.

+

To begin, get familiar with the kit provided. It includes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CountParts
2Lithium Polymer Batteries
1Battery Bag
1Battery Charger
1BrainBox
2Motor
2Wheels
1Caster Wheel
1Chassis Kit
2Servo Motor
1Start Button
1Power Switch
+ +
\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/gpio.html b/shepherd/blueprints/staticroutes/docs/gpio.html deleted file mode 100644 index 0f3878e..0000000 --- a/shepherd/blueprints/staticroutes/docs/gpio.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - GPIO | Robocon - - - - - - - -

GPIO

The GPIO (General Purpose Input Output) allows you to turn on LEDs, react to button presses, or do just about anything.

Our BrainBox has 4 GPIO pins that you can control. Before you do anything with a pin, you must first set its mode.

There are 4 modes:

Mode Python Description
Digital Output robot.OUTPUT Allows you to write a high or low signal
Digital Input robot.INPUT Allows you to read a high or low signal
Analog Input robot.INPUT_ANALOG Allows you to read a voltage, like a voltmeter
Pullup Input robot.INPUT_PULLUP Like input, but uses a weak pullup resistor

TIP

The GPIO are numbered 0-3

Python

To write a digital signal on pin 0:

R.gpio[0].mode = robot.OUTPUT
-R.gpio[0].digital = True
-

To read a digital signal on pin 1:

R.gpio[1].mode = robot.INPUT
-print(R.gpio[1].digital)
-

To read an analog signal on pin 2:

R.gpio[2].mode = robot.INPUT_ANALOG
-print(R.gpio[2].analog)
-

To read a pullup signal on pin 3

R.gpio[3].mode = robot.INPUT_PULLUP
-print(R.gpio[3].digital) # Note that this output will be inverted - True when the connnection is open, and False when closed.
-

TIP

All modes can be used on all pins. Note that you only need to set this mode once in your code, not every time you read an input or send an output.

Here's a more complete example:

import robot
-import time
-
-R = robot.Robot()
-
-R.gpio[0].mode = robot.INPUT
-R.gpio[1].mode = robot.INPUT_ANALOG
-R.gpio[2].mode = robot.OUTPUT
-R.gpio[3].mode = robot.INPUT_PULLUP
-
-outputState = False
-
-while True:
-    # Read the values of 0 and 1
-    print(R.gpio[0].digital)
-    print(R.gpio[1].analog)
-
-    # Switch output state and send it to 2
-    outputState = !outputState
-    R.gpio[2].digital = outputState
-
-    # Read the value of 3
-    print(R.gpio[3].digital)
-
-    # Pause for 2 seconds
-    time.sleep(2)
-

Blockly

The GPIO blocks can be found in the GPIO section, and function similarly to the python.

Pull-ups

The BrainBox possesses the ability to enable a built-in pull-up resistor on any input pin. This takes a small amount of explanation.

Normally, input pins are not connected to anything - known as “floating”. In this state, they might read high or low, or different values depending on their environment (due to anything from cosmic rays to the wiring in the building). This is obviously not good for consistent control.

Many pieces of off-the-shelf electronics that have some form of standard I/O output will connect this pin to 5V (high) and 0V (low) when required, so this is not a problem. However, for simple electronics, a microswitch for example, you would normally be required to connect a resistor between the input pin and 5V (a pull-up resistor), or between the input pin and 0V (a pull-down resistor) to keep the input in a known state until the switch overrides it by connecting directly to the opposite state.

However, the built-in pull-up resistor alleviates this need. It essentially wires in a resistor connected to 5V, meaning that when this option is enabled, an input pin will “default” to being high. This means you can simply connect a switch between the input pin and a ground pin without any need of resistors - when the switch is open, the pin will read high; when closed, it will read low.

An example weak pull up

- - - diff --git a/shepherd/blueprints/staticroutes/docs/hardware/batteries/index.html b/shepherd/blueprints/staticroutes/docs/hardware/batteries/index.html new file mode 100644 index 0000000..46fd575 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/hardware/batteries/index.html @@ -0,0 +1,110 @@ + Batteries | RoboCon Docs + + Skip to content

Batteries

Zippy Compact 2200mAh battery

+

The electronics kit contains two lithium-ion polymer (LiPo) batteries. These are similar to those used in laptops and are small and light for the amount of energy they contain. This is great for your robot but it is vital to treat such a high concentration of energy with respect. If you do not, there is a serious risk of fire and injury. To avoid this, you should follow the safety information on this page closely, at all times.

+

Your kit will come with several pieces of battery-related equipment:

+
    +
  • Two 11.1V 2200mAh LiPo Batteries.
  • +
  • One battery charger.
  • +
  • One battery charging bag.
  • +
+

You must not use any batteries, chargers, bags or cables not explicitly authorised by Hills Road RoboCon. If you have any doubts or wish to request permission to use a battery, charger, charging bag or battery cable not provided by Hills Road RoboCon, please email us at robotics@hrsfc.ac.uk.

+

Battery Safety

+ +

Storing

+

When your batteries are not actively in use, they should be safely stored. You must disconnect the batteries from all electrical equipment, and place them in the battery charging bag. You should then store the charging bag in a safe location.

+

If you are not going to use the batteries for a long period of time, such as more than a week, then you should charge the batteries beforehand. By themselves, batteries will discharge very slowly, and over-discharging will lead to damage. We recommend that you charge all batteries to at least 70% of capacity before being stored for a long period.

+

Operating Batteries

+

To use your batteries, you must connect them to the Hills Road RoboCon BrainBox. Do not tamper with the cable or connect the batteries to anything other than the power board (or the charger when charging).

+

During operation, the battery is protected by over-current protection by a regulator on the power board. If any equipment is short circuited, the over-current protection will activate - protecting the battery. There is a fuse placed inline with the power cord. If you suspect the fuse has gone something very wrong has happened. This is an important safety feature.

+ +

Mechanical damage to a battery can be dangerous, and a puncture or large force applied to a battery causes a serious risk of fire. To avoid this, your battery should be shielded from mechanical damage while you operate it. Secure your battery to your robot, so that it does not move or fall off while the robot moves. You should also build a compartment for the battery to be placed in to prevent accidental collisions damaging the battery.

+

Flat batteries

+

When the battery has been almost completely discharged, the Power Board will automatically go into a low power state and shut everything down. You should immediately disconnect the battery, and begin charging it. You should keep your second battery charged so that you can immediately switch to using it.

+

Do not store a discharged battery for more than a few days without charging it, as it may discharge further and become damaged.

+

Charging batteries

+

You should only use the battery charger provided by Hills Road RoboCon to charge the batteries provided in the kit. Plug your battery in and put it in a LiPo safe bag until all the lights turn green.

\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/hardware/charging/index.html b/shepherd/blueprints/staticroutes/docs/hardware/charging/index.html new file mode 100644 index 0000000..582dba9 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/hardware/charging/index.html @@ -0,0 +1,85 @@ + Charging | RoboCon Docs + + Skip to content

Charging

The exact charger you have will vary, however the one you have should look a bit like this one:

+

A charger

+

To charge the battery find an adapter and plug the charger into the mains. All three LEDs should light up red. Take the battery and place it in the LiPo-safe bag so that only the leads protrude then take the four pin lead from the battery. Then plug that into the four pin connector on the charger, noting the direction they are keyed in.

+ +

When the battery is charged all 3 LEDs will turn green, if the LED’s flash red it means that there is a problem with your battery and you should contact us immediately.

\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/hardware/expanding-functionality/index.html b/shepherd/blueprints/staticroutes/docs/hardware/expanding-functionality/index.html new file mode 100644 index 0000000..404accc --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/hardware/expanding-functionality/index.html @@ -0,0 +1,90 @@ + Expanding Functionality | RoboCon Docs + + Skip to content

Expanding Functionality

+

I2C

+

I2C is a great way to a components to your BrainBox. Look at the datasheet for your device which you would like to connect and connect the SDA and SDL to the appropriate pins. You should now be able to send data to your device by using the SMBus2 python library.

+ +

If you are interested in the I2C protocol there is a good guide to find out more about how it works here.

+

USB

+

You can use USB devices using the serial library. The connection will probably open on something similar to dev/ttyUSB0 but if you can’t find it where you expect then connect the device to a Raspberry Pi running a recent OS image and observe where it appears.

+

UART

+

UART is not enabled by default on the BrainBox and you will need to ask on the forums for us to provide a patch to enable it should you wish to use it.

+
\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/hardware/kit-list-of-parts/index.html b/shepherd/blueprints/staticroutes/docs/hardware/kit-list-of-parts/index.html new file mode 100644 index 0000000..9adcbd2 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/hardware/kit-list-of-parts/index.html @@ -0,0 +1,122 @@ + Kit List of Parts | RoboCon Docs + + Skip to content

Kit List of Parts

The RoboCon kit

+

We hope that the RoboCon kit was useful to you, we ask that all kits are returned to us over the summer so that we can improve them and keep this competition free for years to come.

+

Packing and returning the kit

+

Shipping can sometimes be quite rough for the kit and so we require the following standards to be adheared to if the kit is to be shipped:

+
    +
  • The kit it should be returned inside of the Really Useful Box (RUB) provided
  • +
  • All space inside the RUB should be filled with a packing material (cardboard etc) such that the kit can not move around inside the RUB.
  • +
  • The RUB should be wrapped in a protective layer of cardboard.
  • +
  • Most couriers have rules and regulations regarding shippment of lithium batteries, you must check with any courier beforehand about lithium batteries. In most cases it is required for the batteries to be in a device meaning that the loose batteries provided in the RoboCon kit can not be shipped. You may find it easier to return the kit to Hills Road in person. Shipment is at your own risk.
  • +
  • Hills Road Robotics will not fund the shipment of kit back to us.
  • +
+

If you plan to return the kit to Hills Road in person then please email robotics@hrsfc.ac.uk and we will organise a time to have someone meet you at reception.

+

Items to be returned

+

Containers

+
    +
  • 1 x 12L Really Useful Box
  • +
+

Electronics Kit

+
    +
  • 1 BrainBox
  • +
  • 1 microservo 9g SG90
  • +
  • 1 6 pin GPIO connector
  • +
  • 1 2 pin 12V connector
  • +
+

Switches

+
    +
  • Red switch, black connector: ON/OFF (latching)
  • +
  • Black switch, green connector: Start (momentary)
  • +
+

Batteries

+
    +
  • 2 x 12 V LiPo Battery
  • +
  • 1 x Turnigy E3 Compact 2S/3S Lipo Charger
  • +
  • 1 x Lithium Polymer Charge Pack
  • +
+

Computer

+
    +
  • 1 Tablet computer
  • +
  • 1 Charging brick
  • +
  • 1 Power lead
  • +
+
\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/hardware/minibot-assembly/index.html b/shepherd/blueprints/staticroutes/docs/hardware/minibot-assembly/index.html new file mode 100644 index 0000000..9ae3f9a --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/hardware/minibot-assembly/index.html @@ -0,0 +1,82 @@ + Minibot Assembly | RoboCon Docs + + Skip to content

Minibot Assembly

You can download instructions on how to make your minibot here.

+

\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/hardware/the-brainbox/index.html b/shepherd/blueprints/staticroutes/docs/hardware/the-brainbox/index.html new file mode 100644 index 0000000..776e750 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/hardware/the-brainbox/index.html @@ -0,0 +1,169 @@ + The BrainBox | RoboCon Docs + + Skip to content

The BrainBox

The BrainBox is the core of the kit which we provide. In it is all of the electronics and software you need to power a robot. Lets start by turning it on. Take a battery from the kit and plug it into the yellow socket labelled battery, then take a red “power button” and connect that to the black connector along the side of the BrainBox. The battery and start button are both labelled on the red surface of the BrainBox. +The brain box

+

How to turn everything on

+

Pressing the start button will cause the battery status LEDs on the front of the BrainBox flash in an upwards direction and the power LED turns green. When the user light starts flashing blue your BrainBox is ready to run code. You can now turn connect to your robot. The user LED will go solid while code is running.

+

Power

+

The BrainBox distributes power to the robot from the battery. It provides both 12V and 5V power out. All power must go through the BrainBox and the fuse should never be replaced.

+

The On/Off switch also plugs into the BrainBox as well as the Start button which is used to start your robot code running.

+

Motors & 12V Power

+

The specifications for the motor board can be found here, however to summarize:

+ + + + + + + + + + + + + + + + + + + + + +
Condition per channelMaximum Value
Continuous current10A
Peak current (10 seconds)30A
Operating Voltage12V
+ +

How to turn everything off

+

When you are done for the day, press the power button, the user LED will flash rapidly, when this turns off you may unplug the battery.

+

USB’s

+

On the new brainBox, there is only one USB port. If you want to use something that requires a USB port such as a USB camera, you will need to get your own USB hub.

+

GPIO

+

GPIO - Out

+

All of the BrainBox’s GPIO pins are connected in-series with a 1K Ohm resistor, to provide current limiting. This means that you can plug devices such as LED’s straight into your BrainBox.

+

Nominally they operate at 5V but depending on your load the true output will vary. You can calculate the voltage you will get across your load by measuring its resistance, then doing the sum:

+

(5*Load_resistance)/(Load_resistance+1000)

+

GPIO - In

+

We advise against you using analogue inputs with an impedance (You can think of impedance as “effective resistance in an analogue circuit”) of greater than 9K Ohm’s as this will result in values which do not necessarily correspond to what you’d expect.

+

If you need to sense something with an impedance of more than 9K then you will need to use an Op-amp to buffer the input. If you would like more details on how to do this please contact us on the forums.

+

GPIO - Limits

+

Do not try and sink or source more than 25mA into the BrainBox’s GPIO, it may damage some of the internal components.

+

PWM Pins

+

PWM (Pulse Width Modulation) is a technique used for sending signals to a device for how much it should do a thing. This could be how fast to spin a motor, or the position to turn an RC Servo to. It does this by sending regular pulses, which vary in width. The length of the pulse tells the device how much to do the thing. If you are interested you can find out more about using PWM for control here.

+

Please note you will not be able to drive large motors over the PWM pin’s supplied as the maximum which they can supply is 3A at 5V.

+

The PWM pins ranges:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ValuePulse
01.5ms
1002ms
-1001ms
1782.39ms
-1780.61ms
+

Pin Out

+

IO

+

USB's

+

Motors

+

Motors

+

Front

+

Front

+

Expansion I2C, UART & USB

+

For expansion please see the expansion page.

\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/hello-challenges.html b/shepherd/blueprints/staticroutes/docs/hello-challenges.html deleted file mode 100644 index e48f73d..0000000 --- a/shepherd/blueprints/staticroutes/docs/hello-challenges.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - Hello Challenges | Robocon - - - - - - - -

Challenges

The following are challenges for you to attempt and might give you a some help for the competition...

  1. Create a program that turns a LED on when a button is pressed.
  2. Create a program that makes the robot move a given distance.
  3. Create a program that makes a robot turn towards the first marker it sees.
  4. Create a program that makes the robot move towards the first marker it sees.

More challenges

At the launch, we gave teams a PDF of challenges to complete. You can find a -copy of that here. -Note that quite a few of these require input from the red shirts, so you may have to adapt them to suit what you have available!

Next Steps

You are now familiar with the RoboCon kit! We recomend that you now start thinking about your strategy for how you will win. Design your robot in little steps, and test along the way - getting a prototype up and rolling is the best way to ensure your robot will be achieving your goals by the time the competition rolls around! So best of luck, and don't delay - you've got some engineering to do...

- - - diff --git a/shepherd/blueprints/staticroutes/docs/hello-gpio.html b/shepherd/blueprints/staticroutes/docs/hello-gpio.html deleted file mode 100644 index dde7103..0000000 --- a/shepherd/blueprints/staticroutes/docs/hello-gpio.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - Hello GPIO | Robocon - - - - - - - -

GPIO

GPIO, or General Purpose Input Output, is the main way you'll interface with simple or obscure bits of hardware. This tutorial will introduce the GPIO system and how to use it.

GPIO Pins

On the side of your BrainBox, there are 4 regular pins and a "+5V" and "-" pin. The top of the BrainBox labels which pin corresponds to which number. Different devices need to be plugged into different pins.

LED Output

TIP

GPIO outputs are already protected by a 1k Ohm current limiting resistor, you can connect LEDs directly!

If you want to put an LED on your robot, for testing or just for looks, you'll need to plug the short leg of the LED into the - (ground) pin, and the long leg of the LED into any regular pin (such as 1). Then, use the following code to set up the pin in OUTPUT mode and turn the LED on:

import robot
-R = robot.Robot()
-
-# If you're not using GPIO pin 1, change this number to whatever pin you're using.
-R.gpio[0].mode = robot.OUTPUT
-R.gpio[0].digital = True
-

Try using a loop to make the light turn on and off every 2 seconds. You'll need the time library from the motors exercise.

Buttons

While your robot hopefully won't be colliding with much, buttons are a good way for a robot to know if it's driven into something. Buttons should be plugged into the - pin and a regular pin (such as 0). Using the INPUT_PULLUP mode, you can detect when a button is pressed.

import robot
-import time
-R = robot.Robot()
-
-# If you're not using GPIO pin 0, change this number to whatever pin you're using.
-R.gpio[0].mode = robot.INPUT_PULLUP
-
-while True:
-    if not R.gpio[0].digital:
-        print("Pressed")
-    else:
-        print("Not Pressed")
-    time.sleep(0.1)
-

Note that INPUT_PULLUP returns inverted values - True when it isn't pressed and False when it is. This means we use not to invert the output we get back to something more sensible for our use.

Try making a light turn on or off depending on if a button is pressed. An explanation of why it is needed to use INPUT_PULLUP can be found in the GPIO documentation.

Potentiometers

Another form of input is a potentiometer or a variable resistor. Potentiometers should be plugged into the +5V, a regular pin (such as 3) and the - pin. Using INPUT_ANALOG mode, you can read the voltage output of the resistor (between 0V and 5V).

import robot
-
-R = robot.Robot()
-
-POT_PIN = 3
-
-R.gpio[POT_PIN].mode = robot.INPUT_ANALOG
-
-while True:
-    print(R.gpio[POT_PIN].analog)
-

Using sensors with retroreflective tape

You can also use retroreflective sensors with your robot's GPIO. This can be configured in the code as follows:

import robot
-import time
-
-R = robot.Robot()
-
-R.gpio[0].mode = robot.INPUT
-
-while True:
-    if not R.gpio[0].digital:
-        print("Reflecting!")
-    time.sleep(1)
-

This is a piece of code, that when run, should detect things very close to the sensor, or reflective objects further away (such as the retroreflective tape in the arena).
-Note that the detector also returns False when it detects something, so not is used. Retroreflective tape is used in the arena to mark the borders of each quadrant. Using a sensor like this facing downwards can allow your robot to detect when it passes into a new quadrant. This could be used for a whole variety of helpful tasks when navigating the arena. We look forward to seeing your creativity!

- - - diff --git a/shepherd/blueprints/staticroutes/docs/hello-motors.html b/shepherd/blueprints/staticroutes/docs/hello-motors.html deleted file mode 100644 index b99577e..0000000 --- a/shepherd/blueprints/staticroutes/docs/hello-motors.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - Hello Motors | Robocon - - - - - - - -

Making The Robot Go

Your robot is unlikely to score many points if it doesn't go anywhere. This tutorial will show you how to access and turn the motors on your robot.

Getting Ready

First things first, make sure that your robot is not about to drive off a table. Even if you're planning on turning on the spot, it's best to put your robot on the floor in case it does something unexpected.

Next, you'll need to initialise the robot. For this exercise, you'll also need the "time" Python library - remember that we used this last chapter to help our camera code along.

import time
-import robot
-R = robot.Robot()
-

Driving Around

TIP

Motor power is automatically scaled for the 3-6V motors included in the kit, if you are sourcing your own motors then see the motors reference for how to allow faster speeds.

Now that everything is set up, it's time to set the motors. All the motors are stored in a list inside the Robot variable - to access the first motor, you can use R.motors[0], the second motor is found with R.motors[1].

Changing the speed of the motor is easy - just set the motor to a number from -100 to 100. Immediately setting the power to 100 can have unwanted side effects, so we'll start by setting them to half power:

import time
-import robot
-R = robot.Robot()
-
-R.motors[0] = 50
-R.motors[1] = 50
-

Running this program will either make you move forwards or make your robot turn on the spot, depending on how you have set up the motors. If your motor is spinning, try setting one of the motors to the negative value, spinning it in the other direction, and swap which one is negative until your robot drives forwards in a way you are happy with.

The issue with this code is that unfortunately, it will never tell it to stop moving forwards, so hopefully you put it on the floor and it hasn't driven off the table.
-To fix this we can set the power of the motors to 0 after a couple of seconds:

import time
-import robot
-R = robot.Robot()
-
-R.motors[0] = 50
-R.motors[1] = 50
-
-time.sleep(2)
-
-R.motors[0] = 0
-R.motors[1] = 0
-

This is where sleep() becomes handy. It pauses the execution of your code with the motors still at 50, and so they stay running until we stop them after the sleep() call ends.

To turn the robot, you just need to set one motor going forwards and the second motor going backwards. The following program makes the robot do a little dance - try it out! (Note that if your robot had inverted motors from earlier, you may have differing results)

import time
-import robot
-R = robot.Robot()
-
-speed = 50
-
-R.motors[0] = speed
-R.motors[1] = speed
-
-time.sleep(2)
-
-R.motors[0] = speed
-R.motors[1] = -speed
-
-time.sleep(2)
-
-R.motors[0] = -speed
-R.motors[1] = -speed
-
-time.sleep(2)
-
-R.motors[0] = -speed
-R.motors[1] = speed
-
-time.sleep(2)
-
-R.motors[0] = 0
-R.motors[1] = 0
-

A final note, even if you set both motors the same power, your robot probably won't drive in a perfectly straight line. This is due to defects in the motors, and unless you get specialised motors, no two motors will have the same offset. How your robot deals with this is up to you!

Troubleshooting and Further Reading

Connecting to the robot
Uploading and running code
Using the editor
Motors

- - - diff --git a/shepherd/blueprints/staticroutes/docs/hello-servos.html b/shepherd/blueprints/staticroutes/docs/hello-servos.html deleted file mode 100644 index 2a9354a..0000000 --- a/shepherd/blueprints/staticroutes/docs/hello-servos.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Hello Servos | Robocon - - - - - - - -

Servos

Servos are a type of motor with internal feedback they can move to a set position. The type of servo you will come across most frequently have a set range of motion, but with precise position control you can do a whole manner of actions within the mechanics of your robot! Servo motors (or anything else you connect to the servo ports of your BrainBox) are controlled by accessing R.servos[], similar to how motors are accessed.

import robot
-import time
-
-R = robot.Robot()
-R.servos[0].mode = robot.PWM_SERVO
-
-R.servos[0] = 50
-

However, where the value of a motor determines the speed it turns, the value of a servo controls the position it is at on its rotation, with a range of -100 to 100. Try it out on your robot to see which values correspond to each position!

TIP

When your robot is turned off, the brain will automatically set all of its servos to the 0 position. Make sure you factor this in when you run your robots!

- - - diff --git a/shepherd/blueprints/staticroutes/docs/hello-vision.html b/shepherd/blueprints/staticroutes/docs/hello-vision.html deleted file mode 100644 index cdfe929..0000000 --- a/shepherd/blueprints/staticroutes/docs/hello-vision.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - Hello Vision | Robocon - - - - - - - -

Making the Robot See

Your robot can use its camera to see markers to identify tokens and walls. This tutorial will help you make a program that makes the robot output the number of cubes it can see.

Initialising the Robot

Create a new script called "VisionTest".

Unlike in the previous tutorial, Hello World, the use of the first couple lines of code is important here. So let's break them down:

import robot
-R = robot.Robot()
-

This creates a "Robot" object, and places it inside the variable "R". This allows us to use robot functions through the R variable, such as R.See(). If you are using Blockly, the robot is initialised automatically.

Here is a basic introduction into what Object Oriented Programming is.

Counting Markers

To make the robot "see" what is in front of it we have to call the function R.see() and assign the result to a variable. This will set that variable to a list of every marker the robot can see:

markers = R.see()
-

Every item in the list contains information about the type of the marker, the distance/angle to the marker, and more! For now all we want to do is to find the number of markers the robot can see, so we just need to print the length of the list:

print(len(markers))  
-# len gets the length of something,
-# in this case a list of all the markers we can see
-

If we run this code as it is, it will output the number of markers it can see once and then stop. To make it continue looking we need to put it in a while True loop, so it will repeat our program forever (or until we turn it off).

The complete code is as follows:

import robot
-import time
-R = robot.Robot()
-
-while True:
-    markers = R.see()
-    print(len(markers))
-    time.sleep(2)
-

You'll notice some new lines we snuck in there - an import time and a time.sleep(2). The first of these adds another toolset to our code, the time library. This most notably adds the sleep function we used just now, which pauses the code's execution for the number of seconds specified - in this case two.

TIP

The camera takes a moment to process the images it takes. While you can run it without any delay in the loop, this can lead to some buggy behaviour, and will act more like running every 0.6 or so seconds. In general, adding a sleep() gives you more control over what your robot is doing.

Running the code

Place a few markers infront of the camera on the robot about 10-20cm away and run the code. In the logs the number of markers visible will be outputted, and in addition to the logs, the raw images taken by the camera can be seen, which can be useful for working out if something is blocking the camera.

Troubleshooting and Further Reading

Connecting to the robot
Initalising the robot
Using the editor
Vision Code

- - - diff --git a/shepherd/blueprints/staticroutes/docs/hello-world.html b/shepherd/blueprints/staticroutes/docs/hello-world.html deleted file mode 100644 index 02d8228..0000000 --- a/shepherd/blueprints/staticroutes/docs/hello-world.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - Hello World | Robocon - - - - - - - -

Hello

Welcome to the RoboCon tutorials!
-Following each of the tasks in this category will start you on your way to getting your robot doing stuff.

Ready? Let's go!

These tutorials will always assume that you have connected to the robot, started on the homepage and completed the previous tutorials. To find out how to connect to your robot click here

Creating your first program

As this is the first program that your robot will run we'll make it as simple and clichéd as it can get:
-We're going to make the robot write "Hello World!" into the output logs!

Create a new file

Run Button

  1. On the main page click the "Editor" button.
  2. On the tabs click new file and name it something (e.g. "HelloWorld")

Writing the Code

There are two ways to go about writing code for the robot:

  1. Python - The main language used to program robots with the BrainBox.
  2. Blockly - A Scratch-like language that allows you to write programs connecting blocks. This will automatically produce a python script that can be run in the robot.

Both can be used to program a winning robot for the competition and it is up to you which one you develop your robot with. However for the following tutorials, Python will be used.

Details on both these methods can be found in the programming section of the documentation.

If you are running into problems using the editor, more details can be found here.

In the editor window write:

import robot
-
-R = robot.Robot()
-
-print("Hello World!")
-

You don't need to know much about what the first couple lines do - they are covered in later chapters, and do setup for the robot to be able to run. The important bit for you to understand is the last bit - the print() statement.

Running the code

Click on the green run button in the top right corner:

Run Button

The logs should then appear with a friendly "Hello World!"

Troubleshooting and Further Reading

Connecting to the robot
Uploading and running code
Using the editor

- - - diff --git a/shepherd/blueprints/staticroutes/docs/images/63391_m_1__6.jpg b/shepherd/blueprints/staticroutes/docs/images/63391_m_1__6.jpg new file mode 100644 index 0000000..738d650 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/63391_m_1__6.jpg differ diff --git a/shepherd/blueprints/staticroutes/docs/images/BrainBox power input side profile labelled.png b/shepherd/blueprints/staticroutes/docs/images/BrainBox power input side profile labelled.png new file mode 100644 index 0000000..16bb614 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/BrainBox power input side profile labelled.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/DragonsLair-Logo.png b/shepherd/blueprints/staticroutes/docs/images/DragonsLair-Logo.png new file mode 100644 index 0000000..8e4b3c2 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/DragonsLair-Logo.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/RoboCon2025-Header.png b/shepherd/blueprints/staticroutes/docs/images/RoboCon2025-Header.png new file mode 100644 index 0000000..da4bfd1 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/RoboCon2025-Header.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/RoboCon2026-Header.png b/shepherd/blueprints/staticroutes/docs/images/RoboCon2026-Header.png new file mode 100644 index 0000000..e9d6498 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/RoboCon2026-Header.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/Robocon_logo_blackandwhite.png b/shepherd/blueprints/staticroutes/docs/images/Robocon_logo_blackandwhite.png new file mode 100644 index 0000000..b3791b9 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/Robocon_logo_blackandwhite.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/ThereAre3RobotsInThisImage.jpg b/shepherd/blueprints/staticroutes/docs/images/ThereAre3RobotsInThisImage.jpg new file mode 100644 index 0000000..6ec19e9 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/ThereAre3RobotsInThisImage.jpg differ diff --git a/shepherd/blueprints/staticroutes/docs/images/angled.png b/shepherd/blueprints/staticroutes/docs/images/angled.png new file mode 100644 index 0000000..f3001d4 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/angled.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/brainboxmotors.png b/shepherd/blueprints/staticroutes/docs/images/brainboxmotors.png new file mode 100644 index 0000000..2067234 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/brainboxmotors.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/capture.png b/shepherd/blueprints/staticroutes/docs/images/capture.png new file mode 100644 index 0000000..3fb325d Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/capture.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/challenges.pdf b/shepherd/blueprints/staticroutes/docs/images/challenges.pdf deleted file mode 100644 index 02c385d..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/images/challenges.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/images/charger.png b/shepherd/blueprints/staticroutes/docs/images/charger.png new file mode 100644 index 0000000..49a7f89 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/charger.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/editor-robot-run.png b/shepherd/blueprints/staticroutes/docs/images/editor-robot-run.png new file mode 100644 index 0000000..2a5b408 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/editor-robot-run.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/powerconnector.png b/shepherd/blueprints/staticroutes/docs/images/powerconnector.png new file mode 100644 index 0000000..344aa70 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/powerconnector.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/redpanel.png b/shepherd/blueprints/staticroutes/docs/images/redpanel.png new file mode 100644 index 0000000..0ab1fcb Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/redpanel.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/roboconHeader.jpg b/shepherd/blueprints/staticroutes/docs/images/roboconHeader.jpg deleted file mode 100644 index 58395d9..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/images/roboconHeader.jpg and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/images/run-button.jpg b/shepherd/blueprints/staticroutes/docs/images/run-button.jpg index 4d04b15..e36dab1 100644 Binary files a/shepherd/blueprints/staticroutes/docs/images/run-button.jpg and b/shepherd/blueprints/staticroutes/docs/images/run-button.jpg differ diff --git a/shepherd/blueprints/staticroutes/docs/images/run.png b/shepherd/blueprints/staticroutes/docs/images/run.png new file mode 100644 index 0000000..decb1f7 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/run.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/shepherd-editor-annotated.png b/shepherd/blueprints/staticroutes/docs/images/shepherd-editor-annotated.png new file mode 100644 index 0000000..b9bf2b7 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/shepherd-editor-annotated.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/shepherd-editor-create-project.png b/shepherd/blueprints/staticroutes/docs/images/shepherd-editor-create-project.png new file mode 100644 index 0000000..bfb5792 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/shepherd-editor-create-project.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/shepherd-editor.png b/shepherd/blueprints/staticroutes/docs/images/shepherd-editor.png new file mode 100644 index 0000000..4448bc7 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/shepherd-editor.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/shepherd-run.png b/shepherd/blueprints/staticroutes/docs/images/shepherd-run.png new file mode 100644 index 0000000..9495455 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/shepherd-run.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/shepherd.png b/shepherd/blueprints/staticroutes/docs/images/shepherd.png index 2875e99..02f7643 100644 Binary files a/shepherd/blueprints/staticroutes/docs/images/shepherd.png and b/shepherd/blueprints/staticroutes/docs/images/shepherd.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/upload-button.png b/shepherd/blueprints/staticroutes/docs/images/upload-button.png new file mode 100644 index 0000000..9d06e12 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/upload-button.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/upload.png b/shepherd/blueprints/staticroutes/docs/images/upload.png new file mode 100644 index 0000000..3f58e91 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/upload.png differ diff --git a/shepherd/blueprints/staticroutes/docs/images/usbstick.png b/shepherd/blueprints/staticroutes/docs/images/usbstick.png new file mode 100644 index 0000000..336f7b0 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/images/usbstick.png differ diff --git a/shepherd/blueprints/staticroutes/docs/index.html b/shepherd/blueprints/staticroutes/docs/index.html index 075bbe8..5d90354 100644 --- a/shepherd/blueprints/staticroutes/docs/index.html +++ b/shepherd/blueprints/staticroutes/docs/index.html @@ -1,30 +1,53 @@ - - - - - - Getting Started | Robocon - - - - - - - -

Getting Started

Welcome to the docs for Robocon 2025!

We suggest you first grasp the idea of the rules.

TIP

If you are viewing this page on your BrainBox then please check the website for the latest revision.

Game logo -Once you've done that, you'll need to turn your robot on.

To begin, get familiar with the kit provided. It includes :

Count Parts
2 Lithium Polymer Batteries
1 Battery Bag
1 Battery Charger
1 BrainBox
2 Motor
2 Wheels
1 Caster Wheel
1 Chassis
2 Servo Motor
1 Start Button
1 Power Switch

WARNING

Handling batteries incorrectly can be dangerous. Make sure you follow these safety guidelines at all times.

TIP

You can also access these docs from your robot. Go to http://robot.local/docs when you're connected to your robot.

If you have any questions related to the competition, the brainboxes, or any ideas or struggles you have, feel free to drop us an email - we are happy to help!

- - - + Welcome to the docs! | RoboCon Docs + + Skip to content
RoboCon 2025 Game

Welcome to the RoboCon 2026 Docs

Containing everything you'll need to know about the RoboCon kit!

+ +

Welcome to our newly redesigned docs, containing everything you’ll need to know about building a robot with your RoboCon kit.

+

We hope you find them useful. If you bump into any issues or have any suggestions for our website, please don’t hesitate to reach out to us!

+

Not looking for the docs?

Visit the RoboCon website for information about the competition and how to get involved.

Still stuck?

Get in contact with us! Send us an email, and we’ll answer any questions you have. You can also arrange a video call with one of our Hills Road student mentors!

\ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/init-robot.html b/shepherd/blueprints/staticroutes/docs/init-robot.html deleted file mode 100644 index 58c8f2c..0000000 --- a/shepherd/blueprints/staticroutes/docs/init-robot.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - Initialising the Robot | Robocon - - - - - - - -

Initialising the Robot

When using Python to program your robot, you must remember to initialise the robot. If you're using Blockly, this is done automatically.

All of the code required to control the Robot is located in the robot python module. -To import the module, and initialise the robot use the following code:

import robot
-R = robot.Robot()
-

When you initialise the robot with robot.Robot(), your code will be paused until the hardware start button or web interface run button is pressed. When the Robot is waiting for either of these buttons to be pressed, the blue user LED will flash on and off.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/kit-list-of-parts.html b/shepherd/blueprints/staticroutes/docs/kit-list-of-parts.html deleted file mode 100644 index ca04011..0000000 --- a/shepherd/blueprints/staticroutes/docs/kit-list-of-parts.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Kit List of Parts | Robocon - - - - - - - -

The RoboCon kit

We hope that the RoboCon kit was useful to you, we ask that all kits are returned to us over the summer so that we can improve them and keep this competition free for years to come.

Packing and returning the kit

Shipping can sometimes be quite rough for the kit and so we require the following standards to be adheared to if the kit is to be shipped:

  • The kit it should be returned inside of the Really Useful Box (RUB) provided
  • All space inside the RUB should be filled with a packing material (cardboard etc) such that the kit can not move around inside the RUB.
  • The RUB should be wrapped in a protective layer of cardboard.
  • Most couriers have rules and regulations regarding shippment of lithium batteries, you must check with any courier beforehand about lithium batteries. In most cases it is required for the batteries to be in a device meaning that the loose batteries provided in the RoboCon kit can not be shipped. You may find it easier to return the kit to Hills Road in person. Shipment is at your own risk.
  • Hills Road Robotics will not fund the shipment of kit back to us.

If you plan to return the kit to Hills Road in person then please email robotics@hrsfc.ac.uk and we will organise a time to have someone meet you at reception.

Items to be returned:

Containers:

  • 1 x 12L Really Useful Box

Electronics Kit:

  • 1 BrainBox
  • 1 microservo 9g SG90
  • 1 6 pin GPIO connector
  • 1 2 pin 12V connector

Switches:

  • Red switch, black connector: ON/OFF (latching)
  • Black switch, green connector: Start (momentary)

Batteries:

  • 2 x 12 V LiPo Battery
  • 1 x Turnigy E3 Compact 2S/3S Lipo Charger
  • 1 x Lithium Polymer Charge Pack

Computer:

  • 1 Tablet computer
  • 1 Charging brick
  • 1 Kettle lead

Note

Please return any surviving parts of the minibot

- - - diff --git a/shepherd/blueprints/staticroutes/docs/learning-python.html b/shepherd/blueprints/staticroutes/docs/learning-python.html deleted file mode 100644 index 2ffae81..0000000 --- a/shepherd/blueprints/staticroutes/docs/learning-python.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Learning Python | Robocon - - - - - - - -

Learning Python

Python is an interpreted high-level programming language for general-purpose programming. First released in 1991, Python has a design philosophy that emphasises code readability, notably using significant whitespace.

TIP

If you don't know Python, why not try out Blockly? It's just as powerful, but lets you use a simple drag and drop interface to program the robot - and if you have any struggles with it, why not drop us an email! We want to make it as easy for you to get started as possible.

There are many resources online for learning Python, here are a few good ones that we would recommend:

  • Student Robotics' tutorial has a tutorial called Python: a whirlwind tour. This was written for Student Robotics competitors (a similar competition to the one you are taking part in), and explains the basics while trying not to overwhelm you.
  • CSNewbs has a very comprehensive tutorial, that takes you through from the basics to the slightly more advanced. The later chapters cover things like File Handling and UIs - you shouldn't be using these on your brains, but go wild on your own devices!
  • The Official Python Tutorial can be pretty handy - the good stuff starts at chapter 3, but you should at least skim the stuff before it; there is a lot there and it may be a little overwhelming.
  • A number of tutorials for beginners are linked to from here.
  • Learn X in Y minutes is quite nice if you've programmed before in another language and just want to learn the syntax. (Tip: If you're trying to complete the challenges, here's where we say you can learn Python in "Y" minutes)
  • The Official Docs can be handy, but a little dense! Give them a shot, but don't worry if you can't find what you are looking for.

WARNING

Running code on your brain may have unintended side effects if it does not call import robot, and doesn't create a robot object (R = robot.Robot()). Its best to leave those lines in, even if you don't need to run anything related to the hardware on the brain.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/libraries.html b/shepherd/blueprints/staticroutes/docs/libraries.html deleted file mode 100644 index 4f271d8..0000000 --- a/shepherd/blueprints/staticroutes/docs/libraries.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Libraries | Robocon - - - - - - - -

Libraries

TIP

if you wish to use a library that is not on the list, please contact us.

the following libraries are installed on your robot.

Package Version
chardet 2018.8.24
entrypoints 0.3
gevent 21.8.0
gpiozero 1.6.2
greenlet 1.1.1
keyrings 17.1.1
numpy 1.21.2
picamera 1.13
pillow 8.3.2
pluggy 1.0.0
pycairo 1.20.1
pygobject 3.30.4
pyserial 3.5
rpi.gpio 0.7.0
scipy 1.7.1
smbus2 0.4.1
spidev 3.5
wiringpi 2.60.1

WARNING

documentation might not align with used version, please verify documentation is set to the specified version as that is what is installed on the robot

- - - diff --git a/shepherd/blueprints/staticroutes/docs/markers.html b/shepherd/blueprints/staticroutes/docs/markers.html deleted file mode 100644 index 96e1d44..0000000 --- a/shepherd/blueprints/staticroutes/docs/markers.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Markers | Robocon - - - - - - - - - - - diff --git a/shepherd/blueprints/staticroutes/docs/markers.pdf b/shepherd/blueprints/staticroutes/docs/markers.pdf deleted file mode 100644 index 0111dd6..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/markers.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/minibot-assembly.html b/shepherd/blueprints/staticroutes/docs/minibot-assembly.html deleted file mode 100644 index 79f098c..0000000 --- a/shepherd/blueprints/staticroutes/docs/minibot-assembly.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - Minibot Assembly | Robocon - - - - - - - - - - - diff --git a/shepherd/blueprints/staticroutes/docs/motors.html b/shepherd/blueprints/staticroutes/docs/motors.html deleted file mode 100644 index 968575b..0000000 --- a/shepherd/blueprints/staticroutes/docs/motors.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - Motors | Robocon - - - - - - - -

Motors

Motors can be used for all sorts of things, besides just moving your robot. For instance, they could also be used as part of a mechanism to collect cubes. However you decide to use them, they're really simple to control.

When you control motors, you can choose how much power you want to give them. This is expressed as a percentage, so 0% means a stopped motor and 100% means a motor at full power.

TIP

If you have large motors you should avoid using 100% power when the motor is stalled or stationary, otherwise the rush of current may cause the robot to shut down the motor output. Instead of jumping from 0% to 100% start at a lower value such as 50% and work your way up.

If you want to spin your motors in reverse, just stick a negative sign in front of your percentage.

Python

You can control motors using the motors property of the Robot object. To set the power of the first motor to 60% use:

R.motors[0] = 60
-

Remember that indexes start at 0; To control the second motor instead, replace motors[0] with motors[1].

To stop both motors:

R.motors[0] = 0
-R.motors[1] = 0
-

Here's a more complete example:

import robot
-
-R = robot.Robot()
-
-# set motor 1 to 60% power
-R.motors[0] = 60
-
-# set motor 2 to 60% power in the backwards direction
-R.motors[1] = -60
-
-# turn both motors off
-R.motors[0] = 0
-R.motors[1] = 0
-

TIP

By default the BrainBox is designed to work safely with the TT motors supplied, these are 6V motors. If you choose to use motors that have a different nominal voltage, then you can specify this when initalising the robot object. For example when using 9V motors:

R = robot.Robot(max_motor_voltage=9)
-

We do not recommend running motors above their design voltage, it may (sometimes dramatically) shorten the lifespan of your motors. If you choose to overvolt your motors you should be prepared to swap them with spares and design your robot to ensure you have access to replace them.

Blockly

Blocks for controlling motors can be found in the Movement section. It follows a similar structure to how the python is layed out, with motors being set to a value between -100 and 100 to control their rotation speed.

- - - diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_112fbf1.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_112fbf1.pf_fragment new file mode 100644 index 0000000..3ac0eb8 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_112fbf1.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_199dadb.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_199dadb.pf_fragment new file mode 100644 index 0000000..2af5317 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_199dadb.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_28703a4.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_28703a4.pf_fragment new file mode 100644 index 0000000..a9e5336 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_28703a4.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_2bc6dda.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_2bc6dda.pf_fragment new file mode 100644 index 0000000..ccf9f43 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_2bc6dda.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_2d53d41.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_2d53d41.pf_fragment new file mode 100644 index 0000000..eefd4f1 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_2d53d41.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3018682.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3018682.pf_fragment new file mode 100644 index 0000000..4ae7ec6 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3018682.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3130402.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3130402.pf_fragment new file mode 100644 index 0000000..7648e32 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3130402.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_33322bb.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_33322bb.pf_fragment new file mode 100644 index 0000000..b1b7324 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_33322bb.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3a21353.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3a21353.pf_fragment new file mode 100644 index 0000000..e17e9cd Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_3a21353.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4684528.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4684528.pf_fragment new file mode 100644 index 0000000..717989a Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4684528.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4694656.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4694656.pf_fragment new file mode 100644 index 0000000..4ae6a88 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4694656.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4f90252.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4f90252.pf_fragment new file mode 100644 index 0000000..a365358 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_4f90252.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_5032ff1.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_5032ff1.pf_fragment new file mode 100644 index 0000000..b482393 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_5032ff1.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_552470a.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_552470a.pf_fragment new file mode 100644 index 0000000..bec46d3 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_552470a.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_61fb5f0.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_61fb5f0.pf_fragment new file mode 100644 index 0000000..fc6ea50 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_61fb5f0.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_64336a7.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_64336a7.pf_fragment new file mode 100644 index 0000000..c71a7d6 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_64336a7.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_68f968f.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_68f968f.pf_fragment new file mode 100644 index 0000000..55d2ee1 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_68f968f.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_6e5f2bf.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_6e5f2bf.pf_fragment new file mode 100644 index 0000000..1cca81b Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_6e5f2bf.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_866153d.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_866153d.pf_fragment new file mode 100644 index 0000000..6ba77f5 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_866153d.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_8df5496.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_8df5496.pf_fragment new file mode 100644 index 0000000..7c962ff Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_8df5496.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_902b335.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_902b335.pf_fragment new file mode 100644 index 0000000..99b47e6 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_902b335.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_915484c.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_915484c.pf_fragment new file mode 100644 index 0000000..b33eea3 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_915484c.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_a393a98.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_a393a98.pf_fragment new file mode 100644 index 0000000..dd6e1db Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_a393a98.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_b11216e.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_b11216e.pf_fragment new file mode 100644 index 0000000..040fc06 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_b11216e.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_b3b1eca.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_b3b1eca.pf_fragment new file mode 100644 index 0000000..3c0099f Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_b3b1eca.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_d8258c7.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_d8258c7.pf_fragment new file mode 100644 index 0000000..f6d4bf9 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_d8258c7.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_d99e6a5.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_d99e6a5.pf_fragment new file mode 100644 index 0000000..1756d65 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_d99e6a5.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ddb7d18.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ddb7d18.pf_fragment new file mode 100644 index 0000000..baca4e7 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ddb7d18.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ddd21a2.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ddd21a2.pf_fragment new file mode 100644 index 0000000..c74c9c1 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ddd21a2.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ecb4766.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ecb4766.pf_fragment new file mode 100644 index 0000000..70fb173 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ecb4766.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ee1e1d4.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ee1e1d4.pf_fragment new file mode 100644 index 0000000..07402ef Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ee1e1d4.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ee2f2bc.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ee2f2bc.pf_fragment new file mode 100644 index 0000000..5481a69 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ee2f2bc.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ff3abfb.pf_fragment b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ff3abfb.pf_fragment new file mode 100644 index 0000000..35127e4 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/fragment/en_ff3abfb.pf_fragment differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/index/en_9ebb691.pf_index b/shepherd/blueprints/staticroutes/docs/pagefind/index/en_9ebb691.pf_index new file mode 100644 index 0000000..3b18a1e Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/index/en_9ebb691.pf_index differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/index/en_d42ffd0.pf_index b/shepherd/blueprints/staticroutes/docs/pagefind/index/en_d42ffd0.pf_index new file mode 100644 index 0000000..7c9478f Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/index/en_d42ffd0.pf_index differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-entry.json b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-entry.json new file mode 100644 index 0000000..1e38b51 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-entry.json @@ -0,0 +1 @@ +{"version":"1.2.0","languages":{"en":{"hash":"en_33af6f82b4","wasm":"en","page_count":33}}} \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-highlight.js b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-highlight.js new file mode 100644 index 0000000..c823fbf --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-highlight.js @@ -0,0 +1,1069 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJS = (cb, mod) => function __require() { + return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); + +// node_modules/mark.js/dist/mark.js +var require_mark = __commonJS({ + "node_modules/mark.js/dist/mark.js"(exports, module) { + (function(global, factory) { + typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.Mark = factory(); + })(exports, function() { + "use strict"; + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) { + return typeof obj; + } : function(obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + var classCallCheck = function(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + var createClass = function() { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + return function(Constructor, protoProps, staticProps) { + if (protoProps) + defineProperties(Constructor.prototype, protoProps); + if (staticProps) + defineProperties(Constructor, staticProps); + return Constructor; + }; + }(); + var _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + var DOMIterator = function() { + function DOMIterator2(ctx) { + var iframes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true; + var exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : []; + var iframesTimeout = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : 5e3; + classCallCheck(this, DOMIterator2); + this.ctx = ctx; + this.iframes = iframes; + this.exclude = exclude; + this.iframesTimeout = iframesTimeout; + } + createClass(DOMIterator2, [{ + key: "getContexts", + value: function getContexts() { + var ctx = void 0, filteredCtx = []; + if (typeof this.ctx === "undefined" || !this.ctx) { + ctx = []; + } else if (NodeList.prototype.isPrototypeOf(this.ctx)) { + ctx = Array.prototype.slice.call(this.ctx); + } else if (Array.isArray(this.ctx)) { + ctx = this.ctx; + } else if (typeof this.ctx === "string") { + ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx)); + } else { + ctx = [this.ctx]; + } + ctx.forEach(function(ctx2) { + var isDescendant = filteredCtx.filter(function(contexts) { + return contexts.contains(ctx2); + }).length > 0; + if (filteredCtx.indexOf(ctx2) === -1 && !isDescendant) { + filteredCtx.push(ctx2); + } + }); + return filteredCtx; + } + }, { + key: "getIframeContents", + value: function getIframeContents(ifr, successFn) { + var errorFn = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : function() { + }; + var doc = void 0; + try { + var ifrWin = ifr.contentWindow; + doc = ifrWin.document; + if (!ifrWin || !doc) { + throw new Error("iframe inaccessible"); + } + } catch (e) { + errorFn(); + } + if (doc) { + successFn(doc); + } + } + }, { + key: "isIframeBlank", + value: function isIframeBlank(ifr) { + var bl = "about:blank", src = ifr.getAttribute("src").trim(), href = ifr.contentWindow.location.href; + return href === bl && src !== bl && src; + } + }, { + key: "observeIframeLoad", + value: function observeIframeLoad(ifr, successFn, errorFn) { + var _this = this; + var called = false, tout = null; + var listener = function listener2() { + if (called) { + return; + } + called = true; + clearTimeout(tout); + try { + if (!_this.isIframeBlank(ifr)) { + ifr.removeEventListener("load", listener2); + _this.getIframeContents(ifr, successFn, errorFn); + } + } catch (e) { + errorFn(); + } + }; + ifr.addEventListener("load", listener); + tout = setTimeout(listener, this.iframesTimeout); + } + }, { + key: "onIframeReady", + value: function onIframeReady(ifr, successFn, errorFn) { + try { + if (ifr.contentWindow.document.readyState === "complete") { + if (this.isIframeBlank(ifr)) { + this.observeIframeLoad(ifr, successFn, errorFn); + } else { + this.getIframeContents(ifr, successFn, errorFn); + } + } else { + this.observeIframeLoad(ifr, successFn, errorFn); + } + } catch (e) { + errorFn(); + } + } + }, { + key: "waitForIframes", + value: function waitForIframes(ctx, done) { + var _this2 = this; + var eachCalled = 0; + this.forEachIframe(ctx, function() { + return true; + }, function(ifr) { + eachCalled++; + _this2.waitForIframes(ifr.querySelector("html"), function() { + if (!--eachCalled) { + done(); + } + }); + }, function(handled) { + if (!handled) { + done(); + } + }); + } + }, { + key: "forEachIframe", + value: function forEachIframe(ctx, filter, each) { + var _this3 = this; + var end = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { + }; + var ifr = ctx.querySelectorAll("iframe"), open = ifr.length, handled = 0; + ifr = Array.prototype.slice.call(ifr); + var checkEnd = function checkEnd2() { + if (--open <= 0) { + end(handled); + } + }; + if (!open) { + checkEnd(); + } + ifr.forEach(function(ifr2) { + if (DOMIterator2.matches(ifr2, _this3.exclude)) { + checkEnd(); + } else { + _this3.onIframeReady(ifr2, function(con) { + if (filter(ifr2)) { + handled++; + each(con); + } + checkEnd(); + }, checkEnd); + } + }); + } + }, { + key: "createIterator", + value: function createIterator(ctx, whatToShow, filter) { + return document.createNodeIterator(ctx, whatToShow, filter, false); + } + }, { + key: "createInstanceOnIframe", + value: function createInstanceOnIframe(contents) { + return new DOMIterator2(contents.querySelector("html"), this.iframes); + } + }, { + key: "compareNodeIframe", + value: function compareNodeIframe(node, prevNode, ifr) { + var compCurr = node.compareDocumentPosition(ifr), prev = Node.DOCUMENT_POSITION_PRECEDING; + if (compCurr & prev) { + if (prevNode !== null) { + var compPrev = prevNode.compareDocumentPosition(ifr), after = Node.DOCUMENT_POSITION_FOLLOWING; + if (compPrev & after) { + return true; + } + } else { + return true; + } + } + return false; + } + }, { + key: "getIteratorNode", + value: function getIteratorNode(itr) { + var prevNode = itr.previousNode(); + var node = void 0; + if (prevNode === null) { + node = itr.nextNode(); + } else { + node = itr.nextNode() && itr.nextNode(); + } + return { + prevNode, + node + }; + } + }, { + key: "checkIframeFilter", + value: function checkIframeFilter(node, prevNode, currIfr, ifr) { + var key = false, handled = false; + ifr.forEach(function(ifrDict, i) { + if (ifrDict.val === currIfr) { + key = i; + handled = ifrDict.handled; + } + }); + if (this.compareNodeIframe(node, prevNode, currIfr)) { + if (key === false && !handled) { + ifr.push({ + val: currIfr, + handled: true + }); + } else if (key !== false && !handled) { + ifr[key].handled = true; + } + return true; + } + if (key === false) { + ifr.push({ + val: currIfr, + handled: false + }); + } + return false; + } + }, { + key: "handleOpenIframes", + value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) { + var _this4 = this; + ifr.forEach(function(ifrDict) { + if (!ifrDict.handled) { + _this4.getIframeContents(ifrDict.val, function(con) { + _this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb); + }); + } + }); + } + }, { + key: "iterateThroughNodes", + value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) { + var _this5 = this; + var itr = this.createIterator(ctx, whatToShow, filterCb); + var ifr = [], elements = [], node = void 0, prevNode = void 0, retrieveNodes = function retrieveNodes2() { + var _getIteratorNode = _this5.getIteratorNode(itr); + prevNode = _getIteratorNode.prevNode; + node = _getIteratorNode.node; + return node; + }; + while (retrieveNodes()) { + if (this.iframes) { + this.forEachIframe(ctx, function(currIfr) { + return _this5.checkIframeFilter(node, prevNode, currIfr, ifr); + }, function(con) { + _this5.createInstanceOnIframe(con).forEachNode(whatToShow, function(ifrNode) { + return elements.push(ifrNode); + }, filterCb); + }); + } + elements.push(node); + } + elements.forEach(function(node2) { + eachCb(node2); + }); + if (this.iframes) { + this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb); + } + doneCb(); + } + }, { + key: "forEachNode", + value: function forEachNode(whatToShow, each, filter) { + var _this6 = this; + var done = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : function() { + }; + var contexts = this.getContexts(); + var open = contexts.length; + if (!open) { + done(); + } + contexts.forEach(function(ctx) { + var ready = function ready2() { + _this6.iterateThroughNodes(whatToShow, ctx, each, filter, function() { + if (--open <= 0) { + done(); + } + }); + }; + if (_this6.iframes) { + _this6.waitForIframes(ctx, ready); + } else { + ready(); + } + }); + } + }], [{ + key: "matches", + value: function matches(element, selector) { + var selectors = typeof selector === "string" ? [selector] : selector, fn = element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector; + if (fn) { + var match = false; + selectors.every(function(sel) { + if (fn.call(element, sel)) { + match = true; + return false; + } + return true; + }); + return match; + } else { + return false; + } + } + }]); + return DOMIterator2; + }(); + var Mark$1 = function() { + function Mark3(ctx) { + classCallCheck(this, Mark3); + this.ctx = ctx; + this.ie = false; + var ua = window.navigator.userAgent; + if (ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1) { + this.ie = true; + } + } + createClass(Mark3, [{ + key: "log", + value: function log(msg) { + var level = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "debug"; + var log2 = this.opt.log; + if (!this.opt.debug) { + return; + } + if ((typeof log2 === "undefined" ? "undefined" : _typeof(log2)) === "object" && typeof log2[level] === "function") { + log2[level]("mark.js: " + msg); + } + } + }, { + key: "escapeStr", + value: function escapeStr(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + } + }, { + key: "createRegExp", + value: function createRegExp(str) { + if (this.opt.wildcards !== "disabled") { + str = this.setupWildcardsRegExp(str); + } + str = this.escapeStr(str); + if (Object.keys(this.opt.synonyms).length) { + str = this.createSynonymsRegExp(str); + } + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.setupIgnoreJoinersRegExp(str); + } + if (this.opt.diacritics) { + str = this.createDiacriticsRegExp(str); + } + str = this.createMergedBlanksRegExp(str); + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.createJoinersRegExp(str); + } + if (this.opt.wildcards !== "disabled") { + str = this.createWildcardsRegExp(str); + } + str = this.createAccuracyRegExp(str); + return str; + } + }, { + key: "createSynonymsRegExp", + value: function createSynonymsRegExp(str) { + var syn = this.opt.synonyms, sens = this.opt.caseSensitive ? "" : "i", joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? "\0" : ""; + for (var index in syn) { + if (syn.hasOwnProperty(index)) { + var value = syn[index], k1 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(index) : this.escapeStr(index), k2 = this.opt.wildcards !== "disabled" ? this.setupWildcardsRegExp(value) : this.escapeStr(value); + if (k1 !== "" && k2 !== "") { + str = str.replace(new RegExp("(" + this.escapeStr(k1) + "|" + this.escapeStr(k2) + ")", "gm" + sens), joinerPlaceholder + ("(" + this.processSynomyms(k1) + "|") + (this.processSynomyms(k2) + ")") + joinerPlaceholder); + } + } + } + return str; + } + }, { + key: "processSynomyms", + value: function processSynomyms(str) { + if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { + str = this.setupIgnoreJoinersRegExp(str); + } + return str; + } + }, { + key: "setupWildcardsRegExp", + value: function setupWildcardsRegExp(str) { + str = str.replace(/(?:\\)*\?/g, function(val) { + return val.charAt(0) === "\\" ? "?" : ""; + }); + return str.replace(/(?:\\)*\*/g, function(val) { + return val.charAt(0) === "\\" ? "*" : ""; + }); + } + }, { + key: "createWildcardsRegExp", + value: function createWildcardsRegExp(str) { + var spaces = this.opt.wildcards === "withSpaces"; + return str.replace(/\u0001/g, spaces ? "[\\S\\s]?" : "\\S?").replace(/\u0002/g, spaces ? "[\\S\\s]*?" : "\\S*"); + } + }, { + key: "setupIgnoreJoinersRegExp", + value: function setupIgnoreJoinersRegExp(str) { + return str.replace(/[^(|)\\]/g, function(val, indx, original) { + var nextChar = original.charAt(indx + 1); + if (/[(|)\\]/.test(nextChar) || nextChar === "") { + return val; + } else { + return val + "\0"; + } + }); + } + }, { + key: "createJoinersRegExp", + value: function createJoinersRegExp(str) { + var joiner = []; + var ignorePunctuation = this.opt.ignorePunctuation; + if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) { + joiner.push(this.escapeStr(ignorePunctuation.join(""))); + } + if (this.opt.ignoreJoiners) { + joiner.push("\\u00ad\\u200b\\u200c\\u200d"); + } + return joiner.length ? str.split(/\u0000+/).join("[" + joiner.join("") + "]*") : str; + } + }, { + key: "createDiacriticsRegExp", + value: function createDiacriticsRegExp(str) { + var sens = this.opt.caseSensitive ? "" : "i", dct = this.opt.caseSensitive ? ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105", "A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010D", "C\xC7\u0106\u010C", "d\u0111\u010F", "D\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119", "E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012B", "I\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142", "L\u0141", "n\xF1\u0148\u0144", "N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014D", "O\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159", "R\u0158", "s\u0161\u015B\u0219\u015F", "S\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163", "T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016B", "U\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFF", "Y\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017A", "Z\u017D\u017B\u0179"] : ["a\xE0\xE1\u1EA3\xE3\u1EA1\u0103\u1EB1\u1EAF\u1EB3\u1EB5\u1EB7\xE2\u1EA7\u1EA5\u1EA9\u1EAB\u1EAD\xE4\xE5\u0101\u0105A\xC0\xC1\u1EA2\xC3\u1EA0\u0102\u1EB0\u1EAE\u1EB2\u1EB4\u1EB6\xC2\u1EA6\u1EA4\u1EA8\u1EAA\u1EAC\xC4\xC5\u0100\u0104", "c\xE7\u0107\u010DC\xC7\u0106\u010C", "d\u0111\u010FD\u0110\u010E", "e\xE8\xE9\u1EBB\u1EBD\u1EB9\xEA\u1EC1\u1EBF\u1EC3\u1EC5\u1EC7\xEB\u011B\u0113\u0119E\xC8\xC9\u1EBA\u1EBC\u1EB8\xCA\u1EC0\u1EBE\u1EC2\u1EC4\u1EC6\xCB\u011A\u0112\u0118", "i\xEC\xED\u1EC9\u0129\u1ECB\xEE\xEF\u012BI\xCC\xCD\u1EC8\u0128\u1ECA\xCE\xCF\u012A", "l\u0142L\u0141", "n\xF1\u0148\u0144N\xD1\u0147\u0143", "o\xF2\xF3\u1ECF\xF5\u1ECD\xF4\u1ED3\u1ED1\u1ED5\u1ED7\u1ED9\u01A1\u1EDF\u1EE1\u1EDB\u1EDD\u1EE3\xF6\xF8\u014DO\xD2\xD3\u1ECE\xD5\u1ECC\xD4\u1ED2\u1ED0\u1ED4\u1ED6\u1ED8\u01A0\u1EDE\u1EE0\u1EDA\u1EDC\u1EE2\xD6\xD8\u014C", "r\u0159R\u0158", "s\u0161\u015B\u0219\u015FS\u0160\u015A\u0218\u015E", "t\u0165\u021B\u0163T\u0164\u021A\u0162", "u\xF9\xFA\u1EE7\u0169\u1EE5\u01B0\u1EEB\u1EE9\u1EED\u1EEF\u1EF1\xFB\xFC\u016F\u016BU\xD9\xDA\u1EE6\u0168\u1EE4\u01AF\u1EEA\u1EE8\u1EEC\u1EEE\u1EF0\xDB\xDC\u016E\u016A", "y\xFD\u1EF3\u1EF7\u1EF9\u1EF5\xFFY\xDD\u1EF2\u1EF6\u1EF8\u1EF4\u0178", "z\u017E\u017C\u017AZ\u017D\u017B\u0179"]; + var handled = []; + str.split("").forEach(function(ch) { + dct.every(function(dct2) { + if (dct2.indexOf(ch) !== -1) { + if (handled.indexOf(dct2) > -1) { + return false; + } + str = str.replace(new RegExp("[" + dct2 + "]", "gm" + sens), "[" + dct2 + "]"); + handled.push(dct2); + } + return true; + }); + }); + return str; + } + }, { + key: "createMergedBlanksRegExp", + value: function createMergedBlanksRegExp(str) { + return str.replace(/[\s]+/gmi, "[\\s]+"); + } + }, { + key: "createAccuracyRegExp", + value: function createAccuracyRegExp(str) { + var _this = this; + var chars = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\xA1\xBF"; + var acc = this.opt.accuracy, val = typeof acc === "string" ? acc : acc.value, ls = typeof acc === "string" ? [] : acc.limiters, lsJoin = ""; + ls.forEach(function(limiter) { + lsJoin += "|" + _this.escapeStr(limiter); + }); + switch (val) { + case "partially": + default: + return "()(" + str + ")"; + case "complementary": + lsJoin = "\\s" + (lsJoin ? lsJoin : this.escapeStr(chars)); + return "()([^" + lsJoin + "]*" + str + "[^" + lsJoin + "]*)"; + case "exactly": + return "(^|\\s" + lsJoin + ")(" + str + ")(?=$|\\s" + lsJoin + ")"; + } + } + }, { + key: "getSeparatedKeywords", + value: function getSeparatedKeywords(sv) { + var _this2 = this; + var stack = []; + sv.forEach(function(kw) { + if (!_this2.opt.separateWordSearch) { + if (kw.trim() && stack.indexOf(kw) === -1) { + stack.push(kw); + } + } else { + kw.split(" ").forEach(function(kwSplitted) { + if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) { + stack.push(kwSplitted); + } + }); + } + }); + return { + "keywords": stack.sort(function(a, b) { + return b.length - a.length; + }), + "length": stack.length + }; + } + }, { + key: "isNumeric", + value: function isNumeric(value) { + return Number(parseFloat(value)) == value; + } + }, { + key: "checkRanges", + value: function checkRanges(array) { + var _this3 = this; + if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== "[object Object]") { + this.log("markRanges() will only accept an array of objects"); + this.opt.noMatch(array); + return []; + } + var stack = []; + var last = 0; + array.sort(function(a, b) { + return a.start - b.start; + }).forEach(function(item) { + var _callNoMatchOnInvalid = _this3.callNoMatchOnInvalidRanges(item, last), start = _callNoMatchOnInvalid.start, end = _callNoMatchOnInvalid.end, valid = _callNoMatchOnInvalid.valid; + if (valid) { + item.start = start; + item.length = end - start; + stack.push(item); + last = end; + } + }); + return stack; + } + }, { + key: "callNoMatchOnInvalidRanges", + value: function callNoMatchOnInvalidRanges(range, last) { + var start = void 0, end = void 0, valid = false; + if (range && typeof range.start !== "undefined") { + start = parseInt(range.start, 10); + end = start + parseInt(range.length, 10); + if (this.isNumeric(range.start) && this.isNumeric(range.length) && end - last > 0 && end - start > 0) { + valid = true; + } else { + this.log("Ignoring invalid or overlapping range: " + ("" + JSON.stringify(range))); + this.opt.noMatch(range); + } + } else { + this.log("Ignoring invalid range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } + return { + start, + end, + valid + }; + } + }, { + key: "checkWhitespaceRanges", + value: function checkWhitespaceRanges(range, originalLength, string) { + var end = void 0, valid = true, max = string.length, offset = originalLength - max, start = parseInt(range.start, 10) - offset; + start = start > max ? max : start; + end = start + parseInt(range.length, 10); + if (end > max) { + end = max; + this.log("End range automatically set to the max value of " + max); + } + if (start < 0 || end - start < 0 || start > max || end > max) { + valid = false; + this.log("Invalid range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } else if (string.substring(start, end).replace(/\s+/g, "") === "") { + valid = false; + this.log("Skipping whitespace only range: " + JSON.stringify(range)); + this.opt.noMatch(range); + } + return { + start, + end, + valid + }; + } + }, { + key: "getTextNodes", + value: function getTextNodes(cb) { + var _this4 = this; + var val = "", nodes = []; + this.iterator.forEachNode(NodeFilter.SHOW_TEXT, function(node) { + nodes.push({ + start: val.length, + end: (val += node.textContent).length, + node + }); + }, function(node) { + if (_this4.matchesExclude(node.parentNode)) { + return NodeFilter.FILTER_REJECT; + } else { + return NodeFilter.FILTER_ACCEPT; + } + }, function() { + cb({ + value: val, + nodes + }); + }); + } + }, { + key: "matchesExclude", + value: function matchesExclude(el) { + return DOMIterator.matches(el, this.opt.exclude.concat(["script", "style", "title", "head", "html"])); + } + }, { + key: "wrapRangeInTextNode", + value: function wrapRangeInTextNode(node, start, end) { + var hEl = !this.opt.element ? "mark" : this.opt.element, startNode = node.splitText(start), ret = startNode.splitText(end - start); + var repl = document.createElement(hEl); + repl.setAttribute("data-markjs", "true"); + if (this.opt.className) { + repl.setAttribute("class", this.opt.className); + } + repl.textContent = startNode.textContent; + startNode.parentNode.replaceChild(repl, startNode); + return ret; + } + }, { + key: "wrapRangeInMappedTextNode", + value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) { + var _this5 = this; + dict.nodes.every(function(n, i) { + var sibl = dict.nodes[i + 1]; + if (typeof sibl === "undefined" || sibl.start > start) { + if (!filterCb(n.node)) { + return false; + } + var s = start - n.start, e = (end > n.end ? n.end : end) - n.start, startStr = dict.value.substr(0, n.start), endStr = dict.value.substr(e + n.start); + n.node = _this5.wrapRangeInTextNode(n.node, s, e); + dict.value = startStr + endStr; + dict.nodes.forEach(function(k, j) { + if (j >= i) { + if (dict.nodes[j].start > 0 && j !== i) { + dict.nodes[j].start -= e; + } + dict.nodes[j].end -= e; + } + }); + end -= e; + eachCb(n.node.previousSibling, n.start); + if (end > n.end) { + start = n.end; + } else { + return false; + } + } + return true; + }); + } + }, { + key: "wrapMatches", + value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) { + var _this6 = this; + var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; + this.getTextNodes(function(dict) { + dict.nodes.forEach(function(node) { + node = node.node; + var match = void 0; + while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== "") { + if (!filterCb(match[matchIdx], node)) { + continue; + } + var pos = match.index; + if (matchIdx !== 0) { + for (var i = 1; i < matchIdx; i++) { + pos += match[i].length; + } + } + node = _this6.wrapRangeInTextNode(node, pos, pos + match[matchIdx].length); + eachCb(node.previousSibling); + regex.lastIndex = 0; + } + }); + endCb(); + }); + } + }, { + key: "wrapMatchesAcrossElements", + value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) { + var _this7 = this; + var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; + this.getTextNodes(function(dict) { + var match = void 0; + while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== "") { + var start = match.index; + if (matchIdx !== 0) { + for (var i = 1; i < matchIdx; i++) { + start += match[i].length; + } + } + var end = start + match[matchIdx].length; + _this7.wrapRangeInMappedTextNode(dict, start, end, function(node) { + return filterCb(match[matchIdx], node); + }, function(node, lastIndex) { + regex.lastIndex = lastIndex; + eachCb(node); + }); + } + endCb(); + }); + } + }, { + key: "wrapRangeFromIndex", + value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) { + var _this8 = this; + this.getTextNodes(function(dict) { + var originalLength = dict.value.length; + ranges.forEach(function(range, counter) { + var _checkWhitespaceRange = _this8.checkWhitespaceRanges(range, originalLength, dict.value), start = _checkWhitespaceRange.start, end = _checkWhitespaceRange.end, valid = _checkWhitespaceRange.valid; + if (valid) { + _this8.wrapRangeInMappedTextNode(dict, start, end, function(node) { + return filterCb(node, range, dict.value.substring(start, end), counter); + }, function(node) { + eachCb(node, range); + }); + } + }); + endCb(); + }); + } + }, { + key: "unwrapMatches", + value: function unwrapMatches(node) { + var parent = node.parentNode; + var docFrag = document.createDocumentFragment(); + while (node.firstChild) { + docFrag.appendChild(node.removeChild(node.firstChild)); + } + parent.replaceChild(docFrag, node); + if (!this.ie) { + parent.normalize(); + } else { + this.normalizeTextNode(parent); + } + } + }, { + key: "normalizeTextNode", + value: function normalizeTextNode(node) { + if (!node) { + return; + } + if (node.nodeType === 3) { + while (node.nextSibling && node.nextSibling.nodeType === 3) { + node.nodeValue += node.nextSibling.nodeValue; + node.parentNode.removeChild(node.nextSibling); + } + } else { + this.normalizeTextNode(node.firstChild); + } + this.normalizeTextNode(node.nextSibling); + } + }, { + key: "markRegExp", + value: function markRegExp(regexp, opt) { + var _this9 = this; + this.opt = opt; + this.log('Searching with expression "' + regexp + '"'); + var totalMatches = 0, fn = "wrapMatches"; + var eachCb = function eachCb2(element) { + totalMatches++; + _this9.opt.each(element); + }; + if (this.opt.acrossElements) { + fn = "wrapMatchesAcrossElements"; + } + this[fn](regexp, this.opt.ignoreGroups, function(match, node) { + return _this9.opt.filter(node, match, totalMatches); + }, eachCb, function() { + if (totalMatches === 0) { + _this9.opt.noMatch(regexp); + } + _this9.opt.done(totalMatches); + }); + } + }, { + key: "mark", + value: function mark(sv, opt) { + var _this10 = this; + this.opt = opt; + var totalMatches = 0, fn = "wrapMatches"; + var _getSeparatedKeywords = this.getSeparatedKeywords(typeof sv === "string" ? [sv] : sv), kwArr = _getSeparatedKeywords.keywords, kwArrLen = _getSeparatedKeywords.length, sens = this.opt.caseSensitive ? "" : "i", handler = function handler2(kw) { + var regex = new RegExp(_this10.createRegExp(kw), "gm" + sens), matches = 0; + _this10.log('Searching with expression "' + regex + '"'); + _this10[fn](regex, 1, function(term, node) { + return _this10.opt.filter(node, kw, totalMatches, matches); + }, function(element) { + matches++; + totalMatches++; + _this10.opt.each(element); + }, function() { + if (matches === 0) { + _this10.opt.noMatch(kw); + } + if (kwArr[kwArrLen - 1] === kw) { + _this10.opt.done(totalMatches); + } else { + handler2(kwArr[kwArr.indexOf(kw) + 1]); + } + }); + }; + if (this.opt.acrossElements) { + fn = "wrapMatchesAcrossElements"; + } + if (kwArrLen === 0) { + this.opt.done(totalMatches); + } else { + handler(kwArr[0]); + } + } + }, { + key: "markRanges", + value: function markRanges(rawRanges, opt) { + var _this11 = this; + this.opt = opt; + var totalMatches = 0, ranges = this.checkRanges(rawRanges); + if (ranges && ranges.length) { + this.log("Starting to mark with the following ranges: " + JSON.stringify(ranges)); + this.wrapRangeFromIndex(ranges, function(node, range, match, counter) { + return _this11.opt.filter(node, range, match, counter); + }, function(element, range) { + totalMatches++; + _this11.opt.each(element, range); + }, function() { + _this11.opt.done(totalMatches); + }); + } else { + this.opt.done(totalMatches); + } + } + }, { + key: "unmark", + value: function unmark(opt) { + var _this12 = this; + this.opt = opt; + var sel = this.opt.element ? this.opt.element : "*"; + sel += "[data-markjs]"; + if (this.opt.className) { + sel += "." + this.opt.className; + } + this.log('Removal selector "' + sel + '"'); + this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT, function(node) { + _this12.unwrapMatches(node); + }, function(node) { + var matchesSel = DOMIterator.matches(node, sel), matchesExclude = _this12.matchesExclude(node); + if (!matchesSel || matchesExclude) { + return NodeFilter.FILTER_REJECT; + } else { + return NodeFilter.FILTER_ACCEPT; + } + }, this.opt.done); + } + }, { + key: "opt", + set: function set$$1(val) { + this._opt = _extends({}, { + "element": "", + "className": "", + "exclude": [], + "iframes": false, + "iframesTimeout": 5e3, + "separateWordSearch": true, + "diacritics": true, + "synonyms": {}, + "accuracy": "partially", + "acrossElements": false, + "caseSensitive": false, + "ignoreJoiners": false, + "ignoreGroups": 0, + "ignorePunctuation": [], + "wildcards": "disabled", + "each": function each() { + }, + "noMatch": function noMatch() { + }, + "filter": function filter() { + return true; + }, + "done": function done() { + }, + "debug": false, + "log": window.console + }, val); + }, + get: function get$$1() { + return this._opt; + } + }, { + key: "iterator", + get: function get$$1() { + return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout); + } + }]); + return Mark3; + }(); + function Mark2(ctx) { + var _this = this; + var instance = new Mark$1(ctx); + this.mark = function(sv, opt) { + instance.mark(sv, opt); + return _this; + }; + this.markRegExp = function(sv, opt) { + instance.markRegExp(sv, opt); + return _this; + }; + this.markRanges = function(sv, opt) { + instance.markRanges(sv, opt); + return _this; + }; + this.unmark = function(opt) { + instance.unmark(opt); + return _this; + }; + return this; + } + return Mark2; + }); + } +}); + +// lib/highlight.ts +var import_mark = __toESM(require_mark(), 1); +var PagefindHighlight = class { + constructor(options = { + markContext: null, + highlightParam: "pagefind-highlight", + markOptions: { + className: "pagefind-highlight", + exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] + }, + addStyles: true + }) { + var _a, _b; + const { highlightParam, markContext, markOptions, addStyles } = options; + this.highlightParam = highlightParam ?? "pagefind-highlight"; + this.addStyles = addStyles ?? true; + this.markContext = markContext !== void 0 ? markContext : null; + this.markOptions = markOptions !== void 0 ? markOptions : { + className: "pagefind-highlight", + exclude: ["[data-pagefind-ignore]", "[data-pagefind-ignore] *"] + }; + (_a = this.markOptions).className ?? (_a.className = "pagefind__highlight"); + (_b = this.markOptions).exclude ?? (_b.exclude = [ + "[data-pagefind-ignore]", + "[data-pagefind-ignore] *" + ]); + this.markOptions.separateWordSearch = false; + this.highlight(); + } + getHighlightParams(paramName) { + const urlParams = new URLSearchParams(window.location.search); + return urlParams.getAll(paramName); + } + // Inline styles might be too hard to override + addHighlightStyles(className) { + if (!className) + return; + const styleElement = document.createElement("style"); + styleElement.innerText = `:where(.${className}) { background-color: yellow; color: black; }`; + document.head.appendChild(styleElement); + } + createMarkInstance() { + if (this.markContext) { + return new import_mark.default(this.markContext); + } + const pagefindBody = document.querySelectorAll("[data-pagefind-body]"); + if (pagefindBody.length !== 0) { + return new import_mark.default(pagefindBody); + } else { + return new import_mark.default(document.body); + } + } + markText(instance, text) { + instance.mark(text, this.markOptions); + } + highlight() { + const params = this.getHighlightParams(this.highlightParam); + if (!params || params.length === 0) + return; + this.addStyles && this.addHighlightStyles(this.markOptions.className); + const markInstance = this.createMarkInstance(); + this.markText(markInstance, params); + } +}; +window.PagefindHighlight = PagefindHighlight; +export { + PagefindHighlight as default +}; +/*! Bundled license information: + +mark.js/dist/mark.js: + (*!*************************************************** + * mark.js v8.11.1 + * https://markjs.io/ + * Copyright (c) 2014–2018, Julian Kühnel + * Released under the MIT license https://git.io/vwTVl + *****************************************************) +*/ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-modular-ui.css b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-modular-ui.css new file mode 100644 index 0000000..9c6793e --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-modular-ui.css @@ -0,0 +1,214 @@ +:root { + --pagefind-ui-scale: 0.8; + --pagefind-ui-primary: #034AD8; + --pagefind-ui-fade: #707070; + --pagefind-ui-text: #393939; + --pagefind-ui-background: #ffffff; + --pagefind-ui-border: #eeeeee; + --pagefind-ui-tag: #eeeeee; + --pagefind-ui-border-width: 2px; + --pagefind-ui-border-radius: 8px; + --pagefind-ui-image-border-radius: 8px; + --pagefind-ui-image-box-ratio: 3 / 2; + --pagefind-ui-font: system, -apple-system, ".SFNSText-Regular", + "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", + "Lucida Grande", sans-serif; +} + +[data-pfmod-hidden] { + display: none !important; +} + +[data-pfmod-suppressed] { + opacity: 0 !important; + pointer-events: none !important; +} + +[data-pfmod-sr-hidden] { + -webkit-clip: rect(0 0 0 0) !important; + clip: rect(0 0 0 0) !important; + -webkit-clip-path: inset(100%) !important; + clip-path: inset(100%) !important; + height: 1px !important; + overflow: hidden !important; + overflow: clip !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important; +} + +[data-pfmod-loading] { + color: var(--pagefind-ui-text); + background-color: var(--pagefind-ui-text); + border-radius: var(--pagefind-ui-border-radius); + opacity: 0.1; + pointer-events: none; +} + +/* Input */ + +.pagefind-modular-input-wrapper { + position: relative; +} + +.pagefind-modular-input-wrapper::before { + background-color: var(--pagefind-ui-text); + width: calc(18px * var(--pagefind-ui-scale)); + height: calc(18px * var(--pagefind-ui-scale)); + top: calc(23px * var(--pagefind-ui-scale)); + left: calc(20px * var(--pagefind-ui-scale)); + content: ""; + position: absolute; + display: block; + opacity: 0.7; + -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); + mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A"); + -webkit-mask-size: 100%; + mask-size: 100%; + z-index: 9; + pointer-events: none; +} + +.pagefind-modular-input { + height: calc(64px * var(--pagefind-ui-scale)); + padding: 0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale)); + background-color: var(--pagefind-ui-background); + border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); + border-radius: var(--pagefind-ui-border-radius); + font-size: calc(21px * var(--pagefind-ui-scale)); + position: relative; + appearance: none; + -webkit-appearance: none; + display: flex; + width: 100%; + box-sizing: border-box; + font-weight: 700; +} + +.pagefind-modular-input::placeholder { + opacity: 0.2; +} + +.pagefind-modular-input-clear { + position: absolute; + top: calc(2px * var(--pagefind-ui-scale)); + right: calc(2px * var(--pagefind-ui-scale)); + height: calc(60px * var(--pagefind-ui-scale)); + border-radius: var(--pagefind-ui-border-radius); + padding: 0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale)); + color: var(--pagefind-ui-text); + font-size: calc(14px * var(--pagefind-ui-scale)); + cursor: pointer; + background-color: var(--pagefind-ui-background); + border: none; + appearance: none; +} + +/* ResultList */ + +.pagefind-modular-list-result { + list-style-type: none; + display: flex; + align-items: flex-start; + gap: min(calc(40px * var(--pagefind-ui-scale)), 3%); + padding: calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale)); + border-top: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); +} + +.pagefind-modular-list-result:last-of-type { + border-bottom: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border); +} + +.pagefind-modular-list-thumb { + width: min(30%, + calc((30% - (100px * var(--pagefind-ui-scale))) * 100000)); + max-width: calc(120px * var(--pagefind-ui-scale)); + margin-top: calc(10px * var(--pagefind-ui-scale)); + aspect-ratio: var(--pagefind-ui-image-box-ratio); + position: relative; +} + +.pagefind-modular-list-image { + display: block; + position: absolute; + left: 50%; + transform: translateX(-50%); + font-size: 0; + width: auto; + height: auto; + max-width: 100%; + max-height: 100%; + border-radius: var(--pagefind-ui-image-border-radius); +} + +.pagefind-modular-list-inner { + flex: 1; + display: flex; + flex-direction: column; + align-items: flex-start; + margin-top: calc(10px * var(--pagefind-ui-scale)); +} + +.pagefind-modular-list-title { + display: inline-block; + font-weight: 700; + font-size: calc(21px * var(--pagefind-ui-scale)); + margin-top: 0; + margin-bottom: 0; +} + +.pagefind-modular-list-link { + color: var(--pagefind-ui-text); + text-decoration: none; +} + +.pagefind-modular-list-link:hover { + text-decoration: underline; +} + +.pagefind-modular-list-excerpt { + display: inline-block; + font-weight: 400; + font-size: calc(16px * var(--pagefind-ui-scale)); + margin-top: calc(4px * var(--pagefind-ui-scale)); + margin-bottom: 0; + min-width: calc(250px * var(--pagefind-ui-scale)); +} + +/* FilterPills */ + +.pagefind-modular-filter-pills-wrapper { + overflow-x: scroll; + padding: 15px 0; +} + +.pagefind-modular-filter-pills { + display: flex; + gap: 6px; +} + +.pagefind-modular-filter-pill { + display: flex; + justify-content: center; + align-items: center; + border: none; + appearance: none; + padding: 0 calc(24px * var(--pagefind-ui-scale)); + background-color: var(--pagefind-ui-background); + color: var(--pagefind-ui-fade); + border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border); + border-radius: calc(25px * var(--pagefind-ui-scale)); + font-size: calc(18px * var(--pagefind-ui-scale)); + height: calc(50px * var(--pagefind-ui-scale)); + cursor: pointer; + white-space: nowrap; +} + +.pagefind-modular-filter-pill:hover { + border-color: var(--pagefind-ui-primary); +} + +.pagefind-modular-filter-pill[aria-pressed="true"] { + border-color: var(--pagefind-ui-primary); + color: var(--pagefind-ui-primary); +} \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-modular-ui.js b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-modular-ui.js new file mode 100644 index 0000000..43f738f --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-modular-ui.js @@ -0,0 +1,8 @@ +(()=>{var b=Object.defineProperty;var w=(i,e)=>{for(var t in e)b(i,t,{get:e[t],enumerable:!0})};var f={};w(f,{FilterPills:()=>h,Input:()=>l,Instance:()=>p,ResultList:()=>a,Summary:()=>o});var r=class i{constructor(e){this.element=document.createElement(e)}id(e){return this.element.id=e,this}class(e){return this.element.classList.add(e),this}attrs(e){for(let[t,s]of Object.entries(e))this.element.setAttribute(t,s);return this}text(e){return this.element.innerText=e,this}html(e){return this.element.innerHTML=e,this}handle(e,t){return this.element.addEventListener(e,t),this}addTo(e){return e instanceof i?e.element.appendChild(this.element):e.appendChild(this.element),this.element}};var T=async(i=100)=>new Promise(e=>setTimeout(e,i)),l=class{constructor(e={}){if(this.inputEl=null,this.clearEl=null,this.instance=null,this.searchID=0,this.debounceTimeoutMs=e.debounceTimeoutMs??300,e.inputElement){if(e.containerElement){console.warn("[Pagefind Input component]: inputElement and containerElement both supplied. Ignoring the container option.");return}this.initExisting(e.inputElement)}else if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Input component]: No selector supplied for containerElement or inputElement");return}this.inputEl.addEventListener("input",async t=>{if(this.instance&&typeof t?.target?.value=="string"){this.updateState(t.target.value);let s=++this.searchID;if(await T(this.debounceTimeoutMs),s!==this.searchID)return null;this.instance?.triggerSearch(t.target.value)}}),this.inputEl.addEventListener("keydown",t=>{t.key==="Escape"&&(++this.searchID,this.inputEl.value="",this.instance?.triggerSearch(""),this.updateState("")),t.key==="Enter"&&t.preventDefault()}),this.inputEl.addEventListener("focus",()=>{this.instance?.triggerLoad()})}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No container found for ${e} selector`);return}if(t.tagName==="INPUT")console.warn(`[Pagefind Input component]: Encountered input element for ${e} when a container was expected`),console.warn("[Pagefind Input component]: Treating containerElement option as inputElement and proceeding"),this.initExisting(e);else{t.innerHTML="";let s=0;for(;document.querySelector(`#pfmod-input-${s}`);)s+=1;let n=new r("form").class("pagefind-modular-input-wrapper").attrs({role:"search","aria-label":"Search this site",action:"javascript:void(0);"});new r("label").attrs({for:`pfmod-input-${s}`,"data-pfmod-sr-hidden":"true"}).text("Search this site").addTo(n),this.inputEl=new r("input").id(`pfmod-input-${s}`).class("pagefind-modular-input").attrs({autocapitalize:"none",enterkeyhint:"search"}).addTo(n),this.clearEl=new r("button").class("pagefind-modular-input-clear").attrs({"data-pfmod-suppressed":"true"}).text("Clear").handle("click",()=>{this.inputEl.value="",this.instance.triggerSearch(""),this.updateState("")}).addTo(n),n.addTo(t)}}initExisting(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No input element found for ${e} selector`);return}if(t.tagName!=="INPUT"){console.error(`[Pagefind Input component]: Expected ${e} to be an element`);return}this.inputEl=t}updateState(e){this.clearEl&&(e&&e?.length?this.clearEl.removeAttribute("data-pfmod-suppressed"):this.clearEl.setAttribute("data-pfmod-suppressed","true"))}register(e){this.instance=e,this.instance.on("search",(t,s)=>{this.inputEl&&document.activeElement!==this.inputEl&&(this.inputEl.value=t,this.updateState(t))})}focus(){this.inputEl&&this.inputEl.focus()}};var g=i=>{if(i instanceof Element)return[i];if(Array.isArray(i)&&i.every(e=>e instanceof Element))return i;if(typeof i=="string"||i instanceof String){let e=document.createElement("div");return e.innerHTML=i,[...e.childNodes]}else return console.error(`[Pagefind ResultList component]: Expected template function to return an HTML element or string, got ${typeof i}`),[]},v=()=>{let i=(e=30)=>". ".repeat(Math.floor(10+Math.random()*e));return`
  • +
    +
    +

    ${i(30)}

    +

    ${i(40)}

    +
    +
  • `},y=i=>{let e=new r("li").class("pagefind-modular-list-result"),t=new r("div").class("pagefind-modular-list-thumb").addTo(e);i?.meta?.image&&new r("img").class("pagefind-modular-list-image").attrs({src:i.meta.image,alt:i.meta.image_alt||i.meta.title}).addTo(t);let s=new r("div").class("pagefind-modular-list-inner").addTo(e),n=new r("p").class("pagefind-modular-list-title").addTo(s);return new r("a").class("pagefind-modular-list-link").text(i.meta?.title).attrs({href:i.meta?.url||i.url}).addTo(n),new r("p").class("pagefind-modular-list-excerpt").html(i.excerpt).addTo(s),e.element},E=i=>{if(!(i instanceof HTMLElement))return null;let e=window.getComputedStyle(i).overflowY;return e!=="visible"&&e!=="hidden"?i:E(i.parentNode)},d=class{constructor(e={}){this.rawResult=e.result,this.placeholderNodes=e.placeholderNodes,this.resultFn=e.resultFn,this.intersectionEl=e.intersectionEl,this.result=null,this.waitForIntersection()}waitForIntersection(){if(!this.placeholderNodes?.length)return;let e={root:this.intersectionEl,rootMargin:"0px",threshold:.01};new IntersectionObserver((s,n)=>{this.result===null&&s?.[0]?.isIntersecting&&(this.load(),n.disconnect())},e).observe(this.placeholderNodes[0])}async load(){if(!this.placeholderNodes?.length)return;this.result=await this.rawResult.data();let e=this.resultFn(this.result),t=g(e);for(;this.placeholderNodes.length>1;)this.placeholderNodes.pop().remove();this.placeholderNodes[0].replaceWith(...t)}},a=class{constructor(e){if(this.intersectionEl=document.body,this.containerEl=null,this.results=[],this.placeholderTemplate=e.placeholderTemplate??v,this.resultTemplate=e.resultTemplate??y,e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind ResultList component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind ResultList component]: No container found for ${e} selector`);return}this.containerEl=t}append(e){for(let t of e)this.containerEl.appendChild(t)}register(e){e.on("results",t=>{this.containerEl&&(this.containerEl.innerHTML="",this.intersectionEl=E(this.containerEl),this.results=t.results.map(s=>{let n=g(this.placeholderTemplate());return this.append(n),new d({result:s,placeholderNodes:n,resultFn:this.resultTemplate,intersectionEl:this.intersectionEl})}))}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerHTML="")})}};var o=class{constructor(e={}){if(this.containerEl=null,this.defaultMessage=e.defaultMessage??"",this.term="",e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Summary component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Summary component]: No container found for ${e} selector`);return}this.containerEl=t,this.containerEl.innerText=this.defaultMessage}register(e){e.on("search",(t,s)=>{this.term=t}),e.on("results",t=>{if(!this.containerEl||!t)return;if(!this.term){this.containerEl.innerText=this.defaultMessage;return}let s=t?.results?.length??0;this.containerEl.innerText=`${s} result${s===1?"":"s"} for ${this.term}`}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerText=`Searching for ${this.term}...`)})}};var h=class{constructor(e={}){if(this.instance=null,this.wrapper=null,this.pillContainer=null,this.available={},this.selected=["All"],this.total=0,this.filterMemo="",this.filter=e.filter,this.ordering=e.ordering??null,this.alwaysShow=e.alwaysShow??!1,this.selectMultiple=e.selectMultiple??!1,!this.filter?.length){console.error("[Pagefind FilterPills component]: No filter option supplied, nothing to display");return}if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind FilterPills component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind FilterPills component]: No container found for ${e} selector`);return}t.innerHTML="";let s=`pagefind_modular_filter_pills_${this.filter}`,n=new r("div").class("pagefind-modular-filter-pills-wrapper").attrs({role:"group","aria-labelledby":s});this.alwaysShow||n.attrs({"data-pfmod-hidden":!0}),new r("div").id(s).class("pagefind-modular-filter-pills-label").attrs({"data-pfmod-sr-hidden":!0}).text(`Filter results by ${this.filter}`).addTo(n),this.pillContainer=new r("div").class("pagefind-modular-filter-pills").addTo(n),this.wrapper=n.addTo(t)}update(){let e=this.available.map(t=>t[0]).join("~");e==this.filterMemo?this.updateExisting():(this.renderNew(),this.filterMemo=e)}pushFilters(){let e=this.selected.filter(t=>t!=="All");this.instance.triggerFilter(this.filter,e)}pillInner(e,t){return this.total?`${e} (${t})`:`${e}`}renderNew(){this.available.forEach(([e,t])=>{new r("button").class("pagefind-modular-filter-pill").html(this.pillInner(e,t)).attrs({"aria-pressed":this.selected.includes(e),type:"button"}).handle("click",()=>{e==="All"?this.selected=["All"]:this.selected.includes(e)?this.selected=this.selected.filter(s=>s!==e):this.selectMultiple?this.selected.push(e):this.selected=[e],this.selected?.length?this.selected?.length>1&&(this.selected=this.selected.filter(s=>s!=="All")):this.selected=["All"],this.update(),this.pushFilters()}).addTo(this.pillContainer)})}updateExisting(){let e=[...this.pillContainer.childNodes];this.available.forEach(([t,s],n)=>{e[n].innerHTML=this.pillInner(t,s),e[n].setAttribute("aria-pressed",this.selected.includes(t))})}register(e){this.instance=e,this.instance.on("filters",t=>{if(!this.pillContainer)return;this.selectMultiple?t=t.available:t=t.total;let s=t[this.filter];if(!s){console.warn(`[Pagefind FilterPills component]: No possible values found for the ${this.filter} filter`);return}this.available=Object.entries(s),Array.isArray(this.ordering)?this.available.sort((n,c)=>{let m=this.ordering.indexOf(n[0]),_=this.ordering.indexOf(c[0]);return(m===-1?1/0:m)-(_===-1?1/0:_)}):this.available.sort((n,c)=>n[0].localeCompare(c[0])),this.available.unshift(["All",this.total]),this.update()}),e.on("results",t=>{this.pillContainer&&(this.total=t?.unfilteredResultCount||0,this.available?.[0]?.[0]==="All"&&(this.available[0][1]=this.total),this.total||this.alwaysShow?this.wrapper.removeAttribute("data-pfmod-hidden"):this.wrapper.setAttribute("data-pfmod-hidden","true"),this.update())})}};var P=async(i=50)=>await new Promise(e=>setTimeout(e,i)),u;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(u=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?modular-ui.js.*$/)[1])}catch{u="/pagefind/"}var p=class{constructor(e={}){this.__pagefind__=null,this.__initializing__=null,this.__searchID__=0,this.__hooks__={search:[],filters:[],loading:[],results:[]},this.components=[],this.searchTerm="",this.searchFilters={},this.searchResult={},this.availableFilters=null,this.totalFilters=null,this.options={bundlePath:e.bundlePath??u,mergeIndex:e.mergeIndex??[]},delete e.bundlePath,delete e.resetStyles,delete e.processResult,delete e.processTerm,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,this.pagefindOptions=e}add(e){e?.register?.(this),this.components.push(e)}on(e,t){if(!this.__hooks__[e]){let s=Object.keys(this.__hooks__).join(", ");console.error(`[Pagefind Composable]: Unknown event type ${e}. Supported events: [${s}]`);return}if(typeof t!="function"){console.error(`[Pagefind Composable]: Expected callback to be a function, received ${typeof t}`);return}this.__hooks__[e].push(t)}triggerLoad(){this.__load__()}triggerSearch(e){this.searchTerm=e,this.__dispatch__("search",e,this.searchFilters),this.__search__(e,this.searchFilters)}triggerSearchWithFilters(e,t){this.searchTerm=e,this.searchFilters=t,this.__dispatch__("search",e,t),this.__search__(e,t)}triggerFilters(e){this.searchFilters=e,this.__dispatch__("search",this.searchTerm,e),this.__search__(this.searchTerm,e)}triggerFilter(e,t){this.searchFilters=this.searchFilters||{},this.searchFilters[e]=t,this.__dispatch__("search",this.searchTerm,this.searchFilters),this.__search__(this.searchTerm,this.searchFilters)}__dispatch__(e,...t){this.__hooks__[e]?.forEach(s=>s?.(...t))}async __clear__(){this.__dispatch__("results",{results:[],unfilteredTotalCount:0}),this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}async __search__(e,t){this.__dispatch__("loading"),await this.__load__();let s=++this.__searchID__;if(!e||!e.length)return this.__clear__();let n=await this.__pagefind__.search(e,{filters:t});n&&this.__searchID__===s&&(n.filters&&Object.keys(n.filters)?.length&&(this.availableFilters=n.filters,this.totalFilters=n.totalFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})),this.searchResult=n,this.__dispatch__("results",this.searchResult))}async __load__(){if(this.__initializing__){for(;!this.__pagefind__;)await P(50);return}if(this.__initializing__=!0,!this.__pagefind__){let e;try{e=await import(`${this.options.bundlePath}pagefind.js`)}catch(t){console.error(t),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindComposable Instance"].join(` +`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript?.src??"bad script location"}]`):console.error("no known script location")}await e.options(this.pagefindOptions||{});for(let t of this.options.mergeIndex){if(!t.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let s=t.bundlePath;delete t.bundlePath,await e.mergeIndex(s,t)}this.__pagefind__=e}this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}};window.PagefindModularUI=f;})(); diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-ui.css b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-ui.css new file mode 100644 index 0000000..d7984a9 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-ui.css @@ -0,0 +1 @@ +.pagefind-ui__result.svelte-j9e30.svelte-j9e30{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-j9e30.svelte-j9e30:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-thumb.svelte-j9e30.svelte-j9e30{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-j9e30.svelte-j9e30{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-j9e30.svelte-j9e30{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-j9e30 .pagefind-ui__result-link.svelte-j9e30:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-j9e30.svelte-j9e30{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-j9e30.svelte-j9e30{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-j9e30.svelte-j9e30{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-j9e30.svelte-j9e30{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;display:flex;align-items:flex-start;gap:min(calc(40px * var(--pagefind-ui-scale)),3%);padding:calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));border-top:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result.svelte-4xnkmf.svelte-4xnkmf:last-of-type{border-bottom:solid var(--pagefind-ui-border-width) var(--pagefind-ui-border)}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf{display:flex;flex-direction:column;padding-left:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf.svelte-4xnkmf:first-of-type{padding-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{font-size:.9em;position:relative}.pagefind-ui__result-nested.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:before{content:"\2937 ";position:absolute;top:0;right:calc(100% + .1em)}.pagefind-ui__result-thumb.svelte-4xnkmf.svelte-4xnkmf{width:min(30%,calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));max-width:calc(120px * var(--pagefind-ui-scale));margin-top:calc(10px * var(--pagefind-ui-scale));aspect-ratio:var(--pagefind-ui-image-box-ratio);position:relative}.pagefind-ui__result-image.svelte-4xnkmf.svelte-4xnkmf{display:block;position:absolute;left:50%;transform:translate(-50%);font-size:0;width:auto;height:auto;max-width:100%;max-height:100%;border-radius:var(--pagefind-ui-image-border-radius)}.pagefind-ui__result-inner.svelte-4xnkmf.svelte-4xnkmf{flex:1;display:flex;flex-direction:column;align-items:flex-start;margin-top:calc(10px * var(--pagefind-ui-scale))}.pagefind-ui__result-title.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:700;font-size:calc(21px * var(--pagefind-ui-scale));margin-top:0;margin-bottom:0}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf{color:var(--pagefind-ui-text);text-decoration:none}.pagefind-ui__result-title.svelte-4xnkmf .pagefind-ui__result-link.svelte-4xnkmf:hover{text-decoration:underline}.pagefind-ui__result-excerpt.svelte-4xnkmf.svelte-4xnkmf{display:inline-block;font-weight:400;font-size:calc(16px * var(--pagefind-ui-scale));margin-top:calc(4px * var(--pagefind-ui-scale));margin-bottom:0;min-width:calc(250px * var(--pagefind-ui-scale))}.pagefind-ui__loading.svelte-4xnkmf.svelte-4xnkmf{color:var(--pagefind-ui-text);background-color:var(--pagefind-ui-text);border-radius:var(--pagefind-ui-border-radius);opacity:.1;pointer-events:none}.pagefind-ui__result-tags.svelte-4xnkmf.svelte-4xnkmf{list-style-type:none;padding:0;display:flex;gap:calc(20px * var(--pagefind-ui-scale));flex-wrap:wrap;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__result-tag.svelte-4xnkmf.svelte-4xnkmf{padding:calc(4px * var(--pagefind-ui-scale)) calc(8px * var(--pagefind-ui-scale));font-size:calc(14px * var(--pagefind-ui-scale));border-radius:var(--pagefind-ui-border-radius);background-color:var(--pagefind-ui-tag)}legend.svelte-1v2r7ls.svelte-1v2r7ls{position:absolute;clip:rect(0 0 0 0)}.pagefind-ui__filter-panel.svelte-1v2r7ls.svelte-1v2r7ls{min-width:min(calc(260px * var(--pagefind-ui-scale)),100%);flex:1;display:flex;flex-direction:column;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{border:0;padding:0}.pagefind-ui__filter-block.svelte-1v2r7ls.svelte-1v2r7ls{padding:0;display:block;border-bottom:solid calc(2px * var(--pagefind-ui-scale)) var(--pagefind-ui-border);padding:calc(20px * var(--pagefind-ui-scale)) 0}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls{font-size:calc(16px * var(--pagefind-ui-scale));position:relative;display:flex;align-items:center;list-style:none;font-weight:700;cursor:pointer;height:calc(24px * var(--pagefind-ui-scale))}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls::-webkit-details-marker{display:none}.pagefind-ui__filter-name.svelte-1v2r7ls.svelte-1v2r7ls:after{position:absolute;content:"";right:calc(6px * var(--pagefind-ui-scale));top:50%;width:calc(8px * var(--pagefind-ui-scale));height:calc(8px * var(--pagefind-ui-scale));border:solid calc(2px * var(--pagefind-ui-scale)) currentColor;border-right:0;border-top:0;transform:translateY(-70%) rotate(-45deg)}.pagefind-ui__filter-block[open].svelte-1v2r7ls .pagefind-ui__filter-name.svelte-1v2r7ls:after{transform:translateY(-70%) rotate(-225deg)}.pagefind-ui__filter-group.svelte-1v2r7ls.svelte-1v2r7ls{display:flex;flex-direction:column;gap:calc(20px * var(--pagefind-ui-scale));padding-top:calc(30px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls{position:relative;display:flex;align-items:center;gap:calc(8px * var(--pagefind-ui-scale))}.pagefind-ui__filter-value.svelte-1v2r7ls.svelte-1v2r7ls:before{position:absolute;content:"";top:50%;left:calc(8px * var(--pagefind-ui-scale));width:0px;height:0px;border:solid 1px #fff;opacity:0;transform:translate(calc(4.5px * var(--pagefind-ui-scale) * -1),calc(.8px * var(--pagefind-ui-scale))) skew(-5deg) rotate(-45deg);transform-origin:top left;border-top:0;border-right:0;pointer-events:none}.pagefind-ui__filter-value.pagefind-ui__filter-value--checked.svelte-1v2r7ls.svelte-1v2r7ls:before{opacity:1;width:calc(9px * var(--pagefind-ui-scale));height:calc(4px * var(--pagefind-ui-scale));transition:width .1s ease-out .1s,height .1s ease-in}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls{margin:0;width:calc(16px * var(--pagefind-ui-scale));height:calc(16px * var(--pagefind-ui-scale));border:solid 1px var(--pagefind-ui-border);appearance:none;-webkit-appearance:none;border-radius:calc(var(--pagefind-ui-border-radius) / 2);background-color:var(--pagefind-ui-background);cursor:pointer}.pagefind-ui__filter-checkbox.svelte-1v2r7ls.svelte-1v2r7ls:checked{background-color:var(--pagefind-ui-primary);border:solid 1px var(--pagefind-ui-primary)}.pagefind-ui__filter-label.svelte-1v2r7ls.svelte-1v2r7ls{cursor:pointer;font-size:calc(16px * var(--pagefind-ui-scale));font-weight:400}.pagefind-ui--reset *:where(:not(html,iframe,canvas,img,svg,video):not(svg *,symbol *)){all:unset;display:revert;outline:revert}.pagefind-ui--reset *,.pagefind-ui--reset *:before,.pagefind-ui--reset *:after{box-sizing:border-box}.pagefind-ui--reset a,.pagefind-ui--reset button{cursor:revert}.pagefind-ui--reset ol,.pagefind-ui--reset ul,.pagefind-ui--reset menu{list-style:none}.pagefind-ui--reset img{max-width:100%}.pagefind-ui--reset table{border-collapse:collapse}.pagefind-ui--reset input,.pagefind-ui--reset textarea{-webkit-user-select:auto}.pagefind-ui--reset textarea{white-space:revert}.pagefind-ui--reset meter{-webkit-appearance:revert;appearance:revert}.pagefind-ui--reset ::placeholder{color:unset}.pagefind-ui--reset :where([hidden]){display:none}.pagefind-ui--reset :where([contenteditable]:not([contenteditable="false"])){-moz-user-modify:read-write;-webkit-user-modify:read-write;overflow-wrap:break-word;-webkit-line-break:after-white-space;-webkit-user-select:auto}.pagefind-ui--reset :where([draggable="true"]){-webkit-user-drag:element}.pagefind-ui--reset mark{all:revert}:root{--pagefind-ui-scale:.8;--pagefind-ui-primary:#393939;--pagefind-ui-text:#393939;--pagefind-ui-background:#ffffff;--pagefind-ui-border:#eeeeee;--pagefind-ui-tag:#eeeeee;--pagefind-ui-border-width:2px;--pagefind-ui-border-radius:8px;--pagefind-ui-image-border-radius:8px;--pagefind-ui-image-box-ratio:3 / 2;--pagefind-ui-font:system, -apple-system, "BlinkMacSystemFont", ".SFNSText-Regular", "San Francisco", "Roboto", "Segoe UI", "Helvetica Neue", "Lucida Grande", "Ubuntu", "arial", sans-serif}.pagefind-ui.svelte-e9gkc3{width:100%;color:var(--pagefind-ui-text);font-family:var(--pagefind-ui-font)}.pagefind-ui__hidden.svelte-e9gkc3{display:none!important}.pagefind-ui__suppressed.svelte-e9gkc3{opacity:0;pointer-events:none}.pagefind-ui__form.svelte-e9gkc3{position:relative}.pagefind-ui__form.svelte-e9gkc3:before{background-color:var(--pagefind-ui-text);width:calc(18px * var(--pagefind-ui-scale));height:calc(18px * var(--pagefind-ui-scale));top:calc(23px * var(--pagefind-ui-scale));left:calc(20px * var(--pagefind-ui-scale));content:"";position:absolute;display:block;opacity:.7;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");mask-image:url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");-webkit-mask-size:100%;mask-size:100%;z-index:9;pointer-events:none}.pagefind-ui__search-input.svelte-e9gkc3{height:calc(64px * var(--pagefind-ui-scale));padding:0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));background-color:var(--pagefind-ui-background);border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);font-size:calc(21px * var(--pagefind-ui-scale));position:relative;appearance:none;-webkit-appearance:none;display:flex;width:100%;box-sizing:border-box;font-weight:700}.pagefind-ui__search-input.svelte-e9gkc3::placeholder{opacity:.2}.pagefind-ui__search-clear.svelte-e9gkc3{position:absolute;top:calc(3px * var(--pagefind-ui-scale));right:calc(3px * var(--pagefind-ui-scale));height:calc(58px * var(--pagefind-ui-scale));padding:0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));color:var(--pagefind-ui-text);font-size:calc(14px * var(--pagefind-ui-scale));cursor:pointer;background-color:var(--pagefind-ui-background);border-radius:var(--pagefind-ui-border-radius)}.pagefind-ui__drawer.svelte-e9gkc3{gap:calc(60px * var(--pagefind-ui-scale));display:flex;flex-direction:row;flex-wrap:wrap}.pagefind-ui__results-area.svelte-e9gkc3{min-width:min(calc(400px * var(--pagefind-ui-scale)),100%);flex:1000;margin-top:calc(20px * var(--pagefind-ui-scale))}.pagefind-ui__results.svelte-e9gkc3{padding:0}.pagefind-ui__message.svelte-e9gkc3{box-sizing:content-box;font-size:calc(16px * var(--pagefind-ui-scale));height:calc(24px * var(--pagefind-ui-scale));padding:calc(20px * var(--pagefind-ui-scale)) 0;display:flex;align-items:center;font-weight:700;margin-top:0}.pagefind-ui__button.svelte-e9gkc3{margin-top:calc(40px * var(--pagefind-ui-scale));border:var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);border-radius:var(--pagefind-ui-border-radius);height:calc(48px * var(--pagefind-ui-scale));padding:0 calc(12px * var(--pagefind-ui-scale));font-size:calc(16px * var(--pagefind-ui-scale));color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background);width:100%;text-align:center;font-weight:700;cursor:pointer}.pagefind-ui__button.svelte-e9gkc3:hover{border-color:var(--pagefind-ui-primary);color:var(--pagefind-ui-primary);background:var(--pagefind-ui-background)} diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-ui.js b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-ui.js new file mode 100644 index 0000000..6c2ec66 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind-ui.js @@ -0,0 +1,2 @@ +(()=>{var Ms=Object.defineProperty;var y=(n,e)=>{for(var t in e)Ms(n,t,{get:e[t],enumerable:!0})};function z(){}function mt(n){return n()}function gn(){return Object.create(null)}function G(n){n.forEach(mt)}function nt(n){return typeof n=="function"}function K(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}var et;function ie(n,e){return et||(et=document.createElement("a")),et.href=e,n===et.href}function En(n){return Object.keys(n).length===0}var Rn=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,de=class{constructor(e){this.options=e,this._listeners="WeakMap"in Rn?new WeakMap:void 0}observe(e,t){return this._listeners.set(e,t),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(t=>{var s;for(let r of t)de.entries.set(r.target,r),(s=this._listeners.get(r.target))===null||s===void 0||s(r)})}};de.entries="WeakMap"in Rn?new WeakMap:void 0;var bn=!1;function As(){bn=!0}function vs(){bn=!1}function b(n,e){n.appendChild(e)}function S(n,e,t){n.insertBefore(e,t||null)}function k(n){n.parentNode&&n.parentNode.removeChild(n)}function Q(n,e){for(let t=0;tn.removeEventListener(e,t,s)}function E(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function Hs(n){return Array.from(n.childNodes)}function N(n,e){e=""+e,n.data!==e&&(n.data=e)}function pt(n,e){n.value=e??""}function B(n,e,t){n.classList[t?"add":"remove"](e)}var st=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,s=null){this.e||(this.is_svg?this.e=ws(t.nodeName):this.e=C(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(s)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;tn.indexOf(s)===-1?e.push(s):t.push(s)),t.forEach(s=>s()),re=e}var tt=new Set,ee;function ae(){ee={r:0,c:[],p:ee}}function oe(){ee.r||G(ee.c),ee=ee.p}function U(n,e){n&&n.i&&(tt.delete(n),n.i(e))}function P(n,e,t,s){if(n&&n.o){if(tt.has(n))return;tt.add(n),ee.c.push(()=>{tt.delete(n),s&&(t&&n.d(1),s())}),n.o(e)}else s&&s()}function Sn(n,e){P(n,1,1,()=>{e.delete(n.key)})}function yn(n,e,t,s,r,l,i,a,o,h,c,m){let p=n.length,d=l.length,_=p,u={};for(;_--;)u[n[_].key]=_;let f=[],T=new Map,R=new Map,M=[];for(_=d;_--;){let v=m(r,l,_),H=t(v),O=i.get(H);O?s&&M.push(()=>O.p(v,e)):(O=h(H,v),O.c()),T.set(H,f[_]=O),H in u&&R.set(H,Math.abs(_-u[H]))}let D=new Set,X=new Set;function V(v){U(v,1),v.m(a,c),i.set(v.key,v),c=v.first,d--}for(;p&&d;){let v=f[d-1],H=n[p-1],O=v.key,W=H.key;v===H?(c=v.first,p--,d--):T.has(W)?!i.has(O)||D.has(O)?V(v):X.has(W)?p--:R.get(O)>R.get(W)?(X.add(O),V(v)):(D.add(W),p--):(o(H,i),p--)}for(;p--;){let v=n[p];T.has(v.key)||o(v,i)}for(;d;)V(f[d-1]);return G(M),f}var zs=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],Ua=new Set([...zs]);function Mn(n,e,t){let s=n.$$.props[e];s!==void 0&&(n.$$.bound[s]=t,t(n.$$.ctx[s]))}function rt(n){n&&n.c()}function me(n,e,t,s){let{fragment:r,after_update:l}=n.$$;r&&r.m(e,t),s||ht(()=>{let i=n.$$.on_mount.map(mt).filter(nt);n.$$.on_destroy?n.$$.on_destroy.push(...i):G(i),n.$$.on_mount=[]}),l.forEach(ht)}function ue(n,e){let t=n.$$;t.fragment!==null&&(js(t.after_update),G(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function Us(n,e){n.$$.dirty[0]===-1&&(se.push(n),Ns(),n.$$.dirty.fill(0)),n.$$.dirty[e/31|0]|=1<{let _=d.length?d[0]:p;return h.ctx&&r(h.ctx[m],h.ctx[m]=_)&&(!h.skip_bound&&h.bound[m]&&h.bound[m](_),c&&Us(n,m)),p}):[],h.update(),c=!0,G(h.before_update),h.fragment=s?s(h.ctx):!1,e.target){if(e.hydrate){As();let m=Hs(e.target);h.fragment&&h.fragment.l(m),m.forEach(k)}else h.fragment&&h.fragment.c();e.intro&&U(n.$$.fragment),me(n,e.target,e.anchor,e.customElement),vs(),kn()}fe(o)}var Ds;typeof HTMLElement=="function"&&(Ds=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:"open"})}connectedCallback(){let{on_mount:n}=this.$$;this.$$.on_disconnect=n.map(mt).filter(nt);for(let e in this.$$.slotted)this.appendChild(this.$$.slotted[e])}attributeChangedCallback(n,e,t){this[n]=t}disconnectedCallback(){G(this.$$.on_disconnect)}$destroy(){ue(this,1),this.$destroy=z}$on(n,e){if(!nt(e))return z;let t=this.$$.callbacks[n]||(this.$$.callbacks[n]=[]);return t.push(e),()=>{let s=t.indexOf(e);s!==-1&&t.splice(s,1)}}$set(n){this.$$set&&!En(n)&&(this.$$.skip_bound=!0,this.$$set(n),this.$$.skip_bound=!1)}});var q=class{$destroy(){ue(this,1),this.$destroy=z}$on(e,t){if(!nt(t))return z;let s=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return s.push(t),()=>{let r=s.indexOf(t);r!==-1&&s.splice(r,1)}}$set(e){this.$$set&&!En(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}};function I(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=97&&e<=122||e>=65&&e<=90}function $(n){let e=typeof n=="string"?n.charCodeAt(0):n;return e>=48&&e<=57}function Z(n){return I(n)||$(n)}var An=["art-lojban","cel-gaulish","no-bok","no-nyn","zh-guoyu","zh-hakka","zh-min","zh-min-nan","zh-xiang"];var Rt={"en-gb-oed":"en-GB-oxendict","i-ami":"ami","i-bnn":"bnn","i-default":null,"i-enochian":null,"i-hak":"hak","i-klingon":"tlh","i-lux":"lb","i-mingo":null,"i-navajo":"nv","i-pwn":"pwn","i-tao":"tao","i-tay":"tay","i-tsu":"tsu","sgn-be-fr":"sfb","sgn-be-nl":"vgt","sgn-ch-de":"sgg","art-lojban":"jbo","cel-gaulish":null,"no-bok":"nb","no-nyn":"nn","zh-guoyu":"cmn","zh-hakka":"hak","zh-min":null,"zh-min-nan":"nan","zh-xiang":"hsn"};var Is={}.hasOwnProperty;function lt(n,e={}){let t=vn(),s=String(n),r=s.toLowerCase(),l=0;if(n==null)throw new Error("Expected string, got `"+n+"`");if(Is.call(Rt,r)){let a=Rt[r];return(e.normalize===void 0||e.normalize===null||e.normalize)&&typeof a=="string"?lt(a):(t[An.includes(r)?"regular":"irregular"]=s,t)}for(;I(r.charCodeAt(l))&&l<9;)l++;if(l>1&&l<9){if(t.language=s.slice(0,l),l<4){let a=0;for(;r.charCodeAt(l)===45&&I(r.charCodeAt(l+1))&&I(r.charCodeAt(l+2))&&I(r.charCodeAt(l+3))&&!I(r.charCodeAt(l+4));){if(a>2)return i(l,3,"Too many extended language subtags, expected at most 3 subtags");t.extendedLanguageSubtags.push(s.slice(l+1,l+4)),l+=4,a++}}for(r.charCodeAt(l)===45&&I(r.charCodeAt(l+1))&&I(r.charCodeAt(l+2))&&I(r.charCodeAt(l+3))&&I(r.charCodeAt(l+4))&&!I(r.charCodeAt(l+5))&&(t.script=s.slice(l+1,l+5),l+=5),r.charCodeAt(l)===45&&(I(r.charCodeAt(l+1))&&I(r.charCodeAt(l+2))&&!I(r.charCodeAt(l+3))?(t.region=s.slice(l+1,l+3),l+=3):$(r.charCodeAt(l+1))&&$(r.charCodeAt(l+2))&&$(r.charCodeAt(l+3))&&!$(r.charCodeAt(l+4))&&(t.region=s.slice(l+1,l+4),l+=4));r.charCodeAt(l)===45;){let a=l+1,o=a;for(;Z(r.charCodeAt(o));){if(o-a>7)return i(o,1,"Too long variant, expected at most 8 characters");o++}if(o-a>4||o-a>3&&$(r.charCodeAt(a)))t.variants.push(s.slice(a,o)),l=o;else break}for(;r.charCodeAt(l)===45&&!(r.charCodeAt(l+1)===120||!Z(r.charCodeAt(l+1))||r.charCodeAt(l+2)!==45||!Z(r.charCodeAt(l+3)));){let a=l+2,o=0;for(;r.charCodeAt(a)===45&&Z(r.charCodeAt(a+1))&&Z(r.charCodeAt(a+2));){let h=a+1;for(a=h+2,o++;Z(r.charCodeAt(a));){if(a-h>7)return i(a,2,"Too long extension, expected at most 8 characters");a++}}if(!o)return i(a,4,"Empty extension, extensions must have at least 2 characters of content");t.extensions.push({singleton:s.charAt(l+1),extensions:s.slice(l+3,a).split("-")}),l=a}}else l=0;if(l===0&&r.charCodeAt(l)===120||r.charCodeAt(l)===45&&r.charCodeAt(l+1)===120){l=l?l+2:1;let a=l;for(;r.charCodeAt(a)===45&&Z(r.charCodeAt(a+1));){let o=l+1;for(a=o;Z(r.charCodeAt(a));){if(a-o>7)return i(a,5,"Too long private-use area, expected at most 8 characters");a++}t.privateuse.push(s.slice(l+1,a)),l=a}}if(l!==s.length)return i(l,6,"Found superfluous content after tag");return t;function i(a,o,h){return e.warning&&e.warning(h,o,a),e.forgiving?t:vn()}}function vn(){return{language:null,extendedLanguageSubtags:[],script:null,region:null,variants:[],extensions:[],privateuse:[],irregular:null,regular:null}}function wn(n,e,t){let s=n.slice();return s[8]=e[t][0],s[9]=e[t][1],s}function Ps(n){let e,t,s,r,l,i=n[0]&&Hn(n);return{c(){i&&i.c(),e=A(),t=C("div"),s=C("p"),s.textContent=`${n[3](30)}`,r=A(),l=C("p"),l.textContent=`${n[3](40)}`,E(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-j9e30"),E(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-j9e30"),E(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(a,o){i&&i.m(a,o),S(a,e,o),S(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=Hn(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&k(e),a&&k(t)}}}function Ls(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,c=n[1].excerpt+"",m,p=n[0]&&Fn(n),d=n[2].length&&On(n);return{c(){p&&p.c(),e=A(),t=C("div"),s=C("p"),r=C("a"),i=w(l),o=A(),h=C("p"),m=A(),d&&d.c(),E(r,"class","pagefind-ui__result-link svelte-j9e30"),E(r,"href",a=n[1].meta?.url||n[1].url),E(s,"class","pagefind-ui__result-title svelte-j9e30"),E(h,"class","pagefind-ui__result-excerpt svelte-j9e30"),E(t,"class","pagefind-ui__result-inner svelte-j9e30")},m(_,u){p&&p.m(_,u),S(_,e,u),S(_,t,u),b(t,s),b(s,r),b(r,i),b(t,o),b(t,h),h.innerHTML=c,b(t,m),d&&d.m(t,null)},p(_,u){_[0]?p?p.p(_,u):(p=Fn(_),p.c(),p.m(e.parentNode,e)):p&&(p.d(1),p=null),u&2&&l!==(l=_[1].meta?.title+"")&&N(i,l),u&2&&a!==(a=_[1].meta?.url||_[1].url)&&E(r,"href",a),u&2&&c!==(c=_[1].excerpt+"")&&(h.innerHTML=c),_[2].length?d?d.p(_,u):(d=On(_),d.c(),d.m(t,null)):d&&(d.d(1),d=null)},d(_){p&&p.d(_),_&&k(e),_&&k(t),d&&d.d()}}}function Hn(n){let e;return{c(){e=C("div"),E(e,"class","pagefind-ui__result-thumb pagefind-ui__loading svelte-j9e30")},m(t,s){S(t,e,s)},d(t){t&&k(e)}}}function Fn(n){let e,t=n[1].meta.image&&Nn(n);return{c(){e=C("div"),t&&t.c(),E(e,"class","pagefind-ui__result-thumb svelte-j9e30")},m(s,r){S(s,e,r),t&&t.m(e,null)},p(s,r){s[1].meta.image?t?t.p(s,r):(t=Nn(s),t.c(),t.m(e,null)):t&&(t.d(1),t=null)},d(s){s&&k(e),t&&t.d()}}}function Nn(n){let e,t,s;return{c(){e=C("img"),E(e,"class","pagefind-ui__result-image svelte-j9e30"),ie(e.src,t=n[1].meta?.image)||E(e,"src",t),E(e,"alt",s=n[1].meta?.image_alt||n[1].meta?.title)},m(r,l){S(r,e,l)},p(r,l){l&2&&!ie(e.src,t=r[1].meta?.image)&&E(e,"src",t),l&2&&s!==(s=r[1].meta?.image_alt||r[1].meta?.title)&&E(e,"alt",s)},d(r){r&&k(e)}}}function On(n){let e,t=n[2],s=[];for(let r=0;rn.toLocaleUpperCase();function Bs(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=async m=>{t(1,a=await m.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([p])=>!i.includes(p)))},c=(m=30)=>". ".repeat(Math.floor(10+Math.random()*m));return n.$$set=m=>{"show_images"in m&&t(0,s=m.show_images),"process_result"in m&&t(4,r=m.process_result),"result"in m&&t(5,l=m.result)},n.$$.update=()=>{if(n.$$.dirty&32)e:h(l)},[s,a,o,c,r,l]}var bt=class extends q{constructor(e){super(),Y(this,e,Bs,qs,K,{show_images:0,process_result:4,result:5})}},Un=bt;function Dn(n,e,t){let s=n.slice();return s[11]=e[t][0],s[12]=e[t][1],s}function In(n,e,t){let s=n.slice();return s[15]=e[t],s}function Vs(n){let e,t,s,r,l,i=n[0]&&Pn(n);return{c(){i&&i.c(),e=A(),t=C("div"),s=C("p"),s.textContent=`${n[5](30)}`,r=A(),l=C("p"),l.textContent=`${n[5](40)}`,E(s,"class","pagefind-ui__result-title pagefind-ui__loading svelte-4xnkmf"),E(l,"class","pagefind-ui__result-excerpt pagefind-ui__loading svelte-4xnkmf"),E(t,"class","pagefind-ui__result-inner svelte-4xnkmf")},m(a,o){i&&i.m(a,o),S(a,e,o),S(a,t,o),b(t,s),b(t,r),b(t,l)},p(a,o){a[0]?i||(i=Pn(a),i.c(),i.m(e.parentNode,e)):i&&(i.d(1),i=null)},d(a){i&&i.d(a),a&&k(e),a&&k(t)}}}function Ws(n){let e,t,s,r,l=n[1].meta?.title+"",i,a,o,h,c,m=n[0]&&Ln(n),p=n[4]&&Bn(n),d=n[3],_=[];for(let f=0;fn.toLocaleUpperCase();function Ks(n,e,t){let{show_images:s=!0}=e,{process_result:r=null}=e,{result:l={data:async()=>{}}}=e,i=["title","image","image_alt","url"],a,o=[],h=[],c=!1,m=(_,u)=>{if(_.length<=u)return _;let f=[..._].sort((T,R)=>R.locations.length-T.locations.length).slice(0,3).map(T=>T.url);return _.filter(T=>f.includes(T.url))},p=async _=>{t(1,a=await _.data()),t(1,a=r?.(a)??a),t(2,o=Object.entries(a.meta).filter(([u])=>!i.includes(u))),Array.isArray(a.sub_results)&&(t(4,c=a.sub_results?.[0]?.url===(a.meta?.url||a.url)),c?t(3,h=m(a.sub_results.slice(1),3)):t(3,h=m([...a.sub_results],3)))},d=(_=30)=>". ".repeat(Math.floor(10+Math.random()*_));return n.$$set=_=>{"show_images"in _&&t(0,s=_.show_images),"process_result"in _&&t(6,r=_.process_result),"result"in _&&t(7,l=_.result)},n.$$.update=()=>{if(n.$$.dirty&128)e:p(l)},[s,a,o,h,c,d,r,l]}var Tt=class extends q{constructor(e){super(),Y(this,e,Ks,Gs,K,{show_images:0,process_result:6,result:7})}},Jn=Tt;function Yn(n,e,t){let s=n.slice();return s[10]=e[t][0],s[11]=e[t][1],s[12]=e,s[13]=t,s}function Zn(n,e,t){let s=n.slice();return s[14]=e[t][0],s[15]=e[t][1],s[16]=e,s[17]=t,s}function Xn(n){let e,t,s=n[4]("filters_label",n[5],n[6])+"",r,l,i=Object.entries(n[1]),a=[];for(let o=0;on.toLocaleUpperCase(),ts=n=>n.toLowerCase();function Ys(n,e,t){let{available_filters:s=null}=e,{show_empty_filters:r=!0}=e,{open_filters:l=[]}=e,{translate:i=()=>""}=e,{automatic_translations:a={}}=e,{translations:o={}}=e,{selected_filters:h={}}=e,c=!1,m=!1;function p(d,_){h[`${d}:${_}`]=this.checked,t(0,h)}return n.$$set=d=>{"available_filters"in d&&t(1,s=d.available_filters),"show_empty_filters"in d&&t(2,r=d.show_empty_filters),"open_filters"in d&&t(3,l=d.open_filters),"translate"in d&&t(4,i=d.translate),"automatic_translations"in d&&t(5,a=d.automatic_translations),"translations"in d&&t(6,o=d.translations),"selected_filters"in d&&t(0,h=d.selected_filters)},n.$$.update=()=>{if(n.$$.dirty&258){e:if(s&&!c){t(8,c=!0);let d=Object.entries(s||{});d.length===1&&Object.entries(d[0][1])?.length<=6&&t(7,m=!0)}}},[h,s,r,l,i,a,o,m,c,p]}var Ct=class extends q{constructor(e){super(),Y(this,e,Ys,Js,K,{available_filters:1,show_empty_filters:2,open_filters:3,translate:4,automatic_translations:5,translations:6,selected_filters:0})}},ns=Ct;var kt={};y(kt,{comments:()=>Xs,default:()=>$s,direction:()=>Qs,strings:()=>xs,thanks_to:()=>Zs});var Zs="Jan Claasen ",Xs="",Qs="ltr",xs={placeholder:"Soek",clear_search:"Opruim",load_more:"Laai nog resultate",search_label:"Soek hierdie webwerf",filters_label:"Filters",zero_results:"Geen resultate vir [SEARCH_TERM]",many_results:"[COUNT] resultate vir [SEARCH_TERM]",one_result:"[COUNT] resultate vir [SEARCH_TERM]",alt_search:"Geen resultate vir [SEARCH_TERM]. Toon resultate vir [DIFFERENT_TERM] in plaas daarvan",search_suggestion:"Geen resultate vir [SEARCH_TERM]. Probeer eerder een van die volgende terme:",searching:"Soek vir [SEARCH_TERM]"},$s={thanks_to:Zs,comments:Xs,direction:Qs,strings:xs};var St={};y(St,{comments:()=>tr,default:()=>rr,direction:()=>nr,strings:()=>sr,thanks_to:()=>er});var er="Jermanuts",tr="",nr="rtl",sr={placeholder:"\u0628\u062D\u062B",clear_search:"\u0627\u0645\u0633\u062D",load_more:"\u062D\u0645\u0651\u0650\u0644 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 \u0627\u0644\u0646\u062A\u0627\u0626\u062C",search_label:"\u0627\u0628\u062D\u062B \u0641\u064A \u0647\u0630\u0627 \u0627\u0644\u0645\u0648\u0642\u0639",filters_label:"\u062A\u0635\u0641\u064A\u0627\u062A",zero_results:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C \u0644 [SEARCH_TERM]",many_results:"[COUNT] \u0646\u062A\u0627\u0626\u062C \u0644 [SEARCH_TERM]",one_result:"[COUNT] \u0646\u062A\u064A\u062C\u0629 \u0644 [SEARCH_TERM]",alt_search:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C \u0644 [SEARCH_TERM]. \u064A\u0639\u0631\u0636 \u0627\u0644\u0646\u062A\u0627\u0626\u062C \u0644 [DIFFERENT_TERM] \u0628\u062F\u0644\u0627\u064B \u0645\u0646 \u0630\u0644\u0643",search_suggestion:"\u0644\u0627 \u062A\u0648\u062C\u062F \u0646\u062A\u0627\u0626\u062C \u0644 [SEARCH_TERM]. \u062C\u0631\u0628 \u0623\u062D\u062F \u0639\u0645\u0644\u064A\u0627\u062A \u0627\u0644\u0628\u062D\u062B \u0627\u0644\u062A\u0627\u0644\u064A\u0629:",searching:"\u064A\u0628\u062D\u062B \u0639\u0646 [SEARCH_TERM]..."},rr={thanks_to:er,comments:tr,direction:nr,strings:sr};var yt={};y(yt,{comments:()=>ir,default:()=>ur,direction:()=>ar,strings:()=>or,thanks_to:()=>lr});var lr="Maruf Alom ",ir="",ar="ltr",or={placeholder:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",clear_search:"\u09AE\u09C1\u099B\u09C7 \u09AB\u09C7\u09B2\u09C1\u09A8",load_more:"\u0986\u09B0\u09CB \u09AB\u09B2\u09BE\u09AB\u09B2 \u09A6\u09C7\u0996\u09C1\u09A8",search_label:"\u098F\u0987 \u0993\u09DF\u09C7\u09AC\u09B8\u09BE\u0987\u099F\u09C7 \u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u0995\u09B0\u09C1\u09A8",filters_label:"\u09AB\u09BF\u09B2\u09CD\u099F\u09BE\u09B0",zero_results:"[SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF",many_results:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",one_result:"[COUNT]-\u099F\u09BF \u09AB\u09B2\u09BE\u09AB\u09B2 \u09AA\u09BE\u0993\u09DF\u09BE \u0997\u09BF\u09DF\u09C7\u099B\u09C7 [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF",alt_search:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF. \u09AA\u09B0\u09BF\u09AC\u09B0\u09CD\u09A4\u09C7 [DIFFERENT_TERM] \u098F\u09B0 \u099C\u09A8\u09CD\u09AF \u09A6\u09C7\u0996\u09BE\u09A8\u09CB \u09B9\u099A\u09CD\u099B\u09C7",search_suggestion:"\u0995\u09CB\u09A8 \u0995\u09BF\u099B\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09AA\u09BE\u0993\u09DF\u09BE \u09AF\u09BE\u09DF\u09A8\u09BF [SEARCH_TERM] \u098F\u09B0 \u09AC\u09BF\u09B7\u09DF\u09C7. \u09A8\u09BF\u09A8\u09CD\u09AE\u09C7\u09B0 \u09AC\u09BF\u09B7\u09DF\u09AC\u09B8\u09CD\u09A4\u09C1 \u0996\u09C1\u0981\u099C\u09C7 \u09A6\u09C7\u0996\u09C1\u09A8:",searching:"\u0985\u09A8\u09C1\u09B8\u09A8\u09CD\u09A7\u09BE\u09A8 \u099A\u09B2\u099B\u09C7 [SEARCH_TERM]..."},ur={thanks_to:lr,comments:ir,direction:ar,strings:or};var Mt={};y(Mt,{comments:()=>_r,default:()=>hr,direction:()=>fr,strings:()=>dr,thanks_to:()=>cr});var cr="Pablo Villaverde ",_r="",fr="ltr",dr={placeholder:"Cerca",clear_search:"Netejar",load_more:"Veure m\xE9s resultats",search_label:"Cerca en aquest lloc",filters_label:"Filtres",zero_results:"No es van trobar resultats per [SEARCH_TERM]",many_results:"[COUNT] resultats trobats per [SEARCH_TERM]",one_result:"[COUNT] resultat trobat per [SEARCH_TERM]",alt_search:"No es van trobar resultats per [SEARCH_TERM]. Mostrant al seu lloc resultats per [DIFFERENT_TERM]",search_suggestion:"No es van trobar resultats per [SEARCH_TERM]. Proveu una de les cerques seg\xFCents:",searching:"Cercant [SEARCH_TERM]..."},hr={thanks_to:cr,comments:_r,direction:fr,strings:dr};var At={};y(At,{comments:()=>pr,default:()=>Rr,direction:()=>gr,strings:()=>Er,thanks_to:()=>mr});var mr="Dalibor Hon ",pr="",gr="ltr",Er={placeholder:"Hledat",clear_search:"Smazat",load_more:"Na\u010D\xEDst dal\u0161\xED v\xFDsledky",search_label:"Prohledat tuto str\xE1nku",filters_label:"Filtry",zero_results:"\u017D\xE1dn\xE9 v\xFDsledky pro [SEARCH_TERM]",many_results:"[COUNT] v\xFDsledk\u016F pro [SEARCH_TERM]",one_result:"[COUNT] v\xFDsledek pro [SEARCH_TERM]",alt_search:"\u017D\xE1dn\xE9 v\xFDsledky pro [SEARCH_TERM]. Zobrazuj\xED se v\xFDsledky pro [DIFFERENT_TERM]",search_suggestion:"\u017D\xE1dn\xE9 v\xFDsledky pro [SEARCH_TERM]. Souvisej\xEDc\xED v\xFDsledky hled\xE1n\xED:",searching:"Hled\xE1m [SEARCH_TERM]..."},Rr={thanks_to:mr,comments:pr,direction:gr,strings:Er};var vt={};y(vt,{comments:()=>Tr,default:()=>Sr,direction:()=>Cr,strings:()=>kr,thanks_to:()=>br});var br="Jonas Smedegaard ",Tr="",Cr="ltr",kr={placeholder:"S\xF8g",clear_search:"Nulstil",load_more:"Indl\xE6s flere resultater",search_label:"S\xF8g p\xE5 dette website",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v et af disse s\xF8geord i stedet:",searching:"S\xF8ger efter [SEARCH_TERM]..."},Sr={thanks_to:br,comments:Tr,direction:Cr,strings:kr};var wt={};y(wt,{comments:()=>Mr,default:()=>wr,direction:()=>Ar,strings:()=>vr,thanks_to:()=>yr});var yr="Jan Claasen ",Mr="",Ar="ltr",vr={placeholder:"Suche",clear_search:"L\xF6schen",load_more:"Mehr Ergebnisse laden",search_label:"Suche diese Seite",filters_label:"Filter",zero_results:"Keine Ergebnisse f\xFCr [SEARCH_TERM]",many_results:"[COUNT] Ergebnisse f\xFCr [SEARCH_TERM]",one_result:"[COUNT] Ergebnis f\xFCr [SEARCH_TERM]",alt_search:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Stattdessen werden Ergebnisse f\xFCr [DIFFERENT_TERM] angezeigt",search_suggestion:"Keine Ergebnisse f\xFCr [SEARCH_TERM]. Versuchen Sie eine der folgenden Suchen:",searching:"Suche f\xFCr [SEARCH_TERM]"},wr={thanks_to:yr,comments:Mr,direction:Ar,strings:vr};var Ht={};y(Ht,{comments:()=>Fr,default:()=>jr,direction:()=>Nr,strings:()=>Or,thanks_to:()=>Hr});var Hr="Liam Bigelow ",Fr="",Nr="ltr",Or={placeholder:"Search",clear_search:"Clear",load_more:"Load more results",search_label:"Search this site",filters_label:"Filters",zero_results:"No results for [SEARCH_TERM]",many_results:"[COUNT] results for [SEARCH_TERM]",one_result:"[COUNT] result for [SEARCH_TERM]",alt_search:"No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead",search_suggestion:"No results for [SEARCH_TERM]. Try one of the following searches:",searching:"Searching for [SEARCH_TERM]..."},jr={thanks_to:Hr,comments:Fr,direction:Nr,strings:Or};var Ft={};y(Ft,{comments:()=>Ur,default:()=>Pr,direction:()=>Dr,strings:()=>Ir,thanks_to:()=>zr});var zr="Pablo Villaverde ",Ur="",Dr="ltr",Ir={placeholder:"Buscar",clear_search:"Limpiar",load_more:"Ver m\xE1s resultados",search_label:"Buscar en este sitio",filters_label:"Filtros",zero_results:"No se encontraron resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"No se encontraron resultados para [SEARCH_TERM]. Mostrando en su lugar resultados para [DIFFERENT_TERM]",search_suggestion:"No se encontraron resultados para [SEARCH_TERM]. Prueba una de las siguientes b\xFAsquedas:",searching:"Buscando [SEARCH_TERM]..."},Pr={thanks_to:zr,comments:Ur,direction:Dr,strings:Ir};var Nt={};y(Nt,{comments:()=>qr,default:()=>Wr,direction:()=>Br,strings:()=>Vr,thanks_to:()=>Lr});var Lr="Ali Khaleqi Yekta ",qr="",Br="rtl",Vr={placeholder:"\u062C\u0633\u062A\u062C\u0648",clear_search:"\u067E\u0627\u06A9\u0633\u0627\u0632\u06CC",load_more:"\u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u0646\u062A\u0627\u06CC\u062C \u0628\u06CC\u0634\u062A\u0631",search_label:"\u062C\u0633\u062A\u062C\u0648 \u062F\u0631 \u0633\u0627\u06CC\u062A",filters_label:"\u0641\u06CC\u0644\u062A\u0631\u0647\u0627",zero_results:"\u0646\u062A\u06CC\u062C\u0647\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC [SEARCH_TERM] \u06CC\u0627\u0641\u062A \u0646\u0634\u062F",many_results:"[COUNT] \u0646\u062A\u06CC\u062C\u0647 \u0628\u0631\u0627\u06CC [SEARCH_TERM] \u06CC\u0627\u0641\u062A \u0634\u062F",one_result:"[COUNT] \u0646\u062A\u06CC\u062C\u0647 \u0628\u0631\u0627\u06CC [SEARCH_TERM] \u06CC\u0627\u0641\u062A \u0634\u062F",alt_search:"\u0646\u062A\u06CC\u062C\u0647\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC [SEARCH_TERM] \u06CC\u0627\u0641\u062A \u0646\u0634\u062F. \u062F\u0631 \u0639\u0648\u0636 \u0646\u062A\u0627\u06CC\u062C \u0628\u0631\u0627\u06CC [DIFFERENT_TERM] \u0646\u0645\u0627\u06CC\u0634 \u062F\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F",search_suggestion:"\u0646\u062A\u06CC\u062C\u0647\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC [SEARCH_TERM] \u06CC\u0627\u0641\u062A \u0646\u0634\u062F. \u06CC\u06A9\u06CC \u0627\u0632 \u062C\u0633\u062A\u062C\u0648\u0647\u0627\u06CC \u0632\u06CC\u0631 \u0631\u0627 \u0627\u0645\u062A\u062D\u0627\u0646 \u06A9\u0646\u06CC\u062F:",searching:"\u062F\u0631 \u062D\u0627\u0644 \u062C\u0633\u062A\u062C\u0648\u06CC [SEARCH_TERM]..."},Wr={thanks_to:Lr,comments:qr,direction:Br,strings:Vr};var Ot={};y(Ot,{comments:()=>Kr,default:()=>Zr,direction:()=>Jr,strings:()=>Yr,thanks_to:()=>Gr});var Gr="Valtteri Laitinen ",Kr="",Jr="ltr",Yr={placeholder:"Haku",clear_search:"Tyhjenn\xE4",load_more:"Lataa lis\xE4\xE4 tuloksia",search_label:"Hae t\xE4lt\xE4 sivustolta",filters_label:"Suodattimet",zero_results:"Ei tuloksia haulle [SEARCH_TERM]",many_results:"[COUNT] tulosta haulle [SEARCH_TERM]",one_result:"[COUNT] tulos haulle [SEARCH_TERM]",alt_search:"Ei tuloksia haulle [SEARCH_TERM]. N\xE4ytet\xE4\xE4n tulokset sen sijaan haulle [DIFFERENT_TERM]",search_suggestion:"Ei tuloksia haulle [SEARCH_TERM]. Kokeile jotain seuraavista:",searching:"Haetaan [SEARCH_TERM]..."},Zr={thanks_to:Gr,comments:Kr,direction:Jr,strings:Yr};var jt={};y(jt,{comments:()=>Qr,default:()=>el,direction:()=>xr,strings:()=>$r,thanks_to:()=>Xr});var Xr="Nicolas Friedli ",Qr="",xr="ltr",$r={placeholder:"Rechercher",clear_search:"Nettoyer",load_more:"Charger plus de r\xE9sultats",search_label:"Recherche sur ce site",filters_label:"Filtres",zero_results:"Pas de r\xE9sultat pour [SEARCH_TERM]",many_results:"[COUNT] r\xE9sultats pour [SEARCH_TERM]",one_result:"[COUNT] r\xE9sultat pour [SEARCH_TERM]",alt_search:"Pas de r\xE9sultat pour [SEARCH_TERM]. Montre les r\xE9sultats pour [DIFFERENT_TERM] \xE0 la place",search_suggestion:"Pas de r\xE9sultat pour [SEARCH_TERM]. Essayer une des recherches suivantes:",searching:"Recherche [SEARCH_TERM]..."},el={thanks_to:Xr,comments:Qr,direction:xr,strings:$r};var zt={};y(zt,{comments:()=>nl,default:()=>ll,direction:()=>sl,strings:()=>rl,thanks_to:()=>tl});var tl="Pablo Villaverde ",nl="",sl="ltr",rl={placeholder:"Buscar",clear_search:"Limpar",load_more:"Ver m\xE1is resultados",search_label:"Buscar neste sitio",filters_label:"Filtros",zero_results:"Non se atoparon resultados para [SEARCH_TERM]",many_results:"[COUNT] resultados atopados para [SEARCH_TERM]",one_result:"[COUNT] resultado atopado para [SEARCH_TERM]",alt_search:"Non se atoparon resultados para [SEARCH_TERM]. Amosando no seu lugar resultados para [DIFFERENT_TERM]",search_suggestion:"Non se atoparon resultados para [SEARCH_TERM]. Probe unha das seguintes pesquisas:",searching:"Buscando [SEARCH_TERM]..."},ll={thanks_to:tl,comments:nl,direction:sl,strings:rl};var Ut={};y(Ut,{comments:()=>al,default:()=>cl,direction:()=>ol,strings:()=>ul,thanks_to:()=>il});var il="Nir Tamir ",al="",ol="rtl",ul={placeholder:"\u05D7\u05D9\u05E4\u05D5\u05E9",clear_search:"\u05E0\u05D9\u05E7\u05D5\u05D9",load_more:"\u05E2\u05D5\u05D3 \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA",search_label:"\u05D7\u05D9\u05E4\u05D5\u05E9 \u05D1\u05D0\u05EA\u05E8 \u05D6\u05D4",filters_label:"\u05DE\u05E1\u05E0\u05E0\u05D9\u05DD",zero_results:"\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 [SEARCH_TERM]",many_results:"\u05E0\u05DE\u05E6\u05D0\u05D5 [COUNT] \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 [SEARCH_TERM]",one_result:"\u05E0\u05DE\u05E6\u05D0\u05D4 \u05EA\u05D5\u05E6\u05D0\u05D4 \u05D0\u05D7\u05EA \u05E2\u05D1\u05D5\u05E8 [SEARCH_TERM]",alt_search:"\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 [SEARCH_TERM]. \u05DE\u05D5\u05E6\u05D2\u05D5\u05EA \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 [DIFFERENT_TERM]",search_suggestion:"\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D5 \u05EA\u05D5\u05E6\u05D0\u05D5\u05EA \u05E2\u05D1\u05D5\u05E8 [SEARCH_TERM]. \u05E0\u05E1\u05D5 \u05D0\u05D7\u05D3 \u05DE\u05D4\u05D7\u05D9\u05E4\u05D5\u05E9\u05D9\u05DD \u05D4\u05D1\u05D0\u05D9\u05DD:",searching:"\u05DE\u05D7\u05E4\u05E9 \u05D0\u05EA [SEARCH_TERM]..."},cl={thanks_to:il,comments:al,direction:ol,strings:ul};var Dt={};y(Dt,{comments:()=>fl,default:()=>ml,direction:()=>dl,strings:()=>hl,thanks_to:()=>_l});var _l="Amit Yadav ",fl="",dl="ltr",hl={placeholder:"\u0916\u094B\u091C\u0947\u0902",clear_search:"\u0938\u093E\u092B \u0915\u0930\u0947\u0902",load_more:"\u0914\u0930 \u0905\u0927\u093F\u0915 \u092A\u0930\u093F\u0923\u093E\u092E \u0932\u094B\u0921 \u0915\u0930\u0947\u0902",search_label:"\u0907\u0938 \u0938\u093E\u0907\u091F \u092E\u0947\u0902 \u0916\u094B\u091C\u0947\u0902",filters_label:"\u092B\u093C\u093F\u0932\u094D\u091F\u0930",zero_results:"\u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E",many_results:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u0947",one_result:"[COUNT] \u092A\u0930\u093F\u0923\u093E\u092E [SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u092E\u093F\u0932\u093E",alt_search:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0907\u0938\u0915\u0947 \u092C\u091C\u093E\u092F [DIFFERENT_TERM] \u0915\u0947 \u0932\u093F\u090F \u092A\u0930\u093F\u0923\u093E\u092E \u0926\u093F\u0916\u093E \u0930\u0939\u093E \u0939\u0948",search_suggestion:"[SEARCH_TERM] \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u092A\u0930\u093F\u0923\u093E\u092E \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u0928\u093F\u092E\u094D\u0928\u0932\u093F\u0916\u093F\u0924 \u0916\u094B\u091C\u094B\u0902 \u092E\u0947\u0902 \u0938\u0947 \u0915\u094B\u0908 \u090F\u0915 \u0906\u091C\u093C\u092E\u093E\u090F\u0902:",searching:"[SEARCH_TERM] \u0915\u0940 \u0916\u094B\u091C \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948..."},ml={thanks_to:_l,comments:fl,direction:dl,strings:hl};var It={};y(It,{comments:()=>gl,default:()=>bl,direction:()=>El,strings:()=>Rl,thanks_to:()=>pl});var pl="Diomed ",gl="",El="ltr",Rl={placeholder:"Tra\u017Ei",clear_search:"O\u010Disti",load_more:"U\u010Ditaj vi\u0161e rezultata",search_label:"Pretra\u017Ei ovu stranicu",filters_label:"Filteri",zero_results:"Nema rezultata za [SEARCH_TERM]",many_results:"[COUNT] rezultata za [SEARCH_TERM]",one_result:"[COUNT] rezultat za [SEARCH_TERM]",alt_search:"Nema rezultata za [SEARCH_TERM]. Prikazujem rezultate za [DIFFERENT_TERM]",search_suggestion:"Nema rezultata za [SEARCH_TERM]. Poku\u0161aj s jednom od ovih pretraga:",searching:"Pretra\u017Eujem [SEARCH_TERM]..."},bl={thanks_to:pl,comments:gl,direction:El,strings:Rl};var Pt={};y(Pt,{comments:()=>Cl,default:()=>yl,direction:()=>kl,strings:()=>Sl,thanks_to:()=>Tl});var Tl="Adam Laki ",Cl="",kl="ltr",Sl={placeholder:"Keres\xE9s",clear_search:"T\xF6rl\xE9s",load_more:"Tov\xE1bbi tal\xE1latok bet\xF6lt\xE9se",search_label:"Keres\xE9s az oldalon",filters_label:"Sz\u0171r\xE9s",zero_results:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",many_results:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",one_result:"[COUNT] db tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre",alt_search:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Tal\xE1latok mutat\xE1sa ink\xE1bb a(z) [DIFFERENT_TERM] kifejez\xE9sre",search_suggestion:"Nincs tal\xE1lat a(z) [SEARCH_TERM] kifejez\xE9sre. Pr\xF3b\xE1ld meg a k\xF6vetkez\u0151 keres\xE9sek egyik\xE9t:",searching:"Keres\xE9s a(z) [SEARCH_TERM] kifejez\xE9sre..."},yl={thanks_to:Tl,comments:Cl,direction:kl,strings:Sl};var Lt={};y(Lt,{comments:()=>Al,default:()=>Hl,direction:()=>vl,strings:()=>wl,thanks_to:()=>Ml});var Ml="Nixentric",Al="",vl="ltr",wl={placeholder:"Cari",clear_search:"Bersihkan",load_more:"Muat lebih banyak hasil",search_label:"Telusuri situs ini",filters_label:"Filter",zero_results:"[SEARCH_TERM] tidak ditemukan",many_results:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",one_result:"Ditemukan [COUNT] hasil untuk [SEARCH_TERM]",alt_search:"[SEARCH_TERM] tidak ditemukan. Menampilkan hasil [DIFFERENT_TERM] sebagai gantinya",search_suggestion:"[SEARCH_TERM] tidak ditemukan. Coba salah satu pencarian berikut ini:",searching:"Mencari [SEARCH_TERM]..."},Hl={thanks_to:Ml,comments:Al,direction:vl,strings:wl};var qt={};y(qt,{comments:()=>Nl,default:()=>zl,direction:()=>Ol,strings:()=>jl,thanks_to:()=>Fl});var Fl="Cosette Bruhns Alonso, Andrew Janco ",Nl="",Ol="ltr",jl={placeholder:"Cerca",clear_search:"Cancella la cronologia",load_more:"Mostra pi\xF9 risultati",search_label:"Cerca nel sito",filters_label:"Filtri di ricerca",zero_results:"Nessun risultato per [SEARCH_TERM]",many_results:"[COUNT] risultati per [SEARCH_TERM]",one_result:"[COUNT] risultato per [SEARCH_TERM]",alt_search:"Nessun risultato per [SEARCH_TERM]. Mostrando risultati per [DIFFERENT_TERM] come alternativa.",search_suggestion:"Nessun risultato per [SEARCH_TERM]. Prova una delle seguenti ricerche:",searching:"Cercando [SEARCH_TERM]..."},zl={thanks_to:Fl,comments:Nl,direction:Ol,strings:jl};var Bt={};y(Bt,{comments:()=>Dl,default:()=>Ll,direction:()=>Il,strings:()=>Pl,thanks_to:()=>Ul});var Ul="Tate",Dl="",Il="ltr",Pl={placeholder:"\u691C\u7D22",clear_search:"\u30AF\u30EA\u30A2",load_more:"\u6B21\u3092\u8AAD\u307F\u8FBC\u3080",search_label:"\u3053\u306E\u30B5\u30A4\u30C8\u3092\u691C\u7D22",filters_label:"\u30D5\u30A3\u30EB\u30BF",zero_results:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u60C5\u5831\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F",many_results:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",one_result:"[SEARCH_TERM]\u306E[COUNT]\u4EF6\u306E\u691C\u7D22\u7D50\u679C",alt_search:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u60C5\u5831\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002[DIFFERENT_TERM]\u306E\u691C\u7D22\u7D50\u679C\u3092\u8868\u793A\u3057\u3066\u3044\u307E\u3059",search_suggestion:"[SEARCH_TERM]\u306E\u691C\u7D22\u306B\u4E00\u81F4\u3059\u308B\u60C5\u5831\u306F\u3042\u308A\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u6B21\u306E\u3044\u305A\u308C\u304B\u306E\u691C\u7D22\u3092\u8A66\u3057\u3066\u304F\u3060\u3055\u3044",searching:"[SEARCH_TERM]\u3092\u691C\u7D22\u3057\u3066\u3044\u307E\u3059"},Ll={thanks_to:Ul,comments:Dl,direction:Il,strings:Pl};var Vt={};y(Vt,{comments:()=>Bl,default:()=>Gl,direction:()=>Vl,strings:()=>Wl,thanks_to:()=>ql});var ql="Seokho Son ",Bl="",Vl="ltr",Wl={placeholder:"\uAC80\uC0C9\uC5B4",clear_search:"\uBE44\uC6B0\uAE30",load_more:"\uAC80\uC0C9 \uACB0\uACFC \uB354 \uBCF4\uAE30",search_label:"\uC0AC\uC774\uD2B8 \uAC80\uC0C9",filters_label:"\uD544\uD130",zero_results:"[SEARCH_TERM]\uC5D0 \uB300\uD55C \uACB0\uACFC \uC5C6\uC74C",many_results:"[SEARCH_TERM]\uC5D0 \uB300\uD55C \uACB0\uACFC [COUNT]\uAC74",one_result:"[SEARCH_TERM]\uC5D0 \uB300\uD55C \uACB0\uACFC [COUNT]\uAC74",alt_search:"[SEARCH_TERM]\uC5D0 \uB300\uD55C \uACB0\uACFC \uC5C6\uC74C. [DIFFERENT_TERM]\uC5D0 \uB300\uD55C \uACB0\uACFC",search_suggestion:"[SEARCH_TERM]\uC5D0 \uB300\uD55C \uACB0\uACFC \uC5C6\uC74C. \uCD94\uCC9C \uAC80\uC0C9\uC5B4: ",searching:"[SEARCH_TERM] \uAC80\uC0C9 \uC911..."},Gl={thanks_to:ql,comments:Bl,direction:Vl,strings:Wl};var Wt={};y(Wt,{comments:()=>Jl,default:()=>Xl,direction:()=>Yl,strings:()=>Zl,thanks_to:()=>Kl});var Kl="",Jl="",Yl="ltr",Zl={placeholder:"Rapu",clear_search:"Whakakore",load_more:"Whakauta \u0113tahi otinga k\u0113",search_label:"Rapu",filters_label:"T\u0101tari",zero_results:"Otinga kore ki [SEARCH_TERM]",many_results:"[COUNT] otinga ki [SEARCH_TERM]",one_result:"[COUNT] otinga ki [SEARCH_TERM]",alt_search:"Otinga kore ki [SEARCH_TERM]. Otinga k\u0113 ki [DIFFERENT_TERM]",search_suggestion:"Otinga kore ki [SEARCH_TERM]. whakam\u0101tau ki ng\u0101 mea atu:",searching:"Rapu ki [SEARCH_TERM]..."},Xl={thanks_to:Kl,comments:Jl,direction:Yl,strings:Zl};var Gt={};y(Gt,{comments:()=>xl,default:()=>ti,direction:()=>$l,strings:()=>ei,thanks_to:()=>Ql});var Ql="Paul van Brouwershaven",xl="",$l="ltr",ei={placeholder:"Zoeken",clear_search:"Reset",load_more:"Meer resultaten laden",search_label:"Doorzoek deze site",filters_label:"Filters",zero_results:"Geen resultaten voor [SEARCH_TERM]",many_results:"[COUNT] resultaten voor [SEARCH_TERM]",one_result:"[COUNT] resultaat voor [SEARCH_TERM]",alt_search:"Geen resultaten voor [SEARCH_TERM]. In plaats daarvan worden resultaten voor [DIFFERENT_TERM] weergegeven",search_suggestion:"Geen resultaten voor [SEARCH_TERM]. Probeer een van de volgende zoekopdrachten:",searching:"Zoeken naar [SEARCH_TERM]..."},ti={thanks_to:Ql,comments:xl,direction:$l,strings:ei};var Kt={};y(Kt,{comments:()=>si,default:()=>ii,direction:()=>ri,strings:()=>li,thanks_to:()=>ni});var ni="Christopher Wingate",si="",ri="ltr",li={placeholder:"S\xF8k",clear_search:"Fjern",load_more:"Last flere resultater",search_label:"S\xF8k p\xE5 denne siden",filters_label:"Filtre",zero_results:"Ingen resultater for [SEARCH_TERM]",many_results:"[COUNT] resultater for [SEARCH_TERM]",one_result:"[COUNT] resultat for [SEARCH_TERM]",alt_search:"Ingen resultater for [SEARCH_TERM]. Viser resultater for [DIFFERENT_TERM] i stedet",search_suggestion:"Ingen resultater for [SEARCH_TERM]. Pr\xF8v en av disse s\xF8keordene i stedet:",searching:"S\xF8ker etter [SEARCH_TERM]"},ii={thanks_to:ni,comments:si,direction:ri,strings:li};var Jt={};y(Jt,{comments:()=>oi,default:()=>_i,direction:()=>ui,strings:()=>ci,thanks_to:()=>ai});var ai="",oi="",ui="ltr",ci={placeholder:"Szukaj",clear_search:"Wyczy\u015B\u0107",load_more:"Za\u0142aduj wi\u0119cej",search_label:"Przeszukaj t\u0119 stron\u0119",filters_label:"Filtry",zero_results:"Brak wynik\xF3w dla [SEARCH_TERM]",many_results:"[COUNT] wynik\xF3w dla [SEARCH_TERM]",one_result:"[COUNT] wynik dla [SEARCH_TERM]",alt_search:"Brak wynik\xF3w dla [SEARCH_TERM]. Wy\u015Bwietlam wyniki dla [DIFFERENT_TERM]",search_suggestion:"Brak wynik\xF3w dla [SEARCH_TERM]. Pokrewne wyniki wyszukiwania:",searching:"Szukam [SEARCH_TERM]..."},_i={thanks_to:ai,comments:oi,direction:ui,strings:ci};var Yt={};y(Yt,{comments:()=>di,default:()=>pi,direction:()=>hi,strings:()=>mi,thanks_to:()=>fi});var fi="Jonatah",di="",hi="ltr",mi={placeholder:"Pesquisar",clear_search:"Limpar",load_more:"Ver mais resultados",search_label:"Pesquisar",filters_label:"Filtros",zero_results:"Nenhum resultado encontrado para [SEARCH_TERM]",many_results:"[COUNT] resultados encontrados para [SEARCH_TERM]",one_result:"[COUNT] resultado encontrado para [SEARCH_TERM]",alt_search:"Nenhum resultado encontrado para [SEARCH_TERM]. Exibindo resultados para [DIFFERENT_TERM]",search_suggestion:"Nenhum resultado encontrado para [SEARCH_TERM]. Tente uma das seguintes pesquisas:",searching:"Pesquisando por [SEARCH_TERM]..."},pi={thanks_to:fi,comments:di,direction:hi,strings:mi};var Zt={};y(Zt,{comments:()=>Ei,default:()=>Ti,direction:()=>Ri,strings:()=>bi,thanks_to:()=>gi});var gi="Bogdan Mateescu ",Ei="",Ri="ltr",bi={placeholder:"C\u0103utare",clear_search:"\u015Eterge\u0163i",load_more:"\xCEnc\u0103rca\u021Bi mai multe rezultate",search_label:"C\u0103uta\u021Bi \xEEn acest site",filters_label:"Filtre",zero_results:"Niciun rezultat pentru [SEARCH_TERM]",many_results:"[COUNT] rezultate pentru [SEARCH_TERM]",one_result:"[COUNT] rezultat pentru [SEARCH_TERM]",alt_search:"Niciun rezultat pentru [SEARCH_TERM]. Se afi\u0219eaz\u0103 \xEEn schimb rezultatele pentru [DIFFERENT_TERM]",search_suggestion:"Niciun rezultat pentru [SEARCH_TERM]. \xCEncerca\u021Bi una dintre urm\u0103toarele c\u0103ut\u0103ri:",searching:"Se caut\u0103 dup\u0103: [SEARCH_TERM]..."},Ti={thanks_to:gi,comments:Ei,direction:Ri,strings:bi};var Xt={};y(Xt,{comments:()=>ki,default:()=>Mi,direction:()=>Si,strings:()=>yi,thanks_to:()=>Ci});var Ci="Aleksandr Gordeev",ki="",Si="ltr",yi={placeholder:"\u041F\u043E\u0438\u0441\u043A",clear_search:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u043B\u0435",load_more:"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0435\u0449\u0435",search_label:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0441\u0430\u0439\u0442\u0443",filters_label:"\u0424\u0438\u043B\u044C\u0442\u0440\u044B",zero_results:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u043E\u0432 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]",alt_search:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043A\u0430\u0437\u0430\u043D\u044B \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [DIFFERENT_TERM]",search_suggestion:"\u041D\u0438\u0447\u0435\u0433\u043E \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]. \u041F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0438\u0437 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0445 \u0432\u0430\u0440\u0438\u0430\u043D\u0442\u043E\u0432",searching:"\u041F\u043E\u0438\u0441\u043A \u043F\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0443: [SEARCH_TERM]"},Mi={thanks_to:Ci,comments:ki,direction:Si,strings:yi};var Qt={};y(Qt,{comments:()=>vi,default:()=>Fi,direction:()=>wi,strings:()=>Hi,thanks_to:()=>Ai});var Ai="Andrija Sagicc",vi="",wi="ltr",Hi={placeholder:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430",clear_search:"\u0411\u0440\u0438\u0441\u0430\u045A\u0435",load_more:"\u041F\u0440\u0438\u043A\u0430\u0437 \u0432\u0438\u0448\u0435 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430",search_label:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0441\u0430\u0458\u0442\u0430",filters_label:"\u0424\u0438\u043B\u0442\u0435\u0440\u0438",zero_results:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]",alt_search:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u0440\u0438\u043A\u0430\u0437 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u043A \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [DIFFERENT_TERM]",search_suggestion:"\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u0437\u0430 [SEARCH_TERM]. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0441\u0430 \u043D\u0435\u043A\u043E\u043C \u043E\u0434 \u0441\u043B\u0435\u0434\u0435\u045B\u0438\u0445 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0430:",searching:"\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u0442\u0435\u0440\u043C\u0438\u043D\u0430 [SEARCH_TERM]..."},Fi={thanks_to:Ai,comments:vi,direction:wi,strings:Hi};var xt={};y(xt,{comments:()=>Oi,default:()=>Ui,direction:()=>ji,strings:()=>zi,thanks_to:()=>Ni});var Ni="Montazar Al-Jaber ",Oi="",ji="ltr",zi={placeholder:"S\xF6k",clear_search:"Rensa",load_more:"Visa fler tr\xE4ffar",search_label:"S\xF6k p\xE5 denna sida",filters_label:"Filter",zero_results:"[SEARCH_TERM] gav inga tr\xE4ffar",many_results:"[SEARCH_TERM] gav [COUNT] tr\xE4ffar",one_result:"[SEARCH_TERM] gav [COUNT] tr\xE4ff",alt_search:"[SEARCH_TERM] gav inga tr\xE4ffar. Visar resultat f\xF6r [DIFFERENT_TERM] ist\xE4llet",search_suggestion:"[SEARCH_TERM] gav inga tr\xE4ffar. F\xF6rs\xF6k igen med en av f\xF6ljande s\xF6kord:",searching:"S\xF6ker efter [SEARCH_TERM]..."},Ui={thanks_to:Ni,comments:Oi,direction:ji,strings:zi};var $t={};y($t,{comments:()=>Ii,default:()=>qi,direction:()=>Pi,strings:()=>Li,thanks_to:()=>Di});var Di="Anonymous",Ii="",Pi="ltr",Li={placeholder:"Tafuta",clear_search:"Futa",load_more:"Pakia matokeo zaidi",search_label:"Tafuta tovuti hii",filters_label:"Vichujio",zero_results:"Hakuna matokeo ya [SEARCH_TERM]",many_results:"Matokeo [COUNT] ya [SEARCH_TERM]",one_result:"Tokeo [COUNT] la [SEARCH_TERM]",alt_search:"Hakuna mayokeo ya [SEARCH_TERM]. Badala yake, inaonyesha matokeo ya [DIFFERENT_TERM]",search_suggestion:"Hakuna matokeo ya [SEARCH_TERM]. Jaribu mojawapo ya utafutaji ufuatao:",searching:"Kutafuta [SEARCH_TERM]..."},qi={thanks_to:Di,comments:Ii,direction:Pi,strings:Li};var en={};y(en,{comments:()=>Vi,default:()=>Ki,direction:()=>Wi,strings:()=>Gi,thanks_to:()=>Bi});var Bi="",Vi="",Wi="ltr",Gi={placeholder:"\u0BA4\u0BC7\u0B9F\u0BC1\u0B95",clear_search:"\u0B85\u0BB4\u0BBF\u0B95\u0BCD\u0B95\u0BC1\u0B95",load_more:"\u0BAE\u0BC7\u0BB2\u0BC1\u0BAE\u0BCD \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BC8\u0B95\u0BCD \u0B95\u0BBE\u0B9F\u0BCD\u0B9F\u0BC1\u0B95",search_label:"\u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BB3\u0BA4\u0BCD\u0BA4\u0BBF\u0BB2\u0BCD \u0BA4\u0BC7\u0B9F\u0BC1\u0B95",filters_label:"\u0BB5\u0B9F\u0BBF\u0B95\u0B9F\u0BCD\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BCD",zero_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8",many_results:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 [COUNT] \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD",one_result:"[SEARCH_TERM] \u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1",alt_search:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD\u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8, \u0B87\u0BA8\u0BCD\u0BA4 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0B92\u0BA4\u0BCD\u0BA4 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD [DIFFERENT_TERM]",search_suggestion:"[SEARCH_TERM] \u0B87\u0BA4\u0BCD \u0BA4\u0BC7\u0B9F\u0BB2\u0BC1\u0B95\u0BCD\u0B95\u0BBE\u0BA9 \u0BAE\u0BC1\u0B9F\u0BBF\u0BB5\u0BC1\u0B95\u0BB3\u0BCD \u0B87\u0BB2\u0BCD\u0BB2\u0BC8.\u0B87\u0BA4\u0BB1\u0BCD\u0B95\u0BC1 \u0BAA\u0BA4\u0BBF\u0BB2\u0BC0\u0B9F\u0BBE\u0BA9 \u0BA4\u0BC7\u0B9F\u0BB2\u0BCD\u0B95\u0BB3\u0BC8 \u0BA4\u0BC7\u0B9F\u0BC1\u0B95:",searching:"[SEARCH_TERM] \u0BA4\u0BC7\u0B9F\u0BAA\u0BCD\u0BAA\u0B9F\u0BC1\u0B95\u0BBF\u0BA9\u0BCD\u0BB1\u0BA4\u0BC1"},Ki={thanks_to:Bi,comments:Vi,direction:Wi,strings:Gi};var tn={};y(tn,{comments:()=>Yi,default:()=>Qi,direction:()=>Zi,strings:()=>Xi,thanks_to:()=>Ji});var Ji="Taylan \xD6zg\xFCr Bildik",Yi="",Zi="ltr",Xi={placeholder:"Ara\u015Ft\u0131r",clear_search:"Temizle",load_more:"Daha fazla sonu\xE7",search_label:"Site genelinde arama",filters_label:"Filtreler",zero_results:"[SEARCH_TERM] i\xE7in sonu\xE7 yok",many_results:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",one_result:"[SEARCH_TERM] i\xE7in [COUNT] sonu\xE7 bulundu",alt_search:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Bunun yerine [DIFFERENT_TERM] i\xE7in sonu\xE7lar g\xF6steriliyor",search_suggestion:"[SEARCH_TERM] i\xE7in sonu\xE7 yok. Alternatif olarak a\u015Fa\u011F\u0131daki kelimelerden birini deneyebilirsiniz:",searching:"[SEARCH_TERM] ara\u015Ft\u0131r\u0131l\u0131yor..."},Qi={thanks_to:Ji,comments:Yi,direction:Zi,strings:Xi};var nn={};y(nn,{comments:()=>$i,default:()=>na,direction:()=>ea,strings:()=>ta,thanks_to:()=>xi});var xi="Vladyslav Lyshenko ",$i="",ea="ltr",ta={placeholder:"\u041F\u043E\u0448\u0443\u043A",clear_search:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u043F\u043E\u043B\u0435",load_more:"\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0449\u0435",search_label:"\u041F\u043E\u0448\u0443\u043A \u043F\u043E \u0441\u0430\u0439\u0442\u0443",filters_label:"\u0424\u0456\u043B\u044C\u0442\u0440\u0438",zero_results:"\u041D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0437\u0430 \u0437\u0430\u043F\u0438\u0442\u043E\u043C: [SEARCH_TERM]",many_results:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0456\u0432 \u043D\u0430 \u0437\u0430\u043F\u0438\u0442: [SEARCH_TERM]",one_result:"[COUNT] \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u0437\u0430 \u0437\u0430\u043F\u0438\u0442\u043E\u043C: [SEARCH_TERM]",alt_search:"\u041D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u0430 \u0437\u0430\u043F\u0438\u0442: [SEARCH_TERM]. \u041F\u043E\u043A\u0430\u0437\u0430\u043D\u043E \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0438 \u043D\u0430 \u0437\u0430\u043F\u0438\u0442: [DIFFERENT_TERM]",search_suggestion:"\u041D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u0430 \u0437\u0430\u043F\u0438\u0442: [SEARCH_TERM]. \u0421\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u043E\u0434\u0438\u043D \u0456\u0437 \u0442\u0430\u043A\u0438\u0445 \u0432\u0430\u0440\u0456\u0430\u043D\u0442\u0456\u0432",searching:"\u041F\u043E\u0448\u0443\u043A \u0437\u0430 \u0437\u0430\u043F\u0438\u0442\u043E\u043C: [SEARCH_TERM]"},na={thanks_to:xi,comments:$i,direction:ea,strings:ta};var sn={};y(sn,{comments:()=>ra,default:()=>aa,direction:()=>la,strings:()=>ia,thanks_to:()=>sa});var sa="Long Nhat Nguyen",ra="",la="ltr",ia={placeholder:"T\xECm ki\u1EBFm",clear_search:"X\xF3a",load_more:"Nhi\u1EC1u k\u1EBFt qu\u1EA3 h\u01A1n",search_label:"T\xECm ki\u1EBFm trong trang n\xE0y",filters_label:"B\u1ED9 l\u1ECDc",zero_results:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",many_results:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",one_result:"[COUNT] k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]",alt_search:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Ki\u1EC3m th\u1ECB k\u1EBFt qu\u1EA3 thay th\u1EBF v\u1EDBi [DIFFERENT_TERM]",search_suggestion:"Kh\xF4ng t\xECm th\u1EA5y k\u1EBFt qu\u1EA3 cho [SEARCH_TERM]. Th\u1EED m\u1ED9t trong c\xE1c t\xECm ki\u1EBFm:",searching:"\u0110ang t\xECm ki\u1EBFm cho [SEARCH_TERM]..."},aa={thanks_to:sa,comments:ra,direction:la,strings:ia};var rn={};y(rn,{comments:()=>ua,default:()=>fa,direction:()=>ca,strings:()=>_a,thanks_to:()=>oa});var oa="Amber Song",ua="",ca="ltr",_a={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},fa={thanks_to:oa,comments:ua,direction:ca,strings:_a};var ln={};y(ln,{comments:()=>ha,default:()=>ga,direction:()=>ma,strings:()=>pa,thanks_to:()=>da});var da="Amber Song",ha="",ma="ltr",pa={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F09\u66F4\u591A\u7D50\u679C",search_label:"\u7AD9\u5167\u641C\u7D22",filters_label:"\u7BE9\u9078",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",many_results:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",one_result:"\u627E\u5230 [COUNT] \u500B [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u6539\u70BA\u986F\u793A [DIFFERENT_TERM] \u7684\u76F8\u95DC\u7D50\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u95DC\u7D50\u679C\u3002\u8ACB\u5617\u8A66\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},ga={thanks_to:da,comments:ha,direction:ma,strings:pa};var an={};y(an,{comments:()=>Ra,default:()=>Ca,direction:()=>ba,strings:()=>Ta,thanks_to:()=>Ea});var Ea="Amber Song",Ra="",ba="ltr",Ta={placeholder:"\u641C\u7D22",clear_search:"\u6E05\u9664",load_more:"\u52A0\u8F7D\u66F4\u591A\u7ED3\u679C",search_label:"\u7AD9\u5185\u641C\u7D22",filters_label:"\u7B5B\u9009",zero_results:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",many_results:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",one_result:"\u627E\u5230 [COUNT] \u4E2A [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C",alt_search:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u6539\u4E3A\u663E\u793A [DIFFERENT_TERM] \u7684\u76F8\u5173\u7ED3\u679C",search_suggestion:"\u672A\u627E\u5230 [SEARCH_TERM] \u7684\u76F8\u5173\u7ED3\u679C\u3002\u8BF7\u5C1D\u8BD5\u4EE5\u4E0B\u641C\u7D22\u3002",searching:"\u6B63\u5728\u641C\u7D22 [SEARCH_TERM]..."},Ca={thanks_to:Ea,comments:Ra,direction:ba,strings:Ta};var ka=[kt,St,yt,Mt,At,vt,wt,Ht,Ft,Nt,Ot,jt,zt,Ut,Dt,It,Pt,Lt,qt,Bt,Vt,Wt,Gt,Kt,Jt,Yt,Zt,Xt,Qt,xt,$t,en,tn,nn,sn,rn,ln,an],ss=ka,rs=["../../translations/af.json","../../translations/ar.json","../../translations/bn.json","../../translations/ca.json","../../translations/cs.json","../../translations/da.json","../../translations/de.json","../../translations/en.json","../../translations/es.json","../../translations/fa.json","../../translations/fi.json","../../translations/fr.json","../../translations/gl.json","../../translations/he.json","../../translations/hi.json","../../translations/hr.json","../../translations/hu.json","../../translations/id.json","../../translations/it.json","../../translations/ja.json","../../translations/ko.json","../../translations/mi.json","../../translations/nl.json","../../translations/no.json","../../translations/pl.json","../../translations/pt.json","../../translations/ro.json","../../translations/ru.json","../../translations/sr.json","../../translations/sv.json","../../translations/sw.json","../../translations/ta.json","../../translations/tr.json","../../translations/uk.json","../../translations/vi.json","../../translations/zh-cn.json","../../translations/zh-tw.json","../../translations/zh.json"];function ls(n,e,t){let s=n.slice();return s[51]=e[t],s}function is(n){let e,t,s;function r(i){n[37](i)}let l={show_empty_filters:n[5],open_filters:n[6],available_filters:n[18],translate:n[20],automatic_translations:n[19],translations:n[7]};return n[0]!==void 0&&(l.selected_filters=n[0]),e=new ns({props:l}),le.push(()=>Mn(e,"selected_filters",r)),{c(){rt(e.$$.fragment)},m(i,a){me(e,i,a),s=!0},p(i,a){let o={};a[0]&32&&(o.show_empty_filters=i[5]),a[0]&64&&(o.open_filters=i[6]),a[0]&262144&&(o.available_filters=i[18]),a[0]&524288&&(o.automatic_translations=i[19]),a[0]&128&&(o.translations=i[7]),!t&&a[0]&1&&(t=!0,o.selected_filters=i[0],Cn(()=>t=!1)),e.$set(o)},i(i){s||(U(e.$$.fragment,i),s=!0)},o(i){P(e.$$.fragment,i),s=!1},d(i){ue(e,i)}}}function as(n){let e,t,s,r,l=[Ma,ya],i=[];function a(o,h){return o[14]?0:1}return t=a(n,[-1,-1]),s=i[t]=l[t](n),{c(){e=C("div"),s.c(),E(e,"class","pagefind-ui__results-area svelte-e9gkc3")},m(o,h){S(o,e,h),i[t].m(e,null),r=!0},p(o,h){let c=t;t=a(o,h),t===c?i[t].p(o,h):(ae(),P(i[c],1,1,()=>{i[c]=null}),oe(),s=i[t],s?s.p(o,h):(s=i[t]=l[t](o),s.c()),U(s,1),s.m(e,null))},i(o){r||(U(s),r=!0)},o(o){P(s),r=!1},d(o){o&&k(e),i[t].d()}}}function ya(n){let e,t,s,r=[],l=new Map,i,a,o;function h(u,f){return u[13].results.length===0?wa:u[13].results.length===1?va:Aa}let c=h(n,[-1,-1]),m=c(n),p=n[13].results.slice(0,n[17]),d=u=>u[51].id;for(let u=0;un[17]&&us(n);return{c(){e=C("p"),m.c(),t=A(),s=C("ol");for(let u=0;uu[17]?_?_.p(u,f):(_=us(u),_.c(),_.m(a.parentNode,a)):_&&(_.d(1),_=null)},i(u){if(!o){for(let f=0;f{o[p]=null}),oe(),r=o[s],r?r.p(e,m):(r=o[s]=a[s](e),r.c()),U(r,1),r.m(l.parentNode,l))},i(c){i||(U(r),i=!0)},o(c){P(r),i=!1},d(c){c&&k(t),o[s].d(c),c&&k(l)}}}function us(n){let e,t=n[20]("load_more",n[19],n[7])+"",s,r,l;return{c(){e=C("button"),s=w(t),E(e,"type","button"),E(e,"class","pagefind-ui__button svelte-e9gkc3")},m(i,a){S(i,e,a),b(e,s),r||(l=J(e,"click",n[22]),r=!0)},p(i,a){a[0]&524416&&t!==(t=i[20]("load_more",i[19],i[7])+"")&&N(s,t)},d(i){i&&k(e),r=!1,l()}}}function cs(n){let e,t=n[20]("searching",n[19],n[7]).replace(/\[SEARCH_TERM\]/,n[16])+"",s;return{c(){e=C("p"),s=w(t),E(e,"class","pagefind-ui__message svelte-e9gkc3")},m(r,l){S(r,e,l),b(e,s)},p(r,l){l[0]&589952&&t!==(t=r[20]("searching",r[19],r[7]).replace(/\[SEARCH_TERM\]/,r[16])+"")&&N(s,t)},d(r){r&&k(e)}}}function Na(n){let e,t,s,r,l,i,a=n[20]("clear_search",n[19],n[7])+"",o,h,c,m,p,d,_,u,f=n[12]&&is(n),T=n[15]&&as(n);return{c(){e=C("div"),t=C("form"),s=C("input"),l=A(),i=C("button"),o=w(a),h=A(),c=C("div"),f&&f.c(),m=A(),T&&T.c(),E(s,"class","pagefind-ui__search-input svelte-e9gkc3"),E(s,"type","text"),E(s,"placeholder",r=n[20]("placeholder",n[19],n[7])),E(s,"autocapitalize","none"),E(s,"enterkeyhint","search"),s.autofocus=n[8],E(i,"class","pagefind-ui__search-clear svelte-e9gkc3"),B(i,"pagefind-ui__suppressed",!n[9]),E(c,"class","pagefind-ui__drawer svelte-e9gkc3"),B(c,"pagefind-ui__hidden",!n[15]),E(t,"class","pagefind-ui__form svelte-e9gkc3"),E(t,"role","search"),E(t,"aria-label",p=n[20]("search_label",n[19],n[7])),E(t,"action","javascript:void(0);"),E(e,"class","pagefind-ui svelte-e9gkc3"),B(e,"pagefind-ui--reset",n[1])},m(R,M){S(R,e,M),b(e,t),b(t,s),pt(s,n[9]),n[34](s),b(t,l),b(t,i),b(i,o),n[35](i),b(t,h),b(t,c),f&&f.m(c,null),b(c,m),T&&T.m(c,null),d=!0,n[8]&&s.focus(),_||(u=[J(s,"focus",n[21]),J(s,"keydown",n[32]),J(s,"input",n[33]),J(i,"click",n[36]),J(t,"submit",Oa)],_=!0)},p(R,M){(!d||M[0]&524416&&r!==(r=R[20]("placeholder",R[19],R[7])))&&E(s,"placeholder",r),(!d||M[0]&256)&&(s.autofocus=R[8]),M[0]&512&&s.value!==R[9]&&pt(s,R[9]),(!d||M[0]&524416)&&a!==(a=R[20]("clear_search",R[19],R[7])+"")&&N(o,a),(!d||M[0]&512)&&B(i,"pagefind-ui__suppressed",!R[9]),R[12]?f?(f.p(R,M),M[0]&4096&&U(f,1)):(f=is(R),f.c(),U(f,1),f.m(c,m)):f&&(ae(),P(f,1,1,()=>{f=null}),oe()),R[15]?T?(T.p(R,M),M[0]&32768&&U(T,1)):(T=as(R),T.c(),U(T,1),T.m(c,null)):T&&(ae(),P(T,1,1,()=>{T=null}),oe()),(!d||M[0]&32768)&&B(c,"pagefind-ui__hidden",!R[15]),(!d||M[0]&524416&&p!==(p=R[20]("search_label",R[19],R[7])))&&E(t,"aria-label",p),(!d||M[0]&2)&&B(e,"pagefind-ui--reset",R[1])},i(R){d||(U(f),U(T),d=!0)},o(R){P(f),P(T),d=!1},d(R){R&&k(e),n[34](null),n[35](null),f&&f.d(),T&&T.d(),_=!1,G(u)}}}var Oa=n=>n.preventDefault();function ja(n,e,t){let s={},r=rs.map(g=>g.match(/([^\/]+)\.json$/)[1]);for(let g=0;gj[g]??F[g]??"";gt(()=>{let g=document?.querySelector?.("html")?.getAttribute?.("lang")||"en",F=lt(g.toLocaleLowerCase());t(19,hn=s[`${F.language}-${F.script}-${F.region}`]||s[`${F.language}-${F.region}`]||s[`${F.language}`]||s.en)}),Et(()=>{H?.destroy?.(),H=null});let mn=async()=>{if(!at&&(t(12,at=!0),!H)){let g;try{g=await import(`${l}pagefind.js`)}catch(j){console.error(j),console.error([`Pagefind couldn't be loaded from ${this.options.bundlePath}pagefind.js`,"You can configure this by passing a bundlePath option to PagefindUI"].join(` +`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}c||t(24,c=h?12:30);let F={...f||{},excerptLength:c};await g.options(F);for(let j of T){if(!j.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let L=j.bundlePath;delete j.bundlePath,await g.mergeIndex(L,j)}H=g,hs()}},hs=async()=>{H&&(dn=await H.filters(),(!ce||!Object.keys(ce).length)&&t(18,ce=dn))},ms=g=>{let F={};return Object.entries(g).filter(([,j])=>j).forEach(([j])=>{let[L,te]=j.split(/:(.*)$/);F[L]=F[L]||[],F[L].push(te)}),F},_e,ps=async(g,F)=>{if(!g){t(15,ut=!1),_e&&clearTimeout(_e);return}let j=ms(F),L=()=>gs(g,j);u>0&&g?(_e&&clearTimeout(_e),_e=setTimeout(L,u),await pn(),H.preload(g,{filters:j})):L(),Es()},pn=async()=>{for(;!H;)mn(),await new Promise(g=>setTimeout(g,50))},gs=async(g,F)=>{t(16,fn=g||""),typeof p=="function"&&(g=p(g)),t(14,ot=!0),t(15,ut=!0),await pn();let j=++_n,L={filters:F};X&&typeof X=="object"&&(L.sort=X);let te=await H.search(g,L);_n===j&&(te.filters&&Object.keys(te.filters)?.length&&t(18,ce=te.filters),t(13,cn=te),t(14,ot=!1),t(17,ct=i))},Es=()=>{let g=W.offsetWidth;g!=fs&&t(10,O.style.paddingRight=`${g+2}px`,O)},Rs=g=>{g?.preventDefault(),t(17,ct+=i)},bs=g=>{g.key==="Escape"&&(t(9,v=""),O.blur()),g.key==="Enter"&&g.preventDefault()};function Ts(){v=this.value,t(9,v),t(23,R)}function Cs(g){le[g?"unshift":"push"](()=>{O=g,t(10,O)})}function ks(g){le[g?"unshift":"push"](()=>{W=g,t(11,W)})}let Ss=()=>{t(9,v=""),O.blur()};function ys(g){V=g,t(0,V)}return n.$$set=g=>{"base_path"in g&&t(25,l=g.base_path),"page_size"in g&&t(26,i=g.page_size),"reset_styles"in g&&t(1,a=g.reset_styles),"show_images"in g&&t(2,o=g.show_images),"show_sub_results"in g&&t(3,h=g.show_sub_results),"excerpt_length"in g&&t(24,c=g.excerpt_length),"process_result"in g&&t(4,m=g.process_result),"process_term"in g&&t(27,p=g.process_term),"show_empty_filters"in g&&t(5,d=g.show_empty_filters),"open_filters"in g&&t(6,_=g.open_filters),"debounce_timeout_ms"in g&&t(28,u=g.debounce_timeout_ms),"pagefind_options"in g&&t(29,f=g.pagefind_options),"merge_index"in g&&t(30,T=g.merge_index),"trigger_search_term"in g&&t(23,R=g.trigger_search_term),"translations"in g&&t(7,M=g.translations),"autofocus"in g&&t(8,D=g.autofocus),"sort"in g&&t(31,X=g.sort),"selected_filters"in g&&t(0,V=g.selected_filters)},n.$$.update=()=>{if(n.$$.dirty[0]&8388608)e:R&&(t(9,v=R),t(23,R=""));if(n.$$.dirty[0]&513)e:ps(v,V)},[V,a,o,h,m,d,_,M,D,v,O,W,at,cn,ot,ut,fn,ct,ce,hn,ds,mn,Rs,R,c,l,i,p,u,f,T,X,bs,Ts,Cs,ks,Ss,ys]}var on=class extends q{constructor(e){super(),Y(this,e,ja,Na,K,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},_s=on;var un;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(un=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{un="/pagefind/"}var it=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",s=e.bundlePath??un,r=e.pageSize??5,l=e.resetStyles??!0,i=e.showImages??!0,a=e.showSubResults??!1,o=e.excerptLength??0,h=e.processResult??null,c=e.processTerm??null,m=e.showEmptyFilters??!0,p=e.openFilters??[],d=e.debounceTimeoutMs??300,_=e.mergeIndex??[],u=e.translations??[],f=e.autofocus??!1,T=e.sort??null;delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.openFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,delete e.autofocus,delete e.sort;let R=t instanceof HTMLElement?t:document.querySelector(t);R?this._pfs=new _s({target:R,props:{base_path:s,page_size:r,reset_styles:l,show_images:i,show_sub_results:a,excerpt_length:o,process_result:h,process_term:c,show_empty_filters:m,open_filters:p,debounce_timeout_ms:d,merge_index:_,translations:u,autofocus:f,sort:T,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}triggerFilters(e){let t={};for(let[s,r]of Object.entries(e))if(Array.isArray(r))for(let l of r)t[`${s}:${l}`]=!0;else t[`${s}:${r}`]=!0;this._pfs.$$set({selected_filters:t})}destroy(){this._pfs.$destroy()}};window.PagefindUI=it;})(); diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind.en_33af6f82b4.pf_meta b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind.en_33af6f82b4.pf_meta new file mode 100644 index 0000000..32af562 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind.en_33af6f82b4.pf_meta differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/pagefind.js b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind.js new file mode 100644 index 0000000..0ea99ad --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/pagefind/pagefind.js @@ -0,0 +1,9 @@ +const pagefind_version="1.2.0";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document!=='undefined'&&document.currentScript!==null){script_src=new URL("UNHANDLED",location.href).toString()}let wasm=undefined;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}let WASM_VECTOR_LEN=0;function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1,1)>>>0;getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret>>>0};const cachedTextEncoder=(typeof TextEncoder!=='undefined'?new TextEncoder('utf-8'):{encode:()=>{throw Error('TextEncoder not available')}});const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length,1)>>>0;getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len,1)>>>0;const mem=getUint8Memory0();let offset=0;for(;offset0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3,1)>>>0;const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written;ptr=realloc(ptr,len,offset,1)>>>0}WASM_VECTOR_LEN=offset;return ptr}__exports.set_ranking_weights=function(ptr,weights){const ptr0=passStringToWasm0(weights,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.set_ranking_weights(ptr,ptr0,len0);return ret>>>0};__exports.load_index_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_index_chunk(ptr,ptr0,len0);return ret>>>0};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret>>>0};__exports.add_synthetic_filter=function(ptr,filter){const ptr0=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.add_synthetic_filter(ptr,ptr0,len0);return ret>>>0};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=(typeof TextDecoder!=='undefined'?new TextDecoder('utf-8',{ignoreBOM:true,fatal:true}):{decode:()=>{throw Error('TextDecoder not available')}});if(typeof TextDecoder!=='undefined'){cachedTextDecoder.decode()};function getStringFromWasm0(ptr,len){ptr=ptr>>>0;return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_indexes=function(ptr,query){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_filter_indexes=function(ptr,filters){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_all_filter_indexes=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.filters=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.search=function(ptr,query,filter,sort,exact){let deferred4_0;let deferred4_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ptr1=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len1=WASM_VECTOR_LEN;const ptr2=passStringToWasm0(sort,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len2=WASM_VECTOR_LEN;wasm.search(retptr,ptr,ptr0,len0,ptr1,len1,ptr2,len2,exact);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred4_0=r0;deferred4_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred4_0,deferred4_1,1)}};async function __wbg_load(module,imports){if(typeof Response==='function'&&module instanceof Response){if(typeof WebAssembly.instantiateStreaming==='function'){try{return await WebAssembly.instantiateStreaming(module,imports)}catch(e){if(module.headers.get('Content-Type')!='application/wasm'){console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",e)}else{throw e}}}const bytes=await module.arrayBuffer();return await WebAssembly.instantiate(bytes,imports)}else{const instance=await WebAssembly.instantiate(module,imports);if(instance instanceof WebAssembly.Instance){return{instance,module}}else{return instance}}}function __wbg_get_imports(){const imports={};imports.wbg={};return imports}function __wbg_init_memory(imports,maybe_memory){}function __wbg_finalize_init(instance,module){wasm=instance.exports;__wbg_init.__wbindgen_wasm_module=module;cachedInt32Memory0=null;cachedUint8Memory0=null;return wasm}function initSync(module){if(wasm!==undefined)return wasm;const imports=__wbg_get_imports();__wbg_init_memory(imports);if(!(module instanceof WebAssembly.Module)){module=new WebAssembly.Module(module)}const instance=new WebAssembly.Instance(module,imports);return __wbg_finalize_init(instance,module)}async function __wbg_init(input){if(wasm!==undefined)return wasm;if(typeof input==='undefined'&&typeof script_src!=='undefined'){input=script_src.replace(/\.js$/,'_bg.wasm')}const imports=__wbg_get_imports();if(typeof input==='string'||(typeof Request==='function'&&input instanceof Request)||(typeof URL==='function'&&input instanceof URL)){input=fetch(input)}__wbg_init_memory(imports);const{instance,module}=await __wbg_load(await input,imports);return __wbg_finalize_init(instance,module)}wasm_bindgen=Object.assign(__wbg_init,{initSync},__exports)})();var u8=Uint8Array;var u16=Uint16Array;var u32=Uint32Array;var fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]);var fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]);var clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var freb=function(eb,start){var b=new u16(31);for(var i2=0;i2<31;++i2){b[i2]=start+=1<>>1|(i&21845)<<1;x=(x&52428)>>>2|(x&13107)<<2;x=(x&61680)>>>4|(x&3855)<<4;rev[i]=((x&65280)>>>8|(x&255)<<8)>>>1}var x;var i;var hMap=function(cd,mb,r){var s=cd.length;var i2=0;var l=new u16(mb);for(;i2>>rvb]=sv}}}}else{co=new u16(s);for(i2=0;i2>>15-cd[i2]}}}return co};var flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;var i;for(i=144;i<256;++i)flt[i]=9;var i;for(i=256;i<280;++i)flt[i]=7;var i;for(i=280;i<288;++i)flt[i]=8;var i;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var i;var flrm=hMap(flt,9,1);var fdrm=hMap(fdt,5,1);var max=function(a){var m=a[0];for(var i2=1;i2m)m=a[i2]}return m};var bits=function(d,p,m){var o=p/8|0;return(d[o]|d[o+1]<<8)>>(p&7)&m};var bits16=function(d,p){var o=p/8|0;return(d[o]|d[o+1]<<8|d[o+2]<<16)>>(p&7)};var shft=function(p){return(p+7)/8|0};var slc=function(v,s,e){if(s==null||s<0)s=0;if(e==null||e>v.length)e=v.length;var n=new(v.BYTES_PER_ELEMENT==2?u16:v.BYTES_PER_ELEMENT==4?u32:u8)(e-s);n.set(v.subarray(s,e));return n};var ec=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"];var err=function(ind,msg,nt){var e=new Error(msg||ec[ind]);e.code=ind;if(Error.captureStackTrace)Error.captureStackTrace(e,err);if(!nt)throw e;return e};var inflt=function(dat,buf,st){var sl=dat.length;if(!sl||st&&st.f&&!st.l)return buf||new u8(0);var noBuf=!buf||st;var noSt=!st||st.i;if(!st)st={};if(!buf)buf=new u8(sl*3);var cbuf=function(l2){var bl=buf.length;if(l2>bl){var nbuf=new u8(Math.max(bl*2,l2));nbuf.set(buf);buf=nbuf}};var final=st.f||0,pos=st.p||0,bt=st.b||0,lm=st.l,dm=st.d,lbt=st.m,dbt=st.n;var tbts=sl*8;do{if(!lm){final=bits(dat,pos,1);var type=bits(dat,pos+1,3);pos+=3;if(!type){var s=shft(pos)+4,l=dat[s-4]|dat[s-3]<<8,t=s+l;if(t>sl){if(noSt)err(0);break}if(noBuf)cbuf(bt+l);buf.set(dat.subarray(s,t),bt);st.b=bt+=l,st.p=pos=t*8,st.f=final;continue}else if(type==1)lm=flrm,dm=fdrm,lbt=9,dbt=5;else if(type==2){var hLit=bits(dat,pos,31)+257,hcLen=bits(dat,pos+10,15)+4;var tl=hLit+bits(dat,pos+5,31)+1;pos+=14;var ldt=new u8(tl);var clt=new u8(19);for(var i2=0;i2>>4;if(s<16){ldt[i2++]=s}else{var c=0,n=0;if(s==16)n=3+bits(dat,pos,3),pos+=2,c=ldt[i2-1];else if(s==17)n=3+bits(dat,pos,7),pos+=3;else if(s==18)n=11+bits(dat,pos,127),pos+=7;while(n--)ldt[i2++]=c}}var lt=ldt.subarray(0,hLit),dt=ldt.subarray(hLit);lbt=max(lt);dbt=max(dt);lm=hMap(lt,lbt,1);dm=hMap(dt,dbt,1)}else err(1);if(pos>tbts){if(noSt)err(0);break}}if(noBuf)cbuf(bt+131072);var lms=(1<>>4;pos+=c&15;if(pos>tbts){if(noSt)err(0);break}if(!c)err(2);if(sym<256)buf[bt++]=sym;else if(sym==256){lpos=pos,lm=null;break}else{var add=sym-254;if(sym>264){var i2=sym-257,b=fleb[i2];add=bits(dat,pos,(1<>>4;if(!d)err(3);pos+=d&15;var dt=fd[dsym];if(dsym>3){var b=fdeb[dsym];dt+=bits16(dat,pos)&(1<tbts){if(noSt)err(0);break}if(noBuf)cbuf(bt+131072);var end=bt+add;for(;bt>3&1)+(flg>>4&1);zs>0;zs-=!d[st++]);return st+(flg&2)};var gzl=function(d){var l=d.length;return(d[l-4]|d[l-3]<<8|d[l-2]<<16|d[l-1]<<24)>>>0};function gunzipSync(data,out){return inflt(data.subarray(gzs(data),-8),out||new u8(gzl(data)))}var td=typeof TextDecoder!="undefined"&&new TextDecoder();var tds=0;try{td.decode(et,{stream:true});tds=1}catch(e){}var gz_default=gunzipSync;var calculate_excerpt_region=(word_positions,excerpt_length)=>{if(word_positions.length===0){return 0}let words=[];for(const word of word_positions){words[word.location]=words[word.location]||0;words[word.location]+=word.balanced_score}if(words.length<=excerpt_length){return 0}let densest=words.slice(0,excerpt_length).reduce((partialSum,a)=>partialSum+a,0);let working_sum=densest;let densest_at=[0];for(let i2=0;i2densest){densest=working_sum;densest_at=[i2]}else if(working_sum===densest&&densest_at[densest_at.length-1]===i2-1){densest_at.push(i2)}}let midpoint=densest_at[Math.floor(densest_at.length/2)];return midpoint};var build_excerpt=(content,start,length,locations,not_before,not_from)=>{let is_zws_delimited=content.includes("\u200B");let fragment_words=[];if(is_zws_delimited){fragment_words=content.split("\u200B")}else{fragment_words=content.split(/[\r\n\s]+/g)}for(let word of locations){if(fragment_words[word]?.startsWith(``)){continue}fragment_words[word]=`${fragment_words[word]}`}let endcap=not_from??fragment_words.length;let startcap=not_before??0;if(endcap-startcapendcap){start=endcap-length}if(start{const anchors=fragment.anchors.filter((a)=>/h\d/i.test(a.element)&&a.text?.length&&/\S/.test(a.text)).sort((a,b)=>a.location-b.location);const results=[];let current_anchor_position=0;let current_anchor={title:fragment.meta["title"],url:fragment.url,weighted_locations:[],locations:[],excerpt:""};const add_result=(end_range)=>{if(current_anchor.locations.length){const relative_weighted_locations=current_anchor.weighted_locations.map((l)=>{return{weight:l.weight,balanced_score:l.balanced_score,location:l.location-current_anchor_position}});const excerpt_start=calculate_excerpt_region(relative_weighted_locations,desired_excerpt_length)+current_anchor_position;const excerpt_length=end_range?Math.min(end_range-excerpt_start,desired_excerpt_length):desired_excerpt_length;current_anchor.excerpt=build_excerpt(fragment.raw_content??"",excerpt_start,excerpt_length,current_anchor.locations,current_anchor_position,end_range);results.push(current_anchor)}};for(let word of fragment.weighted_locations){if(!anchors.length||word.location=anchors[0].location){next_anchor=anchors.shift()}let anchored_url=fragment.url;try{const url_is_fq=/^((https?:)?\/\/)/.test(anchored_url);if(url_is_fq){let fq_url=new URL(anchored_url);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString()}else{if(!/^\//.test(anchored_url)){anchored_url=`/${anchored_url}`}let fq_url=new URL(`https://example.com${anchored_url}`);fq_url.hash=next_anchor.id;anchored_url=fq_url.toString().replace(/^https:\/\/example.com/,"")}}catch(e){console.error(`Pagefind: Couldn't process ${anchored_url} for a search result`)}current_anchor_position=next_anchor.location;current_anchor={title:next_anchor.text,url:anchored_url,anchor:next_anchor,weighted_locations:[word],locations:[word.location],excerpt:""}}}add_result(anchors[0]?.location);return results};var asyncSleep=async(ms=100)=>{return new Promise((r)=>setTimeout(r,ms))};var PagefindInstance=class{constructor(opts={}){this.version=pagefind_version;this.backend=wasm_bindgen;this.decoder=new TextDecoder("utf-8");this.wasm=null;this.basePath=opts.basePath||"/pagefind/";this.primary=opts.primary||false;if(this.primary&&!opts.basePath){this.initPrimary()}if(/[^\/]$/.test(this.basePath)){this.basePath=`${this.basePath}/`}if(window?.location?.origin&&this.basePath.startsWith(window.location.origin)){this.basePath=this.basePath.replace(window.location.origin,"")}this.baseUrl=opts.baseUrl||this.defaultBaseUrl();if(!/^(\/|https?:\/\/)/.test(this.baseUrl)){this.baseUrl=`/${this.baseUrl}`}this.indexWeight=opts.indexWeight??1;this.excerptLength=opts.excerptLength??30;this.mergeFilter=opts.mergeFilter??{};this.ranking=opts.ranking;this.highlightParam=opts.highlightParam??null;this.loaded_chunks={};this.loaded_filters={};this.loaded_fragments={};this.raw_ptr=null;this.searchMeta=null;this.languages=null}initPrimary(){let derivedBasePath=import.meta.url.match(/^(.*\/)pagefind.js.*$/)?.[1];if(derivedBasePath){this.basePath=derivedBasePath}else{console.warn(["Pagefind couldn't determine the base of the bundle from the import path. Falling back to the default.","Set a basePath option when initialising Pagefind to ignore this message."].join("\n"))}}defaultBaseUrl(){let default_base=this.basePath.match(/^(.*\/)_?pagefind/)?.[1];return default_base||"/"}async options(options2){const opts=["basePath","baseUrl","indexWeight","excerptLength","mergeFilter","highlightParam","ranking"];for(const[k,v]of Object.entries(options2)){if(k==="mergeFilter"){let filters2=this.stringifyFilters(v);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}else if(k==="ranking"){await this.set_ranking(options2.ranking)}else if(opts.includes(k)){if(k==="basePath"&&typeof v==="string")this.basePath=v;if(k==="baseUrl"&&typeof v==="string")this.baseUrl=v;if(k==="indexWeight"&&typeof v==="number")this.indexWeight=v;if(k==="excerptLength"&&typeof v==="number")this.excerptLength=v;if(k==="mergeFilter"&&typeof v==="object")this.mergeFilter=v;if(k==="highlightParam"&&typeof v==="string")this.highlightParam=v}else{console.warn(`Unknown Pagefind option ${k}. Allowed options: [${opts.join(", ")}]`)}}}decompress(data,file="unknown file"){if(this.decoder.decode(data.slice(0,12))==="pagefind_dcd"){return data.slice(12)}data=gz_default(data);if(this.decoder.decode(data.slice(0,12))!=="pagefind_dcd"){console.error(`Decompressing ${file} appears to have failed: Missing signature`);return data}return data.slice(12)}async set_ranking(ranking){if(!ranking)return;let rankingWeights={term_similarity:ranking.termSimilarity??null,page_length:ranking.pageLength??null,term_saturation:ranking.termSaturation??null,term_frequency:ranking.termFrequency??null};let ptr=await this.getPtr();this.raw_ptr=this.backend.set_ranking_weights(ptr,JSON.stringify(rankingWeights))}async init(language,opts){await this.loadEntry();let index=this.findIndex(language);let lang_wasm=index.wasm?index.wasm:"unknown";let resources=[this.loadMeta(index.hash)];if(opts.load_wasm===true){resources.push(this.loadWasm(lang_wasm))}await Promise.all(resources);this.raw_ptr=this.backend.init_pagefind(new Uint8Array(this.searchMeta));if(Object.keys(this.mergeFilter)?.length){let filters2=this.stringifyFilters(this.mergeFilter);let ptr=await this.getPtr();this.raw_ptr=this.backend.add_synthetic_filter(ptr,filters2)}if(this.ranking){await this.set_ranking(this.ranking)}}async loadEntry(){try{let entry_response=await fetch(`${this.basePath}pagefind-entry.json?ts=${Date.now()}`);let entry_json=await entry_response.json();this.languages=entry_json.languages;if(entry_json.version!==this.version){if(this.primary){console.warn(["Pagefind JS version doesn't match the version in your search index.",`Pagefind JS: ${this.version}. Pagefind index: ${entry_json.version}`,"If you upgraded Pagefind recently, you likely have a cached pagefind.js file.","If you encounter any search errors, try clearing your cache."].join("\n"))}else{console.warn(["Merging a Pagefind index from a different version than the main Pagefind instance.",`Main Pagefind JS: ${this.version}. Merged index (${this.basePath}): ${entry_json.version}`,"If you encounter any search errors, make sure that both sites are running the same version of Pagefind."].join("\n"))}}}catch(e){console.error(`Failed to load Pagefind metadata: +${e?.toString()}`);throw new Error("Failed to load Pagefind metadata")}}findIndex(language){if(this.languages){let index=this.languages[language];if(index)return index;index=this.languages[language.split("-")[0]];if(index)return index;let topLang=Object.values(this.languages).sort((a,b)=>b.page_count-a.page_count);if(topLang[0])return topLang[0]}throw new Error("Pagefind Error: No language indexes found.")}async loadMeta(index){try{let compressed_resp=await fetch(`${this.basePath}pagefind.${index}.pf_meta`);let compressed_meta=await compressed_resp.arrayBuffer();this.searchMeta=this.decompress(new Uint8Array(compressed_meta),"Pagefind metadata")}catch(e){console.error(`Failed to load the meta index: +${e?.toString()}`)}}async loadWasm(language){try{const wasm_url=`${this.basePath}wasm.${language}.pagefind`;let compressed_resp=await fetch(wasm_url);let compressed_wasm=await compressed_resp.arrayBuffer();const final_wasm=this.decompress(new Uint8Array(compressed_wasm),"Pagefind WebAssembly");if(!final_wasm){throw new Error("No WASM after decompression")}this.wasm=await this.backend(final_wasm)}catch(e){console.error(`Failed to load the Pagefind WASM: +${e?.toString()}`);throw new Error(`Failed to load the Pagefind WASM: +${e?.toString()}`)}}async _loadGenericChunk(url,method){try{let compressed_resp=await fetch(url);let compressed_chunk=await compressed_resp.arrayBuffer();let chunk=this.decompress(new Uint8Array(compressed_chunk),url);let ptr=await this.getPtr();this.raw_ptr=this.backend[method](ptr,chunk)}catch(e){console.error(`Failed to load the index chunk ${url}: +${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(//g,">");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}parseFilters(str){let output={};if(!str)return output;for(const block of str.split("__PF_FILTER_DELIM__")){let[filter,values]=block.split(/:(.*)$/);output[filter]={};if(values){for(const valueBlock of values.split("__PF_VALUE_DELIM__")){if(valueBlock){let extract=valueBlock.match(/^(.*):(\d+)$/);if(extract){let[,value,count]=extract;output[filter][value]=parseInt(count)??count}}}}}return output}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_chunks=filters2.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks]);ptr=await this.getPtr();let results=this.backend.filters(ptr);return this.parseFilters(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}term=term.toLowerCase().trim().replace(/[\.`~!@#\$%\^&\*\(\)\{\}\[\]\\\|:;'",<>\/\?\-]/g,"").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let filter_resp=this.backend.request_filter_indexes(ptr,filter_list);let chunks=index_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadChunk(chunk));let filter_chunks=filter_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...chunks,...filter_chunks]);log(`Loaded necessary chunks to run search`);if(options2.preload){log(`Preload \u2014 bailing out of search operation now.`);return null}ptr=await this.getPtr();let searchStart=Date.now();let result=this.backend.search(ptr,term,filter_list,sort_list,exact_search);log(`Got the raw search result: ${result}`);let[unfilteredResultCount,all_results,filters2,totalFilters]=result.split(/:([^:]*):(.*)__PF_UNFILTERED_DELIM__(.*)$/);let filterObj=this.parseFilters(filters2);let totalFilterObj=this.parseFilters(totalFilters);log(`Remaining filters: ${JSON.stringify(result)}`);let results=all_results.length?all_results.split(" "):[];let resultsInterface=results.map((result2)=>{let[hash,score,all_locations]=result2.split("@");log(`Processing result: + hash:${hash} + score:${score} + locations:${all_locations}`);let weighted_locations=all_locations.length?all_locations.split(",").map((l)=>{let[weight,balanced_score,location]=l.split(">");return{weight:parseInt(weight)/24,balanced_score:parseFloat(balanced_score),location:parseInt(location)}}):[];let locations=weighted_locations.map((l)=>l.location);return{id:hash,score:parseFloat(score)*this.indexWeight,words:locations,data:async()=>await this.loadFragment(hash,weighted_locations,term)}});const searchTime=Date.now()-searchStart;const realTime=Date.now()-start;log(`Found ${results.length} result${results.length == 1 ? "" : "s"} for "${term}" in ${Date.now() - searchStart}ms (${Date.now() - start}ms realtime)`);return{results:resultsInterface,unfilteredResultCount:parseInt(unfilteredResultCount),filters:filterObj,totalFilters:totalFilterObj,timings:{preload:realTime-searchTime,search:searchTime,total:realTime}}}};var Pagefind=class{constructor(options2={}){this.backend=wasm_bindgen;this.primaryLanguage="unknown";this.searchID=0;this.primary=new PagefindInstance({...options2,primary:true});this.instances=[this.primary];this.init(options2?.language)}async options(options2){await this.primary.options(options2)}async init(overrideLanguage){if(document?.querySelector){const langCode=document.querySelector("html")?.getAttribute("lang")||"unknown";this.primaryLanguage=langCode.toLocaleLowerCase()}await this.primary.init(overrideLanguage?overrideLanguage:this.primaryLanguage,{load_wasm:true})}async mergeIndex(indexPath,options2={}){if(this.primary.basePath.startsWith(indexPath)){console.warn(`Skipping mergeIndex ${indexPath} that appears to be the same as the primary index (${this.primary.basePath})`);return}let newInstance=new PagefindInstance({primary:false,basePath:indexPath});this.instances.push(newInstance);while(this.primary.wasm===null){await asyncSleep(50)}await newInstance.init(options2.language||this.primaryLanguage,{load_wasm:false});delete options2["language"];await newInstance.options(options2)}mergeFilters(filters2){const merged={};for(const searchFilter of filters2){for(const[filterKey,values]of Object.entries(searchFilter)){if(!merged[filterKey]){merged[filterKey]=values;continue}else{const filter=merged[filterKey];for(const[valueKey,count]of Object.entries(values)){filter[valueKey]=(filter[valueKey]||0)+count}}}}return merged}async filters(){let filters2=await Promise.all(this.instances.map((i2)=>i2.filters()));return this.mergeFilters(filters2)}async preload(term,options2={}){await Promise.all(this.instances.map((i2)=>i2.preload(term,options2)))}async debouncedSearch(term,options2,debounceTimeoutMs){const thisSearchID=++this.searchID;this.preload(term,options2);await asyncSleep(debounceTimeoutMs);if(thisSearchID!==this.searchID){return null}const searchResult=await this.search(term,options2);if(thisSearchID!==this.searchID){return null}return searchResult}async search(term,options2={}){let search2=await Promise.all(this.instances.map((i2)=>i2.search(term,options2)));const filters2=this.mergeFilters(search2.map((s)=>s.filters));const totalFilters=this.mergeFilters(search2.map((s)=>s.totalFilters));const results=search2.map((s)=>s.results).flat().sort((a,b)=>b.score-a.score);const timings=search2.map((s)=>s.timings);const unfilteredResultCount=search2.reduce((sum,s)=>sum+s.unfilteredResultCount,0);return{results,unfilteredResultCount,filters:filters2,totalFilters,timings}}};var pagefind=void 0;var initial_options=void 0;var init_pagefind=()=>{if(!pagefind){pagefind=new Pagefind(initial_options??{})}};var options=async(new_options)=>{if(pagefind){await pagefind.options(new_options)}else{initial_options=new_options}};var init=async()=>{init_pagefind()};var destroy=async()=>{pagefind=void 0;initial_options=void 0};var mergeIndex=async(indexPath,options2)=>{init_pagefind();return await pagefind.mergeIndex(indexPath,options2)};var search=async(term,options2)=>{init_pagefind();return await pagefind.search(term,options2)};var debouncedSearch=async(term,options2,debounceTimeoutMs=300)=>{init_pagefind();return await pagefind.debouncedSearch(term,options2,debounceTimeoutMs)};var preload=async(term,options2)=>{init_pagefind();return await pagefind.preload(term,options2)};var filters=async()=>{init_pagefind();return await pagefind.filters()};export{debouncedSearch,destroy,filters,init,mergeIndex,options,preload,search} \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/wasm.en.pagefind b/shepherd/blueprints/staticroutes/docs/pagefind/wasm.en.pagefind new file mode 100644 index 0000000..56073e8 Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/wasm.en.pagefind differ diff --git a/shepherd/blueprints/staticroutes/docs/pagefind/wasm.unknown.pagefind b/shepherd/blueprints/staticroutes/docs/pagefind/wasm.unknown.pagefind new file mode 100644 index 0000000..4dbac6e Binary files /dev/null and b/shepherd/blueprints/staticroutes/docs/pagefind/wasm.unknown.pagefind differ diff --git a/shepherd/blueprints/staticroutes/docs/patch-2019-01-12.zip b/shepherd/blueprints/staticroutes/docs/patch-2019-01-12.zip deleted file mode 100644 index a43aa13..0000000 --- a/shepherd/blueprints/staticroutes/docs/patch-2019-01-12.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e03576859b8f1f43db41799786b53f9c1b3a4a8cd3fa29a4ae8a9983b1639d60 -size 5261607 diff --git a/shepherd/blueprints/staticroutes/docs/patch-2019-02-27.zip b/shepherd/blueprints/staticroutes/docs/patch-2019-02-27.zip deleted file mode 100644 index 5a71e64..0000000 --- a/shepherd/blueprints/staticroutes/docs/patch-2019-02-27.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e1ba84dfbed9ce9b069e09bd8f454781b2dfcb7b6bf40b58db263aecc98f535 -size 13412 diff --git a/shepherd/blueprints/staticroutes/docs/patching-the-robot.html b/shepherd/blueprints/staticroutes/docs/patching-the-robot.html deleted file mode 100644 index 2a83f53..0000000 --- a/shepherd/blueprints/staticroutes/docs/patching-the-robot.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - Patching the Robot | Robocon - - - - - - - -

    Patching the Robot

    An important part of looking after your robot is making sure its software is up to date. Over time RoboCon may release patches that allow you to update your robot. Follow the steps below to bring your robot up to date.

    Steps to Patch

    1. Download the patch from the email we sent, or our blog, onto the computer you will be connecting your BrainBox to.

    2. Turn on and connect to your robot.

    3. Navigate to the editor by visiting http://robot.local/ and clicking the orange button

    4. Click the upload button (indicated below).

    5. Navigate to where you have saved the patch and click OK.

    6. Select the patch file in the left-hand panel. The patch will show on the code view as Base64 encoded data (random-looking text characters).

    7. Click the "Run" button (green arrow on the right-hand panel).

    8. After a few moments, your BrainBox should reboot, and the LED will either turn off or remain on. You will lose connection with it while it does this. Do not turn off your BrainBox - the LED may stay off for a couple minutes.

    9. The BrainBox LED will eventually start flashing again to show it has rebooted successfully.

    10. If your PC has not automatically connected, connect to it using the WiFi. Once reconnected, refresh your browser and open a project from the left-hand side of the editor. Check that the patch version is correct in the right-hand panel.

    11. If you have any issues, please contact us.

    TIP

    Your robot will restart as part of the patching process, so you will lose connectivity with it for about half a minute. Your laptop should automatically reconnect to the robot when it turns back on. If you cannot connect to your robot, please contact us.

    This patch's passphrase is:

    Why are dragons good at music? -They know lots of scales

    - - - diff --git a/shepherd/blueprints/staticroutes/docs/programming/enabling-and-disabling-power/index.html b/shepherd/blueprints/staticroutes/docs/programming/enabling-and-disabling-power/index.html new file mode 100644 index 0000000..0580e05 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/enabling-and-disabling-power/index.html @@ -0,0 +1,105 @@ + Toggling 12v and 5v power | RoboCon Docs + + Skip to content

    Toggling 12v and 5v power

    Output power at both 12v and 5v can be toggled on and off using your code. This can be done in a couple different ways.

    +

    Toggling 12v power

    +

    The BrainBox provides 12v power to the Aux 12v port on the side of the BrainBox next to the motors. In your code you can toggle whether this power is being supplied using the R.enable_12v property as shown below:

    +
    import robot
    R = robot.Robot()
    +
    # ...Your code
    +
    R.enable_12v = False
    +
    # ...Rest of your code
    +

    This will disable the Aux 12v port until you re-enable it using R.enable_12v = True. +You can also check whether the 12v is currently enabled or disabled.

    +
    import robot
    R = robot.Robot()
    +
    R.enable_12v = False
    print(R.enable_12v) # Outputs "False"
    +

    Toggling 5v power

    +

    The BrainBox supplied 5v power to multiple outputs. These are the Servos (all 0-3), as well as the 5v GPIO pin. You can disable these similarly to the 12v power by using the following code:

    +
    import robot
    R = robot.Robot()
    +
    # ...Your code
    +
    R.enable_5v = False
    +
    # ...Rest of your code
    +

    This will disable the Servo ports as well as the 5v GPIO pin until you re-enable them using R.enable_5v = True. +You can also check whether the 5v is currently enabled or disabled.

    +
    import robot
    R = robot.Robot()
    +
    R.enable_5v = False
    print(R.enable_5v) # Outputs "False"
    +

    Enabling or disabling power by default.

    +

    You can set the BrainBox to have 5v and 12v disabled by default using the following code:

    +
    import robot
    R = robot.Robot(start_enable_5v=False, start_enable_12v=False)
    +

    You can set both to false as in the example, or alternatively only set one. This will disable the power immediately when the brain loads to blinky, rather than you manually disabling it when the code starts execution.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/gpio/index.html b/shepherd/blueprints/staticroutes/docs/programming/gpio/index.html new file mode 100644 index 0000000..773a536 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/gpio/index.html @@ -0,0 +1,142 @@ + GPIO | RoboCon Docs + + Skip to content

    GPIO

    The GPIO (General Purpose Input Output) allows you to turn on LEDs, react to button presses, or do just about anything.

    +

    Our BrainBox has 4 GPIO pins that you can control. Before you do anything with a pin, you must first set its’ mode.

    +

    There are 4 modes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ModePythonDescription
    Digital Outputrobot.OUTPUTAllows you to write a high or low signal
    Digital Inputrobot.INPUTAllows you to read a high or low signal
    Analog Inputrobot.INPUT_ANALOGAllows you to read a voltage, like a voltmeter
    Pullup Inputrobot.INPUT_PULLUPLike input, but uses a weak pullup resistor
    + +

    Python

    +

    To write a digital signal on pin 0:

    +
    R.gpio[0].mode = robot.OUTPUT
    R.gpio[0].digital = True
    +

    To read a digital signal on pin 1:

    +
    R.gpio[1].mode = robot.INPUT
    print(R.gpio[1].digital)
    +

    To read an analog signal on pin 2:

    +
    R.gpio[2].mode = robot.INPUT_ANALOG
    print(R.gpio[2].analog)
    +

    To read a pullup signal on pin 3

    +
    R.gpio[3].mode = robot.INPUT_PULLUP
    print(R.gpio[3].digital) # Note that this output will be inverted - True when the connnection is open, and False when closed.
    + +

    Here’s a more complete example:

    +
    import robot
    import time
    +
    R = robot.Robot()
    +
    R.gpio[0].mode = robot.INPUT
    R.gpio[1].mode = robot.INPUT_ANALOG
    R.gpio[2].mode = robot.OUTPUT
    R.gpio[3].mode = robot.INPUT_PULLUP
    +
    outputState = False
    +
    while True:
    # Read the values of 0 and 1
    print(R.gpio[0].digital)
    print(R.gpio[1].analog)
    +
    # Switch output state and send it to 2
    outputState = !outputState
    R.gpio[2].digital = outputState
    +
    # Read the value of 3
    print(R.gpio[3].digital)
    +
    # Pause for 2 seconds
    time.sleep(2)
    +

    Blockly

    +

    The GPIO blocks can be found in the GPIO section, and function similarly to the python.

    +

    Pull-ups

    +

    The BrainBox possesses the ability to enable a built-in pull-up resistor on any input pin. This takes a small amount of explanation.

    +

    Normally, input pins are not connected to anything - known as “floating”. In this state, they might read high or low, or different values depending on their environment (due to anything from cosmic rays to the wiring in the building). This is obviously not good for consistent control.

    +

    Many pieces of off-the-shelf electronics that have some form of standard I/O output will connect this pin to 5V (high) and 0V (low) when required, so this is not a problem. However, for simple electronics, a microswitch for example, you would normally be required to connect a resistor between the input pin and 5V (a pull-up resistor), or between the input pin and 0V (a pull-down resistor) to keep the input in a known state until the switch overrides it by connecting directly to the opposite state.

    +

    However, the built-in pull-up resistor alleviates this need. It essentially wires in a resistor connected to 5V, meaning that when this option is enabled, an input pin will “default” to being high. This means you can simply connect a switch between the input pin and a ground pin without any need of resistors - when the switch is open, the pin will read high; when closed, it will read low.

    +

    An example weak pull up

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/init-robot/index.html b/shepherd/blueprints/staticroutes/docs/programming/init-robot/index.html new file mode 100644 index 0000000..c037967 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/init-robot/index.html @@ -0,0 +1,86 @@ + Initialising the Robot | RoboCon Docs + + Skip to content

    Initialising the Robot

    When using Python to program your robot, you must remember to initialise the robot. If you’re using Blockly, this is done automatically.

    +

    All of the code required to control the Robot is located in the robot python module. +To import the module, and initialise the robot use the following code:

    + +
    import robot
    R = robot.Robot()
    +

    When you initialise the robot with robot.Robot(), your code will be paused until the hardware start button or Shepherd run button is pressed. When the Robot is waiting for either of these buttons to be pressed, the blue status LED will flash on and off.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/learning-python/index.html b/shepherd/blueprints/staticroutes/docs/programming/learning-python/index.html new file mode 100644 index 0000000..791e9c7 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/learning-python/index.html @@ -0,0 +1,92 @@ + Learning Python | RoboCon Docs + + Skip to content

    Learning Python

    Python is an interpreted high-level programming language for general-purpose programming. First released in 1991, Python has a design philosophy that emphasises code readability, notably using significant whitespace.

    + +

    There are many resources online for learning Python, here are a few good ones that we would recommend:

    +
      +
    • Student Robotics’ tutorial has a tutorial called Python: a whirlwind tour. This was written for Student Robotics competitors (a similar competition to the one you are taking part in), and explains the basics while trying not to overwhelm you.
    • +
    • CSNewbs has a very comprehensive tutorial, that takes you through from the basics to the slightly more advanced. The later chapters cover things like File Handling and UIs - you shouldn’t be using these on your brains, but go wild on your own devices!
    • +
    • The Official Python Tutorial can be pretty handy - the good stuff starts at chapter 3, but you should at least skim the stuff before it; there is a lot there and it may be a little overwhelming.
    • +
    • A number of tutorials for beginners are linked to from here.
    • +
    • Learn X in Y minutes is quite nice if you’ve programmed before in another language and just want to learn the syntax. (Tip: If you’re trying to complete the challenges, here’s where we say you can learn Python in “Y” minutes)
    • +
    • The Official Docs can be handy, but a little dense! Give them a shot, but don’t worry if you can’t find what you are looking for.
    • +
    +

    Running code on your brain may have unintended side effects if it does not call import robot, and doesn’t create a robot object (R = robot.Robot()). Its best to leave those lines in, even if you don’t need to run anything related to the hardware on the brain.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/libraries/index.html b/shepherd/blueprints/staticroutes/docs/programming/libraries/index.html new file mode 100644 index 0000000..9c185f9 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/libraries/index.html @@ -0,0 +1,161 @@ + Libraries | RoboCon Docs + + Skip to content

    Libraries

    +

    the following libraries are installed on your robot.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PackageVersion
    chardet2018.8.24
    entrypoints0.3
    gevent21.8.0
    gpiozero1.6.2
    greenlet1.1.1
    keyrings17.1.1
    numpy1.21.2
    picamera1.13
    pillow8.3.2
    pluggy1.0.0
    pycairo1.20.1
    pygobject3.30.4
    pyserial3.5
    rpi.gpio0.7.0
    scipy1.7.1
    smbus20.4.1
    spidev3.5
    +

    Documentation might not align with used version, please verify documentation is set to the specified version as that is what is installed on the robot

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/markers/index.html b/shepherd/blueprints/staticroutes/docs/programming/markers/index.html new file mode 100644 index 0000000..1437eca --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/markers/index.html @@ -0,0 +1,87 @@ + Markers | RoboCon Docs + + Skip to content

    Markers

    You can access (and print) this year’s markers here.

    +
      +
    • Supply crates markers are on page 1-24
    • +
    • Supply drop markers are on pages 25-32
    • +
    • Tree markers are on pages 33-48
    • +
    • Arena wall markers are from page 48 onwards
    • +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/motors/index.html b/shepherd/blueprints/staticroutes/docs/programming/motors/index.html new file mode 100644 index 0000000..67912a6 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/motors/index.html @@ -0,0 +1,99 @@ + Motors | RoboCon Docs + + Skip to content

    Motors

    Motors can be used for all sorts of things, besides just moving your robot. For instance, they could also be used as part of a mechanism to collect cubes. However you decide to use them, they’re really simple to control.

    +

    When you control motors, you can choose how much power you want to give them. This is expressed as a percentage, so 0% means a stopped motor and 100% means a motor at full power.

    + +

    If you want to spin your motors in reverse, just stick a negative sign in front of your percentage.

    +

    Python

    +

    You can control motors using the motors property of the Robot object. To set the power of the first motor to 60% use:

    +
    R.motors[0] = 60
    +

    Remember that indexes start at 0; To control the second motor instead, replace motors[0] with motors[1].

    +

    To stop both motors:

    +
    R.motors[0] = 0
    R.motors[1] = 0
    +

    Here’s a more complete example:

    +
    import robot
    +
    R = robot.Robot()
    +
    # set motor 1 to 60% power
    R.motors[0] = 60
    +
    # set motor 2 to 60% power in the backwards direction
    R.motors[1] = -60
    +
    # turn both motors off
    R.motors[0] = 0
    R.motors[1] = 0
    + +

    Blockly

    +

    Blocks for controlling motors can be found in the Movement section. It follows a similar structure to how the python is layed out, with motors being set to a value between -100 and 100 to control their rotation speed.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/servos/index.html b/shepherd/blueprints/staticroutes/docs/programming/servos/index.html new file mode 100644 index 0000000..7b9ac57 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/servos/index.html @@ -0,0 +1,98 @@ + Servos | RoboCon Docs + + Skip to content

    Servos

    Servos are a bit like motors, except their position is fixed. This is useful for building an arm mechanism that grabs cubes, or anything else that has fixed states that it needs to be in.

    +

    Similarly to motors, the position of a servo is expressed as a percentage. This can be negative.

    +

    Servos are plugged into the Servo ports on the BrainBox. The numbers present on each port correspond to the index used in your code.

    +

    Python

    +

    You can control servos using the servos property of the Robot object. To set the servo 0 to the 50% position use:

    +
    R.servos[0].mode = robot.PWM_SERVO
    R.servos[0] = 50
    + +

    Here’s a more complete example, controlling servos 0 and 1:

    +
    import robot
    import time
    +
    R = robot.Robot()
    R.servos[0].mode = robot.PWM_SERVO
    R.servos[1].mode = robot.PWM_SERVO
    +
    # set servo 0 to the 50% position
    R.servos[0] = 50
    +
    # wait for the servo to finish moving
    time.sleep(1)
    +
    # set servo 1 to the -100% position
    R.servos[1] = -100
    +
    time.sleep(1)
    +
    # set servos 0 & 1 to the default positions
    R.servos[0] = 0
    R.servos[1] = 0
    + +

    Blockly

    +

    Blocks for controlling servos can be found in the Movement section.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/vision/index.html b/shepherd/blueprints/staticroutes/docs/programming/vision/index.html new file mode 100644 index 0000000..641fee3 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/vision/index.html @@ -0,0 +1,380 @@ + Vision | RoboCon Docs + + Skip to content

    Vision

    Computer Vision allows your robots to understand their environment. For the competition, this is used to locate markers. It will give you information about the type of the marker, the distance/angle to the marker, etc.

    +

    Python

    +

    To look for markers call see():

    +
    markers = R.see()
    +
    print(markers)
    +

    markers is a Python list of “marker objects”, which each look like the following:

    +
    [target Marker 0: 0.856m @0.754 degrees
    {
    info.type = TARGET
    info.id = 50
    info.target_type = TARGET_TYPE.SUPPLY_CRATE
    dist = 0.856
    bearing.y = 0.754
    bearing.x = 1.03e+02
    rotation.y = 5.1
    rotation.x = -11.4
    rotation.z = 9.47
    info = TOO BIG TO PRINT
    detection = TOO BIG TO PRINT
    }
    ]
    +

    Full reference of the properties are further below but some useful properties are:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PropertyDescription
    marker.distDistance to the marker in metres
    marker.bearing.yThe angle your robot needs to turn to get to the marker in degrees
    marker.info.idNumeric code of the marker
    marker.info.typeReturns ARENA for a wall marker and trees, or TARGET for supply crates and supply drop markers.
    marker.info.target_typeReturns if the marker is a Supply create or Supply drop marker. If it’s none of these, NONE will be returned. For example, a supply crate marker would return TARGET_TYPE.SUPPLY_CRATE. However a tree marker would return NONE.
    +

    Codes

    + +

    Every april tag has a code:

    +
      +
    • +

      April tags 0-31 will be used for supplies. Although only 4 supply crates and 4 supply drops used in each round, there are another 19 supply crates and 3 supply drops spare in case some get damaged.

      +
    • +
    • +

      April tags 100+ will be around the arena on the walls. See the rules for +specifics on where around the rules they will be placed

      +
    • +
    • +

      You do not need to use the marker numbers, and can instead use marker.type and marker.owning_team

      +
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FunctionCodes
    Supply crates0 - 23
    Supply drops24 - 31
    Trees76 - 91
    Arena walls Marker100 - 123
    +

    Blockly

    +

    Blocks for vision can be found in the Vision section.

    + +

    Here’s an example of a Blockly program that does some basic vision:

    + + +

    Example

    +

    After reading the motors documentation you should be able to create a function which moves your robot by a number of meters as well as turn. We can then use this to write some code where a robot:

    +
      +
    • +

      Looks for a marker

      +
    • +
    • +

      If it can see a marker:

      +
        +
      • Turn so that it is facing the marker
      • +
      • Drive the distance to the marker
      • +
      +
    • +
    • +

      If there is no marker in sight turn a bit and look again, maybe there is a marker out of view.

      +
    • +
    +
    import robot
    +
    R = robot.Robot()
    +
    def move(distance):
    """The robot drives `distance` meters forwards"""
    print("PUT YOUR MOVE CODE HERE")
    +
    def turn(rotation):
    """The robot turns `rotation` degrees"""
    print("PUT YOUR TURN CODE HERE")
    +
    while True:
    for marker in R.see():
    turn(marker.bearing.y) # Face the marker
    move(marker.dist) # Drive to the marker
    else:
    turn(20) # The robot didn't see anything and so we turn and maybe see
    # another marker
    +

    The Marker object

    +

    Details about the markers can be accessed using the following syntax:

    +
    markers = R.see() # returns list of markers which the robot can see
    +
    for marker in markers:
    print(marker.dist) # The distance to the marker in meters
    print(marker.bearing.y) # The rotation the robot would need to turn to
    # face the marker
    print(marker.info.id) # The number of the marker
    else:
    print("The robot didn't see any markers and skipped the for loop!")
    +

    A Marker object contains information about a detected marker. It has the following attributes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AttributeWhat it does
    distThe distance to the Marker from the camera in meters.
    bearingHow far the BrainBox would have to rotate to face that Marker in degrees
    bearing.xThe up/down bearing. 0 is vertically bellow the camera
    bearing.yThe left/right bearing. 0 is straight ahead from the camera
    rotationHow much the Marker would need to be rotated to face the BrainBox. (0,0,0) Is if the marker was facing the BrainBox in the upright position
    rotation.xThe roll of the marker
    rotation.yThe pitch of the marker
    rotation.zThe yaw of the marker
    infoAn object with various information about the marker
    info.idThe ID number of the marker
    info.sizeThe length of the black edge of the marker in meters
    info.typeReturns ARENA for a wall marker and a tree marker, or TARGET for supply crates and supply drop markers.
    info.target_typeReturns if the marker is a Supply create or Supply drop marker. If it’s none of these, NONE will be returned. For example, a supply crate marker would return TARGET_TYPE.SUPPLY_CRATE. However a tree marker would return NONE.
    info.bounding_box_colourA tuple describing the colour which is drawn around the marker in the preview image (Blue, Red, Green)
    detectionTechnical information which has been inferred from the image.
    detection.tag_familyThe family of AprilTag which is detected. RoboCon currently only uses tag36h11.
    detection.tag_idThe ID number of the detected marker. Aliased by marker.info.id.
    detection.hammingThe number of bits which were corrected. The detector cannon detect tags with a hamming distance greater than 2.
    detection.decision_marginA measure of the quality of the binary decoding process; the average difference between the intensity of a data bit versus the decision threshold. Higher numbers roughly indicate better decodes. Only effective for tags which appear small.
    detection.homographyThe 3x3 homography matrix describing the projection from an “ideal” tag (with corners at (-1,1), (1,1), (1,-1), and (-1, -1)) to pixels in the image.
    detection.centerThe image pixel coordinates of the center of the marker.
    detection.cornersThe image pixel coordinates of corners of the detected marker
    detection.pose_RThe 3x3 Rotational matrix which describes the rotation of the marker relative to the origin.
    detection.pose_TThe 1x3 translation vector of the marker in meters.
    detection.pose_errThe uncertainty of the detection in meters. This number can vary massively between detections depending on if local minima were bypassed. See Apriltag: A robust and flexible visual fiducial system
    dectection.distThe distance to the marker in meters.
    detection.rotationHow much the Marker would need to be rotated to face the BrainBox. (0,0,0) Is if the marker was facing the BrainBox in the upright position.
    detection.bearingHow far the BrainBox would have to rotate to face that Marker in degrees.
    + + +

    The Camera object

    +

    An interface to the camera is provided incase you want to do additional computer vision.

    +

    Changing the resolution

    +

    By default the camera takes pictures at a resolution of 640x480px. You can change this by setting the res parameter.

    +
    import robot
    +
    R = robot.Robot()
    +
    print(f"The current res is set to {R.camera.res}")
    R.camera.res = (1920, 1440)
    print(f"The current res is set to {R.camera.res}")
    +

    You must use one of the following resolutions:

    +
      +
    • (640, 480) (default)
    • +
    • (1296, 736)
    • +
    • (1296, 976)
    • +
    • (1920, 1088)
    • +
    • (1920, 1440)
    • +
    + + +

    Get data straight from the camera

    +

    If you wish to do your own computer vision you can capture frames directly from the camera using robot.camera.capture().

    +
    import robot
    +
    R = robot.Robot()
    +
    image = R.camera.capture()
    +
    image.grey_frame # A 2d numpy array of the image data uint8
    image.colour_frame # A 3d numpy array of the image data
    image.colour_type # The encoding method used to store the colour_frame defaults to 8 bit RGB.
    image.time # A `datetime` object representing approximately the capture time.
    +

    Using USB cameras

    +

    The built-in Pi Camera inside your brain should be great for your robot, however if you would like to use your own USB Camera (perhaps you want to put a camera somewhere else on your robot), you can!

    +

    USB cameras can have slightly different functionality than the built-in Pi Camera, so they’ll need some fine tuning before you can use them. The basic steps outlined below should get you up and running.

    +

    Please turn your robot off before plugging in your USB Camera of choice.

    +

    To use a USB camera you will need to initialize the Robot with something which inherits from robot.vision.Camera. Then just call R.see() as you would normally.

    +
    import robot
    from robot.vision import RoboConUSBCamera
    +
    R = robot.Robot(camera=RoboConUSBCamera)
    +
    print(R.see())
    +

    Setting the resolution

    +

    You may now wish to change the resolution of your camera, this can be done the same as before with R.camera.res = (width,height).

    + +

    For example, to set a USB Camera’s resolution to 800x600:

    +
    import robot
    from robot.vision import RoboConUSBCamera
    +
    R = robot.Robot(camera=RoboConUSBCamera)
    +
    R.camera.res = (800, 600)
    print(R.see())
    +

    Calibrating the camera

    +

    You will then need to calibrate your USB camera as the distance that it reports will not be accurate. You can do this by changing the value in the R.camera.focal_lengths dictionary up or down. By default, the robot will use the focal lengths for a “Logitech C270” camera, it’s unlikely this is your camera - so see the steps below on how to calibrate it.

    + +
      +
    • Place a marker exactly 1m away from the camera (measure this distance). Make sure there are no other markers in sight of the camera.
    • +
    • Copy and paste the following code into your editor. Please set the resolution value to a resolution you wish to use.
    • +
    +
    import robot
    from robot.vision import RoboConUSBCamera
    R = robot.Robot(camera=RoboConUSBCamera)
    +
    resolution = (640, 480)
    +
    R.camera.focal_lengths[resolution] = (120, 120) # set the focal lengths to a known bad value
    R.camera.res = resolution # set resolution
    +
    marker = R.see()[0] # get first marker
    d = marker.dist
    focal_length = 120 / d # focal length = focal length / distance
    print("Focal length is around:",focal_length)
    print("Use this in your code to set the correct focal length: R.camera.focal_lengths[resolution] = ("+str(focal_length)+", "+str(focal_length)+")")
    +

    It’s worth noting that this is only an average value.

    +

    The code above will output a focal length value which you should use before setting R.camera.res or R.see(). You can also copy the line of code it produces and paste that into your code to set the focal lengths.

    +

    For example, if your focal length was 123 at the resolution of 800x600, you should use the following lines of code, in the same order:

    +
    import robot
    from robot.vision import RoboConUSBCamera
    R = robot.Robot(camera=RoboConUSBCamera)
    +
    R.camera.focal_lengths[resolution] = (123, 123)
    R.camera.res = resolution
    +
    marker = R.see()[0]
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/programming/zones/index.html b/shepherd/blueprints/staticroutes/docs/programming/zones/index.html new file mode 100644 index 0000000..a888c2e --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/programming/zones/index.html @@ -0,0 +1,119 @@ + Zones | RoboCon Docs + + Skip to content

    Zones

    Your code will probably need to look for different markers depending on the zone your robot starts in. Whilst you could have different files for each zone, there’s also a property on the robot object for this.

    +

    Python

    +

    R.zone will be equal to the the start zone of the robot, and will be equal to one of the teams.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TeamCode
    Redrobot.SECTOR.RED
    Bluerobot.SECTOR.BLUE
    Greenrobot.SECTOR.GREEN
    Yellowrobot.SECTOR.YELLOW
    Here’s an example:
    +
    import robot
    +
    R = robot.Robot()
    +
    if R.zone == robot.SECTOR.RED:
    print("Do something!")
    else:
    print("Do something else!")
    +

    This code checks if the first marker in the list belongs to the current robot.

    +

    Blockly

    +

    You can find the zone block in the Movement section.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/roboconRulebook.pdf b/shepherd/blueprints/staticroutes/docs/roboconRulebook.pdf deleted file mode 100644 index 05e871d..0000000 Binary files a/shepherd/blueprints/staticroutes/docs/roboconRulebook.pdf and /dev/null differ diff --git a/shepherd/blueprints/staticroutes/docs/running-code-from-a-usb.html b/shepherd/blueprints/staticroutes/docs/running-code-from-a-usb.html deleted file mode 100644 index d222abe..0000000 --- a/shepherd/blueprints/staticroutes/docs/running-code-from-a-usb.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - USB Tricks | Robocon - - - - - - - -

    USB Tricks

    USB Stick

    TIP

    The BrainBox only checks for the presence of USB sticks at boot - only plug and unplug USB sticks when the BrainBox is off (front panel blue light off).

    WARNING

    During the competition RoboCon requires unrestricted access to at least one USB port. If you are running a red BrainBox, only one USB port is available, and this must be unused during the competition. -If you have a green BrainBox and want to use a USB stick during the competition it must leave enough space around at least one port to insert our low profile arena stick.

    Running your code from a USB:

    When started, using the start button the robot will default to running the last piece of code written in the editor. In some cases at the competition it can be useful to be able to run code from a USB stick.

    1. Place a file called main.py or code.zip (which must include a file called main.py) in the root directory of the USB stick on another computer.
    2. Turn on the robot using the red power button.
    3. The file will be automatically copied from the USB stick
    4. Press the black start button

    WARNING

    Code copied from USB sticks is not Linted, sufficiently broken code may crash not just the user code, but also the web interface preventing the robot from reaching "Blinky". See troubleshooting for details about what the LEDs mean. It is highly recommended for users to export working code from the editor to the USB stick rather than editing code directly. See troubleshooting for how to recover a robot which does not boot to Blinky.

    Getting Logs

    When running your robot code you can see the logs from the robot in the editor. Sometimes it's useful to be able to view the logs later to analyse what happened.

    WARNING

    • Be careful when reusing USB sticks to avoid accidentally running code from the USB Stick!
    1. Insert a USB stick in the robot before turning it on.
    2. The log file will be automatically written to the USB stick as logs.txt
    3. Remember to fully power down the robot before removing the USB stick

    TIP

    • Logs are collected whatever way the code is run, but only the most recent logs are preserved
    • The log files are also collected during system shutdown leading to worrying messages like:
    Exception in thread Thread-2:
    -Traceback (most recent call last):
    -  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    -     self.run()
    -  File "/usr/lib/python2.7/threading.py", line 754, in run
    -     self.\_\_target(\*self.\_\_args, \**self.__kwargs)
    -  File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site
    -     self.run()
    -  File "/usr/lib/python2.7/threading.py", line 754, in run
    -     self.\_\_target(\*self.\_\_args, \**self.__kwargs)
    - -packages/robot/wrapper.py", line 251, in wait_start_blink
    -     self._internal.set_status_led(v)
    -  File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site-packages/robot/greengiant.py", line 87, in set_status_led
    -     self._bus.write_byte_data(_GG_I2C_ADDR, _GG_STATUS, int(on))
    -  File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site-packages/smbus2/smbus2.py", line 377, in write_byte_data
    -     ioctl(self.fd, I2C_SMBUS, msg)
    -IOError: \[Errno 121] Remote I/O error
    -

    These can safely be ignored unless you also see them on the web interface.

    Collecting images and raw analysis

    Every time the robot takes a picture it is updated on the web interface, during development it is occasionally useful to be able to also keep a log of pictures that have been analysed to check camera focus, motion blur etc.

    1. Add a file with the name "collect_images.txt" to the USB stick to collect the images
    2. Add a file with the name "log_markers.txt" to the USB stick to collect analysis of images
    3. Insert the stick before turning the robot on
    4. Remember to fully shut down the robot before removing the USB stick -WARNING: Collecting all images may slow down the processing time from your robot - Use with care!

    Updating your team image

    When the robot boots, it loads a default image which is displayed until the robot takes a picture, in the arena these images are displayed on an overhead projector. You can change the default image.

    1. Save your Image as 440x330 pixels in jpeg format onto the USB stick as "team_logo.jpg"
    2. Boot the robot once to install the image
    3. Fully shut down the robot
    4. The image will be used from the next time the robot is booted

    TIP

    We may ask that your image includes either a Team Name or your institution (e.g. Systemetric or Hills Road Sixth Form College) to assist the Marshalls, but if you have a iconic robot design then we may waive this rule

    - - - diff --git a/shepherd/blueprints/staticroutes/docs/servos.html b/shepherd/blueprints/staticroutes/docs/servos.html deleted file mode 100644 index 1d3fa62..0000000 --- a/shepherd/blueprints/staticroutes/docs/servos.html +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - Servos | Robocon - - - - - - - -

    Servos

    Servos are a bit like motors, except their position is fixed. This is useful for building an arm mechanism that grabs cubes, or anything else that has fixed states that it needs to be in.

    Similarly to motors, the position of a servo is expressed as a percentage. This can be negative.

    Servos are plugged into the Servo ports on the BrainBox. The numbers present on each port correspond to the index used in your code.

    Python

    You can control servos using the servos property of the Robot object. To set the servo 0 to the 50% position use:

    R.servos[0].mode = robot.PWM_SERVO
    -R.servos[0] = 50
    -

    To control servo 3 instead, replace servos[0] with servos[3]. Again, remember that indexes start at 0.

    Here's a more complete example:

    import robot
    -
    -R = robot.Robot()
    -
    -R.servos[0].mode = robot.PWM_SERVO
    -R.servos[1].mode = robot.PWM_SERVO
    -
    -# set servo 0 to the 50% position
    -R.servos[0] = 50
    -
    -# set servo 1 to the -100% position
    -R.servos[1] = -100
    -
    -# set servos 0 & 1 to the default positions
    -R.servos[0] = 0
    -R.servos[1] = 0
    -

    Blockly

    Blocks for controlling servos can be found in the Movement section.

    Default positions

    Servos default to a starting position 1/2 way through their travel, for some uses teams may need to start with a different resting position to ensure their robot fits within the set sizes, you can set the position that the servo holds while waiting for the start button to be pressed by initilizing the robot object with servo_defaults=((servo_number,position)...,(servo_number,position))

    E.g. to set servo 0 to 100% and servo 1 to 50% use

    import robot
    -
    -servo_values = {
    -    0: 100,
    -    1: 50
    -}
    -
    -R = robot.Robot(servo_defaults=servo_values)
    -
    - - - diff --git a/shepherd/blueprints/staticroutes/docs/the-brainbox.html b/shepherd/blueprints/staticroutes/docs/the-brainbox.html deleted file mode 100644 index d6c9557..0000000 --- a/shepherd/blueprints/staticroutes/docs/the-brainbox.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - The BrainBox | Robocon - - - - - - - -

    The BrainBox

    The BrainBox is the core of the kit which we provide. In it is all of the electronics and software you need to power a robot. Lets start by turning it on. Take a battery from the kit and plug it into the yellow socket labelled battery, then take a red "power button" and connect that to the black connector along the side of the BrainBox. The battery and start button are both labelled on the red surface of the BrainBox. -The brain box

    How to turn everything on

    Pressing the start button will cause the battery status LEDs on the front of the BrainBox flash in an upwards direction and the power LED turns green. When the user light starts flashing blue your BrainBox is ready to run code. You can now turn connect to your robot. The user LED will go solid while code is running.

    Power

    The BrainBox distributes power to the robot from the battery. It provides both 12V and 5V power out. All power must go through the BrainBox and the fuse should never be replaced.

    The On/Off switch also plugs into the BrainBox as well as the Start button which is used to start your robot code running.

    Motors & 12V Power

    The specifications for the motor board can be found here, however to summarize:

    Condition per channel Maximum Value
    Continuous current 10A
    Peak current (10 seconds) 30A
    Operating Voltage 12V

    TIP

    You can toggle the 12V which allows you to turn 12V devices on and off easily. However, this will also cut power to the motor board.

    How to turn everything off

    When you are done for the day, press the power button, the user LED will flash rapidly, when this turns off you may unplug the battery.

    USB's

    On the new brainBox, there is only one USB port. If you want to use something that requires a USB port such as a USB camera, you will need to get your own USB hub.

    GPIO

    GPIO - Out

    All of the BrainBox's GPIO pins are connected in-series with a 1K Ohm resistor, to provide current limiting. This means that you can plug devices such as LED's straight into your BrainBox.

    Nominally they operate at 5V but depending on your load the true output will vary. You can calculate the voltage you will get across your load by measuring its resistance, then doing the sum:

    (5*Load_resistance)/(Load_resistance+1000)

    GPIO - In

    We advise against you using analogue inputs with an impedance (You can think of impedance as "effective resistance in an analogue circuit") of greater than 9K Ohm's as this will result in values which do not necessarily correspond to what you'd expect.

    If you need to sense something with an impedance of more than 9K then you will need to use an Op-amp to buffer the input. If you would like more details on how to do this please contact us on the forums.

    GPIO - Limits

    Do not try and sink or source more than 25mA into the BrainBox's GPIO, it may damage some of the internal components.

    PWM Pins

    PWM (Pulse Width Modulation) is a technique used for sending signals to a device for how much it should do a thing. This could be how fast to spin a motor, or the position to turn an RC Servo to. It does this by sending regular pulses, which vary in width. The length of the pulse tells the device how much to do the thing. If you are interested you can find out more about using PWM for control here.

    Please note you will not be able to drive large motors over the PWM pin's supplied as the maximum which they can supply is 3A at 5V.

    The PWM pins ranges:

    Value Pulse
    0 1.5ms
    100 2ms
    -100 1ms
    178 2.39ms
    -178 0.61ms

    Pin Out

    IO

    USB's

    Motors

    Motors

    Front

    Front

    Expansion I2C, UART & USB

    For expansion please see the expansion page.

    - - - diff --git a/shepherd/blueprints/staticroutes/docs/tools/brainbox-crashed-fix/index.html b/shepherd/blueprints/staticroutes/docs/tools/brainbox-crashed-fix/index.html new file mode 100644 index 0000000..35e2427 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/brainbox-crashed-fix/index.html @@ -0,0 +1,85 @@ + If the Brainbox has crashed... | RoboCon Docs + + Skip to content

    If the Brainbox has crashed...

    Symptoms

    +

    The BrainBox appears to power up, but I can’t connect to the website and the blue LED lights but never starts flashing.

    +

    Solution

    +

    This can happen if erroneous code which does not start with R = robot.Robot() is uploaded to The BrainBox. If you think this may have happened, download this file and place it on a USB stick. Put the USB stick into The BrainBox and turn the robot on normally. Wait 5 minutes, if you do not at this point get the flashing blue light, please contact us!

    +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/collecting-images-and-raw-analysis/index.html b/shepherd/blueprints/staticroutes/docs/tools/collecting-images-and-raw-analysis/index.html new file mode 100644 index 0000000..7a2c727 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/collecting-images-and-raw-analysis/index.html @@ -0,0 +1,89 @@ + Collecting Images and Raw Analysis | RoboCon Docs + + Skip to content

    Collecting Images and Raw Analysis

    Every time the robot takes a picture it is updated on the web interface, during development it is occasionally useful to be able to also keep a log of pictures that have been analysed to check the camera focus, motion blur etc.

    +

    Gathering Data

    +
      +
    1. Add a file with the name “collect_images.txt” to the USB stick to collect the images
    2. +
    3. Add a file with the name “log_markers.txt” to the USB stick to collect analysis of images
    4. +
    5. Insert the USB stick before turning the robot on
    6. +
    7. Remember to fully shut down the robot before removing the USB stick
    8. +
    +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/connecting/index.html b/shepherd/blueprints/staticroutes/docs/tools/connecting/index.html new file mode 100644 index 0000000..4e73e2e --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/connecting/index.html @@ -0,0 +1,93 @@ + Connecting | RoboCon Docs + + Skip to content

    Connecting

      +
    1. Turn on the robot by following the instructions here.
    2. +
    3. Turn on your computer and wait until you reach the Windows desktop.
    4. +
    5. Click on the WiFi icon in the bottom right and connect to RoboConYYYY-TeamXX where YYYY is the competition year and XX is your team number. Your WiFi password should be on the bottom of your BrainBox, underneath its network name.
    6. +
    7. Navigate to http://robot.local in your web browser of choice (Chrome or Firefox is recommended). You should see an interface similar to this:
    8. +
    +

    The Interface

    +

    From now on, this will be referred to as the Shepherd Homepage.

    +

    Next Steps

    +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/editor/index.html b/shepherd/blueprints/staticroutes/docs/tools/editor/index.html new file mode 100644 index 0000000..50e127a --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/editor/index.html @@ -0,0 +1,125 @@ + Using the Editor | RoboCon Docs + + Skip to content

    Using the Editor

    We recommend you use the code editor that’s included with Shepherd to program your robot. You can either program in Python or use Blockly, a powerful Scratch-like programming tool.

    +

    Assuming you’ve connected to your robot, head to http://robot.local/editor or click the orange +editor button on the Shepherd homepage.

    +

    Upload Button

    +

    The Editor Interface

    +

    You should now see the editor interface. (yours will look slightly different to this)

    +

    Annotated Editor Interface

    +

    The green sidebar is the projects panel. This is where you can access or +export your existing projects, and create or import new ones. Clicking on a project in this list will open it in the +editor.

    +
      +
    • The orange button is the import button. This lets you load a saved project +into the editor.
    • +
    • The blue button is the create project button. This is how you +create a project.
    • +
    • The red button is the export button. This allows you to save the project +to your computer as a backup.
    • +
    • The pink button is the delete project button. This will allow you to +delete a project if you don’t want it. There is no way to undo this action.
    • +
    +

    The yellow toolbar is the tab list. This is where you can find all your open +projects. If your project has a white circle at the end of the tab, it means you have unsaved content. Projects are +auto-saved after you stop editing them or when you run your project, but you can also manually save by pressing the CTRL +and S keys simultaneously.

    +

    The teal sidebar is the logs panel. This is where you can see the output +from your robot when you run your program.

    +
      +
    • The dark green button is the run button. Pressing this will prompt you to +save your project to your computer, just as a backup, and then run your code on the robot.
    • +
    • The dark red button is the stop button. Pressing this will force the robot +to stop what it’s doing, useful if your robot is out of control.
    • +
    +

    The main section in the middle is the editor. This will be different depending on whether you’re editing a Python or a +Blockly project.

    +

    Creating a new project

    +

    Click on the create project button (marked in blue in the above screenshot). +The create project dialog will appear:

    +

    Create Project Interface

    +

    Give your project a name, then select the type of project you would like. Choose either Python or Blockly. Then click the create button.

    +

    Your new project will open in the editor. See the sections below for more information on Python and +Blockly projects. Once you’ve read these, why not start learning how to program your robot.

    +

    Python Projects

    +

    Python projects provide a powerful development tool with syntax highlighting and code completion for the standard Python libraries and also the robot module. If you are interested, it uses the text editor that powers Visual Studio Code.

    +

    Blockly Projects

    +

    Google’s Blockly is a programming environment similar to Scratch that allows you to program your robot with blocks. You still have access to all the features of the robot so you are not disadvantaged if you decide to use this over Python.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/patching-the-robot/index.html b/shepherd/blueprints/staticroutes/docs/tools/patching-the-robot/index.html new file mode 100644 index 0000000..588f557 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/patching-the-robot/index.html @@ -0,0 +1,123 @@ + Patching the Robot | RoboCon Docs + + Skip to content

    Patching the Robot

    An important part of looking after your robot is making sure its software is up to date. Over time RoboCon may release patches that allow you to update your robot. Follow the steps below to bring your robot up to date.

    +

    Steps to Patch

    +
      +
    1. +

      Download the patch from the email we sent, or our blog, onto the computer you will be connecting your BrainBox to. 

      +
    2. +
    3. +

      Turn on and connect to your robot. 

      +
    4. +
    5. +

      Navigate to the editor by visiting http://robot.local/ and clicking the orange button 

      +
    6. +
    7. +

      Click the upload button (indicated below). 

      +

      +
    8. +
    9. +

      Navigate to where you have saved the patch and click OK. 

      +
    10. +
    11. +

      Select the patch file in the left-hand panel. The patch will show on the code view as Base64 encoded data (random-looking text characters). 

      +
    12. +
    13. +

      Click the “Run” button (green arrow on the right-hand panel). 

      +

      +
    14. +
    15. +

      After a few moments, your BrainBox should reboot, and the LED will either turn off or remain on. You will lose connection with it while it does this. Do not turn off your BrainBox - the LED may stay off for a couple minutes.

      +
    16. +
    17. +

      The BrainBox LED will eventually start flashing again to show it has rebooted successfully. 

      +
    18. +
    19. +

      If your PC has not automatically connected, connect to it using the WiFi. Once reconnected, refresh your browser and open a project from the left-hand side of the editor. Check that the patch version is correct in the right-hand panel.  

      +
    20. +
    21. +

      If you have any issues, please contact us

      +
    22. +
    + +

    This patch’s passphrase is:

    +

    Why are dragons good at music? +They know lots of scales

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/running-code-from-a-usb/index.html b/shepherd/blueprints/staticroutes/docs/tools/running-code-from-a-usb/index.html new file mode 100644 index 0000000..46bfff5 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/running-code-from-a-usb/index.html @@ -0,0 +1,127 @@ + USB Tricks | RoboCon Docs + + Skip to content

    USB Tricks

    USB Stick

    + + +

    Running your code from a USB:

    +

    When started, using the start button the robot will default to running the last piece of code written in the editor. In some cases at the competition it can be useful to be able to run code from a USB stick.

    +
      +
    1. Place a file called main.py or code.zip (which must include a file called main.py) in the root directory of the USB stick on another computer.
    2. +
    3. Turn on the robot using the red power button.
    4. +
    5. The file will be automatically copied from the USB stick
    6. +
    7. Press the black start button
    8. +
    + +

    Getting Logs

    +

    When running your robot code you can see the logs from the robot in the editor. Sometimes it’s useful to be able to view the logs later to analyse what happened.

    + +
      +
    1. Insert a USB stick in the robot before turning it on.
    2. +
    3. The log file will be automatically written to the USB stick as logs.txt
    4. +
    5. Remember to fully power down the robot before removing the USB stick
    6. +
    + +
    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
    File "/usr/lib/python2.7/threading.py", line 754, in run
    self.\_\_target(\*self.\_\_args, \**self.__kwargs)
    File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site
    self.run()
    File "/usr/lib/python2.7/threading.py", line 754, in run
    self.\_\_target(\*self.\_\_args, \**self.__kwargs)
    -packages/robot/wrapper.py", line 251, in wait_start_blink
    self._internal.set_status_led(v)
    File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site-packages/robot/greengiant.py", line 87, in set_status_led
    self._bus.write_byte_data(_GG_I2C_ADDR, _GG_STATUS, int(on))
    File "/root/.local/share/virtualenvs/shepherd2-rSdGMoSR/local/lib/python2.7/site-packages/smbus2/smbus2.py", line 377, in write_byte_data
    ioctl(self.fd, I2C_SMBUS, msg)
    IOError: \[Errno 121] Remote I/O error
    +

    These can safely be ignored unless you also see them on the web interface.

    +

    Collecting images and raw analysis

    +

    Every time the robot takes a picture it is updated on the web interface, during development it is occasionally useful to be able to also keep a log of pictures that have been analysed to check camera focus, motion blur etc.

    +
      +
    1. Add a file with the name “collect_images.txt” to the USB stick to collect the images
    2. +
    3. Add a file with the name “log_markers.txt” to the USB stick to collect analysis of images
    4. +
    5. Insert the stick before turning the robot on
    6. +
    7. Remember to fully shut down the robot before removing the USB stick +WARNING: Collecting all images may slow down the processing time from your robot - Use with care!
    8. +
    +

    Updating your team image

    +

    When the robot boots, it loads a default image which is displayed until the robot takes a picture, in the arena these images are displayed on an overhead projector. You can change the default image.

    +
      +
    1. Save your Image as 440x330 pixels in jpeg format onto the USB stick as “team_logo.jpg”
    2. +
    3. Boot the robot once to install the image
    4. +
    5. Fully shut down the robot
    6. +
    7. The image will be used from the next time the robot is booted
    8. +
    +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/troubleshooting/index.html b/shepherd/blueprints/staticroutes/docs/tools/troubleshooting/index.html new file mode 100644 index 0000000..b0589dc --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/troubleshooting/index.html @@ -0,0 +1,109 @@ + Troubleshooting | RoboCon Docs + + Skip to content

    Troubleshooting

    Here are a few common issues you might have and some solutions to them. Student Robotics has a similar section on their website which is also relevant.

    +

    I’ve connected a battery and the power switch to the black connector but never get any lights on The BrainBox.

    +

    Unless the battery is really very low the front led will blink very briefly when the switch is first pressed. If this happens you need to charge the battery. The BrainBox will not switch on at all when the voltage of the battery is very low. If the battery is freshly charged, it’s possible that the switch has failed or become internally disconnected. For testing purposes, you can swap the power switch for a single piece of wire. NOTE: at the competition, you must have a red power switch to control your robot as per the rules. Finally - in exceptional circumstances the fuse in the cable may have failed, if this has happened then there must have been some terminal problem internal to the BrainBox - contact us for instructions.

    +

    The BrainBox appears to power up, but I can’t connect to the website and the blue LED lights up but never starts flashing.

    +

    This can happen if erroneous code which does not start with R = robot.Robot() is uploaded to The BrainBox. If you think this may have happened, download this file and place it on a USB stick. Put the USB stick into The BrainBox and turn the robot on normally. Wait 5 minutes, if you do not at this point get the flashing blue light, contact us.

    + +

    I’ve connected a battery and the power switch to the black connector but never get any lights on the Brainbox

    +

    If the battery is fresh, it’s possible that the switch has failed or become internally disconnected. For testing purposes, you can swap the power switch for a single piece of wire. NOTE: at the competition, you must have a red power switch to control your robot as per the rules. Finally - in exceptional circumstances the fuse in the cable may have failed, if this has happened then there must have been some terminal problem internal to the BrainBox - contact us for instructions.

    +

    The BrainBox appears to power up, the blue LED light flashes but I cannot connect to it using the WiFi.

    +

    We apologise for the poor choice of font, zeroes and capital-o’s can be confused as can capital-i’s and number ones. Try swapping these. If this does not help, or the status LEDs stop behaving as expected, try restarting your brain. If the issue persists, contact us for further advice.

    +

    The BrainBox appears to power up, I can connect to it with WiFi, but am unable to reach the web interface.

    +

    Some modern browsers default to a web search if they do not understand the web address. Try putting http:// in front of the address, e.g. http://robot.local instead of robot.local. If this does not help, or the status LEDs stop behaving as expected, try restarting your brain. If the issue persists, contact us for further advice.

    +

    I’ve connected to the web interface and can run code, but my motors never turn on.

    +

    The BrainBox will automatically cut power to the 12V socket and the motor outputs if it detects a current surge exceeding 20A. When this happens, the centre LED (“Error/Wait”) next to where the battery LEDS are will flash red. First disconnect the motors and power cycle the BrainBox to see if this resolves the problem. If it does, then your motors are probably too large.

    +

    It is possible to enable/disable this power output from software. When the output is disabled, there will be no light at all visible through this hole. If you can see no light through the hole when the robot is running code check that you have not disabled the motor output by uploading a simple file and running it.

    +

    I’m trying to read an analog value from GPIOs, but I’m getting strange values.

    +

    Check you’re actually reading the pin you’re trying to read. R.gpio[0] is Pin 0, R.gpio[3] is Pin 3, etc. If everything’s connected correctly, try setting the other pins to output and writing False to them.

    +

    R.see() doesn’t seem to work.

    +

    When you call R.see() the camera preview in the top right should show you what the camera can see. If this image is consistently blurred, incorrect looking, or not loading, try placing some markers in front of the camera and try:

    +
    print(R.see())
    +

    If this prints out the markers you placed in front of the robot in the debug console, the issue is most likely just with the editor’s camera preview. Contact us if the issue persists, but this shouldn’t prevent your robot from running the code. +However, if the robot cannot find markers, then the camera itself is most likely having problems. Contact us about changing the focus of the camera. Note that the robot being in motion may add blur to the images taken, and prevent the marker detection system from functioning.

    + +

    Can you post a kit to or from Hills Road

    +

    We can post kits from Hills Road however you will need to cover the costs of shipping. To return kits, see Kit List of Parts.

    +

    What is the patch and how do I install it?

    +

    The patch is an update which improve your BrainBox, by adding more docs, more blocks to blocky, faster boot times and more! To patch your robot please follow the instructions here.

    +

    Why is the time wrong

    +

    The Raspberry Pi does not keep time when it is off and so has no way of knowing how much time has passed since it was turned off. This should not affect your code.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tools/uploading/index.html b/shepherd/blueprints/staticroutes/docs/tools/uploading/index.html new file mode 100644 index 0000000..e97d77e --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tools/uploading/index.html @@ -0,0 +1,109 @@ + Uploading and Running Code | RoboCon Docs + + Skip to content

    Uploading and Running Code

    +

    If you’ve written code outside of the editor environment, you’ll want to upload and run it on your robot. You can use the steps below to do this, +but we strongly recommend using the editor.

    + +

    Upload

    + +

    Assuming you’ve connected to your robot, head to http://robot.go/upload

    +

    You should now see the upload interface.

    +

    Upload Interface

    +

    Click on the Choose file button and select either:

    +
      +
    • A single Python 3 source file
    • +
    • A zip file containing one or more Python 2 source files. The file must contain a file named main.py in the root of +the archive. This should be the entry point for the program.
    • +
    +

    Now click the Upload button to upload the selected file.

    + +

    Run

    +

    If you’re on the Upload page, click the run it from this page link. Otherwise, you can access the run page at +http://robot.go/run or by clicking the green run button on the Shepherd homepage (note upload button has been removed to simplify the UI).

    +

    Run Button

    +

    You should now see the run interface.

    +

    Run Interface

    +

    Choose the zone you’d like the robot to think it’s in and then choose the mode. Development mode has no round timer +meaning your code can run for as long as you need it to. Competition mode stops your code after 3 minutes, like it +would in the arena.

    + +

    When you’re ready, press the big Start button.

    +

    You’ll now be able to see what the robot sees and the output of your program below.

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/troubleshooting.html b/shepherd/blueprints/staticroutes/docs/troubleshooting.html deleted file mode 100644 index 7644462..0000000 --- a/shepherd/blueprints/staticroutes/docs/troubleshooting.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - Troubleshooting | Robocon - - - - - - - -

    Troubleshooting

    Here are a few common issues you might have and some solutions to them. Student Robotics has a similar section on their website which is also relevant.

    I've connected a battery and the power switch to the black connector but never get any lights on The BrainBox.

    Unless the battery is really very low the front led will blink very briefly when the switch is first pressed. If this happens you need to charge the battery. The BrainBox will not switch on at all when the voltage of the battery is very low. If the battery is freshly charged, it's possible that the switch has failed or become internally disconnected. For testing purposes, you can swap the power switch for a single piece of wire. NOTE: at the competition, you must have a red power switch to control your robot as per the rules. Finally - in exceptional circumstances the fuse in the cable may have failed, if this has happened then there must have been some terminal problem internal to the BrainBox - contact us for instructions.

    The BrainBox appears to power up, but I can't connect to the website and the blue LED lights up but never starts flashing.

    This can happen if erroneous code which does not start with R = robot.Robot() is uploaded to The BrainBox. If you think this may have happened, download this file and place it on a USB stick. Put the USB stick into The BrainBox and turn the robot on normally. Wait 5 minutes, if you do not at this point get the flashing blue light, contact us.

    WARNING

    Using this file will overwrite the current robot code. It will not touch any other files you have stored in the editor.

    I've connected a battery and the power switch to the black connector but never get any lights on the Brainbox

    If the battery is fresh, it's possible that the switch has failed or become internally disconnected. For testing purposes, you can swap the power switch for a single piece of wire. NOTE: at the competition, you must have a red power switch to control your robot as per the rules. Finally - in exceptional circumstances the fuse in the cable may have failed, if this has happened then there must have been some terminal problem internal to the BrainBox - contact us for instructions.

    The BrainBox appears to power up, the blue LED light flashes but I cannot connect to it using the WiFi.

    We apologise for the poor choice of font, zeroes and capital-o's can be confused as can capital-i's and number ones. Try swapping these. If this does not help, or the status LEDs stop behaving as expected, try restarting your brain. If the issue persists, contact us for further advice.

    The BrainBox appears to power up, I can connect to it with WiFi, but am unable to reach the web interface.

    Some modern browsers default to a web search if they do not understand the web address. Try putting http:// in front of the address, e.g. http://robot.local instead of robot.local. If this does not help, or the status LEDs stop behaving as expected, try restarting your brain. If the issue persists, contact us for further advice.

    I've connected to the web interface and can run code, but my motors never turn on.

    The BrainBox will automatically cut power to the 12V socket and the motor outputs if it detects a current surge exceeding 20A. When this happens, the centre LED ("Error/Wait") next to where the battery LEDS are will flash red. First disconnect the motors and power cycle the BrainBox to see if this resolves the problem. If it does, then your motors are probably too large.

    It is possible to enable/disable this power output from software. When the output is disabled, there will be no light at all visible through this hole. If you can see no light through the hole when the robot is running code check that you have not disabled the motor output by uploading a simple file and running it.

    I'm trying to read an analog value from GPIOs, but I'm getting strange values.

    Check you're actually reading the pin you're trying to read. R.gpio[0] is Pin 0, R.gpio[3] is Pin 3, etc. If everything's connected correctly, try setting the other pins to output and writing False to them.

    R.see() doesn't seem to work.

    When you call R.see() the camera preview in the top right should show you what the camera can see. If this image is consistently blurred, incorrect looking, or not loading, try placing some markers in front of the camera and try:

    print(R.see())
    -

    If this prints out the markers you placed in front of the robot in the debug console, the issue is most likely just with the editor's camera preview. Contact us if the issue persists, but this shouldn't prevent your robot from running the code. -However, if the robot cannot find markers, then the camera itself is most likely having problems. Contact us about changing the focus of the camera. Note that the robot being in motion may add blur to the images taken, and prevent the marker detection system from functioning.

    TIP

    Calling R.see() at a high rate (with a sleep of less than 2 seconds between each call, or no sleep at all) may result in issues with the camera preview such as frames being dropped or blurred. Try slowing down your loop to see if this helps with the issue.

    Can you post a kit to or from Hills Road

    We can post kits from Hills Road however you will need to cover the costs of shipping. To return kits, see Kit List of Parts

    What is the patch and how do I install it?

    The patch is an update which improve your BrainBox, by adding more docs, more blocks to blocky, faster boot times and more! To patch your robot please follow the instructions here.

    Why is the time wrong

    The Raspberry Pi does not keep time when it is off and so has no way of knowing how much time has passed since it was turned off. This should not affect your code.

    - - - diff --git a/shepherd/blueprints/staticroutes/docs/turning-everything-on.html b/shepherd/blueprints/staticroutes/docs/turning-everything-on.html deleted file mode 100644 index bbd8262..0000000 --- a/shepherd/blueprints/staticroutes/docs/turning-everything-on.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Turning everything on | Robocon - - - - - - - -

    The BrainBox

    The BrainBox is the core of the kit which we provide. In it is all of the electronics and software you need to power a robot. Lets start by turning it on. Take a battery from the kit and plug the yellow end into the corresponding port on the brain box (Labelled "Battery"), ensuring that it is the right way round. Then take a red "power button" and connect that to the black connector along the top of the BrainBox. Using the green ended button provided will not work, as this button is momentary and will not maintain power to the BrainBox.

    Diagram showing the pinout of the top of the BrainBox

    Pressing the start button will cause the blue status LED on the front of the BrainBox to turn on. When the light starts flashing your BrainBox is ready to run code. You can now turn on your tablet by pressing the power button on the left-hand side and connect to your robot. The status LED will go solid while code is running.

    How to turn everything off

    When you are done for the day, press the power button, the status LED will flash rapidly. When this has turned off you may unplug the battery.

    WARNING

    Unplugging the battery before the status LED turns off will cause the Pi to lose power before it has finished shutting down which could permanently damage its SD card. Always wait till all the lights turn off before unplugging power.

    - - - diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/hello-challenges/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/hello-challenges/index.html new file mode 100644 index 0000000..f5c0952 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/hello-challenges/index.html @@ -0,0 +1,93 @@ + Hello Challenges | RoboCon Docs + + Skip to content

    Hello Challenges

    The following are challenges for you to attempt and might give you a some help for the competition…

    +
      +
    1. Create a program that turns a LED on when a button is pressed.
    2. +
    3. Create a program that makes the robot move a given distance.
    4. +
    5. Create a program that makes a robot turn towards the first marker it sees.
    6. +
    7. Create a program that makes the robot move towards the first marker it sees.
    8. +
    +

    More challenges

    +

    At the launch, we gave teams a PDF of challenges to complete. You can find a +copy of that here. +Note that quite a few of these require input from the red shirts, so you may have to adapt them to suit what you have available!

    +

    Next Steps

    +

    You are now familiar with the RoboCon kit! We recomend that you now start thinking about your strategy for how you will win. Design your robot in little steps, and test along the way - getting a prototype up and rolling is the best way to ensure your robot will be achieving your goals by the time the competition rolls around! So best of luck, and don’t delay - you’ve got some engineering to do…

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/hello-gpio/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/hello-gpio/index.html new file mode 100644 index 0000000..e839035 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/hello-gpio/index.html @@ -0,0 +1,111 @@ + Hello GPIO | RoboCon Docs + + Skip to content

    Hello GPIO

    GPIO, or General Purpose Input Output, is the main way you’ll interface with simple or obscure bits of hardware. This tutorial will introduce the GPIO system and how to use it.

    +

    GPIO Pins

    +

    On the side of your BrainBox, there are 4 regular pins and a “+5V” and ”-” pin. The top of the BrainBox labels which pin corresponds to which number. Different devices need to be plugged into different pins.

    +

    LED Output

    + +

    If you want to put an LED on your robot, for testing or just for looks, you’ll need to plug the short leg of the LED into the - (ground) pin, and the long leg of the LED into any regular pin (such as 1). Then, use the following code to set up the pin in OUTPUT mode and turn the LED on:

    +
    import robot
    R = robot.Robot()
    +
    # If you're not using GPIO pin 1, change this number to whatever pin you're using.
    R.gpio[0].mode = robot.OUTPUT
    R.gpio[0].digital = True
    +

    Try using a loop to make the light turn on and off every 2 seconds. You’ll need the time library from the motors exercise.

    +

    Buttons

    +

    While your robot hopefully won’t be colliding with much, buttons are a good way for a robot to know if it’s driven into something. Buttons should be plugged into the - pin and a regular pin (such as 0). Using the INPUT_PULLUP mode, you can detect when a button is pressed.

    +
    import robot
    import time
    R = robot.Robot()
    +
    # If you're not using GPIO pin 0, change this number to whatever pin you're using.
    R.gpio[0].mode = robot.INPUT_PULLUP
    +
    while True:
    if not R.gpio[0].digital:
    print("Pressed")
    else:
    print("Not Pressed")
    time.sleep(0.1)
    +

    Note that INPUT_PULLUP returns inverted values - True when it isn’t pressed and False when it is. This means we use not to invert the output we get back to something more sensible for our use.

    +

    Try making a light turn on or off depending on if a button is pressed. An explanation of why it is needed to use INPUT_PULLUP can be found in the GPIO documentation.

    +

    Potentiometers

    +

    Another form of input is a potentiometer or a variable resistor. Potentiometers should be plugged into the +5V, a regular pin (such as 3) and the - pin. Using INPUT_ANALOG mode, you can read the voltage output of the resistor (between 0V and 5V).

    +
    import robot
    +
    R = robot.Robot()
    +
    POT_PIN = 3
    +
    R.gpio[POT_PIN].mode = robot.INPUT_ANALOG
    +
    while True:
    print(R.gpio[POT_PIN].analog)
    +

    Using sensors with retroreflective tape

    +

    You can also use retroreflective sensors with your robot’s GPIO. This can be configured in the code as follows:

    +
    import robot
    import time
    +
    R = robot.Robot()
    +
    R.gpio[0].mode = robot.INPUT
    +
    while True:
    if not R.gpio[0].digital:
    print("Reflecting!")
    time.sleep(1)
    +

    This is a piece of code, that when run, should detect things very close to the sensor, or reflective objects further away (such as the retroreflective tape in the arena).
    +Note that the detector also returns False when it detects something, so not is used. Retroreflective tape is used in the arena to mark the borders of each quadrant. Using a sensor like this facing downwards can allow your robot to detect when it passes into a new quadrant. This could be used for a whole variety of helpful tasks when navigating the arena. We look forward to seeing your creativity!

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/hello-motors/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/hello-motors/index.html new file mode 100644 index 0000000..4c7b041 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/hello-motors/index.html @@ -0,0 +1,117 @@ + Hello Motors | RoboCon Docs + + Skip to content

    Hello Motors

    Your robot is unlikely to score many points if it doesn’t go anywhere. This tutorial will show you how to access and turn the motors on your robot.

    +

    Getting Ready

    +

    First things first, make sure that your robot is not about to drive off a table. Even if you’re planning on turning on the spot, it’s best to put your robot on the floor in case it does something unexpected.

    +

    Next, you’ll need to initialise the robot. For this exercise, you’ll also need the “time” Python library - remember that we used this last chapter to help our camera code along.

    +
    import time
    import robot
    R = robot.Robot()
    +

    Driving Around

    + +

    Now that everything is set up, it’s time to set the motors. All the motors are stored in a list inside the Robot variable - to access the first motor, you can use R.motors[0], the second motor is found with R.motors[1].

    +

    Changing the speed of the motor is easy - just set the motor to a number from -100 to 100. Immediately setting the power to 100 can have unwanted side effects, so we’ll start by setting them to half power:

    +
    import time
    import robot
    R = robot.Robot()
    +
    R.motors[0] = 50
    R.motors[1] = 50
    +

    Running this program will either make you move forwards or make your robot turn on the spot, depending on how you have set up the motors. If your motor is spinning, try setting one of the motors to the negative value, spinning it in the other direction, and swap which one is negative until your robot drives forwards in a way you are happy with.

    +

    The issue with this code is that unfortunately, it will never tell it to stop moving forwards, so hopefully you put it on the floor and it hasn’t driven off the table.
    +To fix this we can set the power of the motors to 0 after a couple of seconds:

    +
    import time
    import robot
    R = robot.Robot()
    +
    R.motors[0] = 50
    R.motors[1] = 50
    +
    time.sleep(2)
    +
    R.motors[0] = 0
    R.motors[1] = 0
    +

    This is where sleep() becomes handy. It pauses the execution of your code with the motors still at 50, and so they stay running until we stop them after the sleep() call ends.

    +

    To turn the robot, you just need to set one motor going forwards and the second motor going backwards. The following program makes the robot do a little dance - try it out! (Note that if your robot had inverted motors from earlier, you may have differing results)

    +
    import time
    import robot
    R = robot.Robot()
    +
    speed = 50
    +
    R.motors[0] = speed
    R.motors[1] = speed
    +
    time.sleep(2)
    +
    R.motors[0] = speed
    R.motors[1] = -speed
    +
    time.sleep(2)
    +
    R.motors[0] = -speed
    R.motors[1] = -speed
    +
    time.sleep(2)
    +
    R.motors[0] = -speed
    R.motors[1] = speed
    +
    time.sleep(2)
    +
    R.motors[0] = 0
    R.motors[1] = 0
    +

    A final note, even if you set both motors the same power, your robot probably won’t drive in a perfectly straight line. This is due to defects in the motors, and unless you get specialised motors, no two motors will have the same offset. How your robot deals with this is up to you!

    +

    Troubleshooting and Further Reading

    +

    Connecting to the robot
    +Uploading and running code
    +Using the editor
    +Motors

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/hello-servos/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/hello-servos/index.html new file mode 100644 index 0000000..5b99391 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/hello-servos/index.html @@ -0,0 +1,88 @@ + Hello Servos | RoboCon Docs + + Skip to content

    Hello Servos

    Servos are a type of motor with internal feedback they can move to a set position. The type of servo you will come across most frequently have a set range of motion, but with precise position control you can do a whole manner of actions within the mechanics of your robot! Servo motors (or anything else you connect to the servo ports of your BrainBox) are controlled by accessing R.servos[], similar to how motors are accessed.

    +
    import robot
    import time
    +
    R = robot.Robot()
    R.servos[0].mode = robot.PWM_SERVO
    +
    R.servos[0] = 50
    +
    time.sleep(1)
    +

    However, where the value of a motor determines the speed it turns, the value of a servo controls the position it is at on its rotation, with a range of -100 to 100. Try it out on your robot to see which values correspond to each position!

    +

    Servos take a moment to move into their new positions, so it’s a good idea to add a delay after setting positions (use time.sleep) if it might affect your robot later.

    +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/hello-vision/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/hello-vision/index.html new file mode 100644 index 0000000..bd0e8fb --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/hello-vision/index.html @@ -0,0 +1,105 @@ + Hello Vision | RoboCon Docs + + Skip to content

    Hello Vision

    Your robot can use its camera to see markers to identify tokens and walls. This tutorial will help you make a program that makes the robot output the number of cubes it can see.

    +

    Initialising the Robot

    +

    Create a new script called “VisionTest”.

    +

    Unlike in the previous tutorial, Hello World, the use of the first couple lines of code is important here. So let’s break them down:

    +
    import robot
    R = robot.Robot()
    +

    This creates a “Robot” object, and places it inside the variable “R”. This allows us to use robot functions through the R variable, such as R.See(). If you are using Blockly, the robot is initialised automatically.

    +

    Here is a basic introduction into what Object Oriented Programming is.

    +

    Counting Markers

    +

    To make the robot “see” what is in front of it we have to call the function R.see() and assign the result to a variable. This will set that variable to a list of every marker the robot can see:

    +
    markers = R.see()
    +

    Every item in the list contains information about the type of the marker, the distance/angle to the marker, and more! For now all we want to do is to find the number of markers the robot can see, so we just need to print the length of the list:

    +
    print(len(markers))
    # len gets the length of something,
    # in this case a list of all the markers we can see
    +

    If we run this code as it is, it will output the number of markers it can see once and then stop. To make it continue looking we need to put it in a while True loop, so it will repeat our program forever (or until we turn it off).

    +

    The complete code is as follows:

    +
    import robot
    import time
    R = robot.Robot()
    +
    while True:
    markers = R.see()
    print(len(markers))
    time.sleep(2)
    +

    You’ll notice some new lines we snuck in there - an import time and a time.sleep(2). The first of these adds another toolset to our code, the time library. This most notably adds the sleep function we used just now, which pauses the code’s execution for the number of seconds specified - in this case two.

    + +

    Running the code

    +

    Place a few markers infront of the camera on the robot about 10-20cm away and run the code. In the logs the number of markers visible will be outputted, and in addition to the logs, the raw images taken by the camera can be seen, which can be useful for working out if something is blocking the camera.

    +

    Troubleshooting and Further Reading

    +

    Connecting to the robot
    +Initalising the robot
    +Using the editor
    +Vision Code

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/hello-world/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/hello-world/index.html new file mode 100644 index 0000000..8521617 --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/hello-world/index.html @@ -0,0 +1,117 @@ + Hello World | RoboCon Docs + + Skip to content

    Hello World

    Welcome to the RoboCon tutorials!
    +Following each of the tasks in this category will start you on your way to getting your robot doing stuff.

    +

    Ready? Let’s go!

    +
    +

    These tutorials will always assume that you have connected to the robot, started on the homepage and completed the previous tutorials. To find out how to connect to your robot click here

    +
    +

    Creating your first program

    +

    As this is the first program that your robot will run we’ll make it as simple and clichéd as it can get:
    +We’re going to make the robot write “Hello World!” into the output logs!

    +

    Create a new file

    +

    Run Button

    +
      +
    1. On the main page click the “Editor” button.
    2. +
    3. On the tabs click new file and name it something (e.g. “HelloWorld”)
    4. +
    +

    Writing the Code

    +

    There are two ways to go about writing code for the robot:

    +
      +
    1. Python - The main language used to program robots with the BrainBox.
    2. +
    3. Blockly - A Scratch-like language that allows you to write programs connecting blocks. This will automatically produce a python script that can be run in the robot.
    4. +
    +

    Both can be used to program a winning robot for the competition and it is up to you which one you develop your robot with. However for the following tutorials, Python will be used.

    +

    Details on both these methods can be found in the programming section of the documentation.

    +

    If you are running into problems using the editor, more details can be found here.

    +

    In the editor window write:

    +
    import robot
    +
    R = robot.Robot()
    +
    print("Hello World!")
    +

    You don’t need to know much about what the first couple lines do - they are covered in later chapters, and do setup for the robot to be able to run. The important bit for you to understand is the last bit - the print() statement.

    +

    Running the code

    +

    Click on the green run button in the top right corner:

    +

    Run Button

    +

    The logs should then appear with a friendly “Hello World!”

    +

    Troubleshooting and Further Reading

    +

    Connecting to the robot
    +Uploading and running code
    +Using the editor

    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/tutorials/turning-everything-on/index.html b/shepherd/blueprints/staticroutes/docs/tutorials/turning-everything-on/index.html new file mode 100644 index 0000000..d46af3f --- /dev/null +++ b/shepherd/blueprints/staticroutes/docs/tutorials/turning-everything-on/index.html @@ -0,0 +1,86 @@ + Turning everything on | RoboCon Docs + + Skip to content

    Turning everything on

    The BrainBox is the core of the kit which we provide. In it is all of the electronics and software you need to power a robot. Lets start by turning it on. Take a battery from the kit and plug the yellow end into the corresponding port on the brain box (Labelled “Battery”), ensuring that it is the right way round. Then take a red “power button” and connect that to the black connector along the top of the BrainBox. Using the green ended button provided will not work, as this button is momentary and will not maintain power to the BrainBox.

    +

    Diagram showing the pinout of the top of the BrainBox

    +

    Pressing the start button will cause the blue status LED on the front of the BrainBox to turn on. When the light starts flashing your BrainBox is ready to run code. You can now turn on your tablet by pressing the power button on the left-hand side and connect to your robot. The status LED will go solid while code is running.

    +

    How to turn everything off

    +

    When you are done for the day, press the power button, the status LED will flash rapidly. When this has turned off you may unplug the battery.

    +
    \ No newline at end of file diff --git a/shepherd/blueprints/staticroutes/docs/vision.html b/shepherd/blueprints/staticroutes/docs/vision.html deleted file mode 100644 index 2a21e03..0000000 --- a/shepherd/blueprints/staticroutes/docs/vision.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - Vision | Robocon - - - - - - - -

    Vision

    Computer Vision allows your robots to understand their environment. For the competition, this is used to locate markers. It will give you information about the type of the marker, the distance/angle to the marker, etc.

    Python

    To look for markers call see():

    markers = R.see()
    -
    -print(markers)
    -

    markers is a Python list of "marker objects", which each look like the following:

    [arena Marker 0: 0.856m @0.754 degrees
    -{
    -  info.type = POTATO
    -  info.id = 15
    -  info.owning_team = ARENA
    -  dist = 0.856
    -  bearing.y = 0.754
    -  bearing.x = 1.03e+02
    -  rotation.y = 5.1
    -  rotation.x = -11.4
    -  rotation.z = 9.47
    -  info = TOO BIG TO PRINT
    -  detection = TOO BIG TO PRINT
    -}
    -]
    -

    Full reference of the properties are further below but some useful properties are:

    Property Description
    marker.dist Distance to the marker in metres
    marker.bearing.y The angle your robot needs to turn to get to the marker in degrees
    marker.info.id Numeric code of the marker
    marker.info.type One of ARENA or POTATO
    marker.info.owning_team A team (PURPLE, MARIS_PIPER, etc), ARENA for hot potato or None for walls

    Codes

    TIP

    You do not need to use the marker ids themselves for your calculations. Use marker.type and marker.owning_team instead to find out the information you need (see above).

    Every april tag has a code:

    • April tags 0-39 will be used for cubes. Although only 20 are used in each round, there are another 20 spare in case some get damaged.

    • April tags 100+ will around the arena on the walls. See the rules for -specifics on where around the rules they will be placed

    • You do not need to use the marker numbers, and can instead use marker.type and marker.owning_team

    Function Codes
    Arena Marker 100 - 123
    Ruby 24, 25 Lair marker - 50
    Jade 26, 27 Lair marker - 51
    Topaz 28, 29 Lair marker - 52
    Diamond 30, 30 Lair marker - 53
    Sheep 0 - 23

    Blockly

    Blocks for vision can be found in the Vision section.

    Here's an example of a Blockly program that does some basic vision:

    Example

    After reading the motors documentation you should be able to create a function which moves your robot by a number of meters as well as turn. We can then use this to write some code where a robot:

    • Looks for a marker

    • If it can see a marker:

      • Turn so that it is facing the marker
      • Drive the distance to the marker
    • If there is no marker in sight turn a bit and look again, maybe there is a marker out of view.

    import robot
    -
    -R = robot.Robot()
    -
    -def move(distance):
    -    """The robot drives `distance` meters forwards"""
    -    print("PUT YOUR MOVE CODE HERE")
    -
    -def turn(rotation):
    -    """The robot turns `rotation` degrees"""
    -    print("PUT YOUR TURN CODE HERE")
    -
    -while True:
    -    for marker in R.see():
    -        turn(marker.bearing.y)  # Face the marker
    -        move(marker.dist)       # Drive to the marker
    -    else:
    -        turn(20)  # The robot didn't see anything and so we turn and maybe see
    -                  # another marker
    -

    The Marker object

    Details about the markers can be accessed using the following syntax:

    markers = R.see()  # returns list of markers which the robot can see
    -
    -for marker in markers:
    -    print(marker.dist)       # The distance to the marker in meters
    -    print(marker.bearing.y)  # The rotation the robot would need to turn to
    -                             # face the marker
    -    print(marker.info.id)  # The number of the marker
    -else:
    -    print("The robot didn't see any markers and skipped the for loop!")
    -

    A Marker object contains information about a detected marker. It has the following attributes:

    Attribute What it does
    dist The distance to the Marker from the camera in meters.
    bearing How far the BrainBox would have to rotate to face that Marker in degrees
    bearing.x The up/down bearing. 0 is vertically bellow the camera
    bearing.y The left/right bearing. 0 is straight ahead from the camera
    rotation How much the Marker would need to be rotated to face the BrainBox. (0,0,0) Is if the marker was facing the BrainBox in the upright position
    rotation.x The roll of the marker
    rotation.y The pitch of the marker
    rotation.z The yaw of the marker
    info An object with various information about the marker
    info.id The ID number of the marker
    info.size The length of the black edge of the marker in meters
    info.type The type of marker, a MARKER_TYPE. This is set to either ARENA (walls) or POTATO (potatoes)
    info.owning_team Which team owns the marker, a TEAM. If this is set to ARENA then the potato is a hot potato - make sure you don't get burnt!
    info.bounding_box_colour A tuple describing the colour which is drawn around the marker in the preview image (Blue, Red, Green)
    detection Technical information which has been inferred from the image.
    detection.tag_family The family of AprilTag which is detected. RoboCon currently only uses tag36h11.
    detection.tag_id The ID number of the detected marker. Aliased by marker.info.id.
    detection.hamming The number of bits which were corrected. The detector cannon detect tags with a hamming distance greater than 2.
    detection.decision_margin A measure of the quality of the binary decoding process; the average difference between the intensity of a data bit versus the decision threshold. Higher numbers roughly indicate better decodes. Only effective for tags which appear small.
    detection.homography The 3x3 homography matrix describing the projection from an "ideal" tag (with corners at (-1,1), (1,1), (1,-1), and (-1, -1)) to pixels in the image.
    detection.center The image pixel coordinates of the center of the marker.
    detection.corners The image pixel coordinates of corners of the detected marker
    detection.pose_R The 3x3 Rotational matrix which describes the rotation of the marker relative to the origin.
    detection.pose_T The 1x3 translation vector of the marker in meters.
    detection.pose_err The uncertainty of the detection in meters. This number can vary massively between detections depending on if local minima were bypassed. See Apriltag: A robust and flexible visual fiducial system
    dectection.dist The distance to the marker in meters.
    detection.rotation How much the Marker would need to be rotated to face the BrainBox. (0,0,0) Is if the marker was facing the BrainBox in the upright position.
    detection.bearing How far the BrainBox would have to rotate to face that Marker in degrees.

    TIP

    Axes are all defined relative to the camera not your robot. Since we have -no way to know how you've mounted your camera. You may need to account for this.

    TIP

    You can import MARKER_TYPE and TEAM from robot, for example...

    import robot
    -
    -R = robot.Robot()
    -
    -markers = R.see()
    -
    -for marker in markers:
    -    if marker.info.owner == robot.MARKER_OWNER.ARENA:
    -        print(f"Marker {marker.info.id} is owned by the arena")
    -    elif marker.info.owning_team == R.zone:
    -        print(f"I own {marker.info.id}")
    -    else:
    -        print(f"Marker {marker.info.id} is owned by {marker.info.owning_team}")
    -

    The Camera object

    An interface to the camera is provided incase you want to do additional computer vision.

    Changing the resolution

    By default the camera takes pictures at a resolution of 640x480px. You can change this by setting the res parameter.

    import robot
    -
    -R = robot.Robot()
    -
    -print(f"The current res is set to {R.camera.res}")
    -R.camera.res = (1920, 1440)
    -print(f"The current res is set to {R.camera.res}")
    -

    You must use one of the following resolutions:

    • (640, 480) (default)
    • (1296, 736)
    • (1296, 976)
    • (1920, 1088)
    • (1920, 1440)

    TIP

    Using a higher resolution will increase the amount of time it takes to process the image, but you may be able to see more. Using a smaller resolution will be faster, but markers further away may stop being visible.

    WARNING

    The resolution values may be different on a USB camera. Please see Using USB Cameras (below) for more information.

    Get data straight from the camera

    If you wish to do your own computer vision you can capture frames directly from the camera using robot.camera.capture().

    import robot
    -
    -R = robot.Robot()
    -
    -image = R.camera.capture()
    -
    -image.grey_frame # A 2d numpy array of the image data uint8
    -image.colour_frame # A 3d numpy array of the image data
    -image.colour_type # The encoding method used to store the colour_frame defaults to 8 bit RGB.
    -image.time # A `datetime` object representing approximately the capture time.
    -

    Using USB cameras

    The built-in Pi Camera inside your brain should be great for your robot, however if you would like to use your own USB Camera (perhaps you want to put a camera somewhere else on your robot), you can!

    USB cameras can have slightly different functionality than the built-in Pi Camera, so they'll need some fine tuning before you can use them. The basic steps outlined below should get you up and running.

    Please turn your robot off before plugging in your USB Camera of choice.

    To use a USB camera you will need to initialize the Robot with something which inherits from robot.vision.Camera. Then just call R.see() as you would normally.

    import robot
    -from robot.vision import RoboConUSBCamera
    -
    -R = robot.Robot(camera=RoboConUSBCamera)
    -
    -print(R.see())
    -

    Setting the resolution

    You may now wish to change the resolution of your camera, this can be done the same as before with R.camera.res = (width,height).

    TIP

    Some resolutions may not work with your USB camera, as different cameras support different resolutions. Check your camera's documentation. If you try and use a resolution that your camera doesn't support, you will get an error that will state the closest resolution to the value you attempted to use. Try changing your resolution to the value that the error message suggests!

    For example, to set a USB Camera's resolution to 800x600:

    import robot
    -from robot.vision import RoboConUSBCamera
    -
    -R = robot.Robot(camera=RoboConUSBCamera)
    -
    -R.camera.res = (800, 600)
    -print(R.see())
    -

    Calibrating the camera

    You will then need to calibrate your USB camera as the distance that it reports will not be accurate. You can do this by changing the value in the R.camera.focal_lengths dictionary up or down. By default, the robot will use the focal lengths for a "Logitech C270" camera, it's unlikely this is your camera - so see the steps below on how to calibrate it.

    TIP

    Remember that focal lengths vary for different resolutions. You will need to run the calibration code below to find the focal length for each resolution you intend to use with your USB camera.

    • Place a marker exactly 1m away from the camera (measure this distance). Make sure there are no other markers in sight of the camera.
    • Copy and paste the following code into your editor. Please set the resolution value to a resolution you wish to use.
    import robot
    -from robot.vision import RoboConUSBCamera
    -R = robot.Robot(camera=RoboConUSBCamera)
    -
    -resolution = (640, 480)
    -
    -R.camera.focal_lengths[resolution] = (120, 120) # set the focal lengths to a known bad value
    -R.camera.res = resolution # set resolution
    -
    -marker = R.see()[0] # get first marker
    -d = marker.dist
    -focal_length = 120 / d # focal length = focal length / distance
    -print("Focal length is around:",focal_length)
    -print("Use this in your code to set the correct focal length: R.camera.focal_lengths[resolution] = ("+str(focal_length)+", "+str(focal_length)+")")
    -

    It's worth noting that this is only an average value.

    The code above will output a focal length value which you should use before setting R.camera.res or R.see(). You can also copy the line of code it produces and paste that into your code to set the focal lengths.

    For example, if your focal length was 123 at the resolution of 800x600, you should use the following lines of code, in the same order:

    import robot
    -from robot.vision import RoboConUSBCamera
    -R = robot.Robot(camera=RoboConUSBCamera)
    -
    -R.camera.focal_lengths[resolution] = (123, 123)
    -R.camera.res = resolution
    -
    -marker = R.see()[0]
    -
    - - - diff --git a/shepherd/blueprints/staticroutes/docs/zones.html b/shepherd/blueprints/staticroutes/docs/zones.html deleted file mode 100644 index e5666ed..0000000 --- a/shepherd/blueprints/staticroutes/docs/zones.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Zones | Robocon - - - - - - - -

    Zones

    Your code will probably need to look for different markers depending on the zone your robot starts in. Whilst you could have different files for each zone, there's also a property on the robot object for this.

    Python

    R.zone will be equal to the the start zone of the robot, and will be equal to one of the teams.

    Team Code
    Ruby robot.TEAM.RUBY
    Jade robot.TEAM.JADE
    Topaz robot.TEAM.TOPAZ
    Diamond robot.TEAM.DIAMOND

    Here's an example:

    import robot
    -
    -R = robot.Robot()
    -
    -if R.zone === robot.TEAM.RUBY:
    -    print("Do something!")
    -else:
    -    print("Do something else!")
    -

    This code checks if the first marker in the list belongs to the current robot.

    Blockly

    You can find the zone block in the Movement section.

    - - - diff --git a/shepherd/templates/index.html b/shepherd/templates/index.html index ab74346..2ffd9b3 100644 --- a/shepherd/templates/index.html +++ b/shepherd/templates/index.html @@ -6,7 +6,7 @@