From ef11e169013503a13d76ad2e822aa4181e706ff9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 20 Oct 2024 14:22:41 +0000 Subject: [PATCH] deploy: 5c92afb9aa74cfd6c4c118650cfa5998b0158bd5 --- 404.html | 4 ++-- assets/js/275a01bc.477a2979.js | 1 + assets/js/275a01bc.c6b989a7.js | 1 - assets/js/622dee83.93464809.js | 1 + assets/js/622dee83.a95fbcd6.js | 1 - ...3b6ce.48bdce34.js => 6293b6ce.03d2baae.js} | 2 +- .../js/{main.d45b6e26.js => main.4d698acb.js} | 4 ++-- ...CENSE.txt => main.4d698acb.js.LICENSE.txt} | 0 ...n.386b276d.js => runtime~main.6e2ac15c.js} | 2 +- developer-guide/adding-calibration-type.html | 4 ++-- developer-guide/adding-plugins-to-ui.html | 4 ++-- developer-guide/architecture.html | 4 ++-- developer-guide/avoiding-od.html | 4 ++-- developer-guide/chart-to-ui.html | 9 +++++---- developer-guide/data-stores-intro.html | 4 ++-- developer-guide/events.html | 4 ++-- developer-guide/examples-api.html | 4 ++-- developer-guide/filesystem-locations.html | 4 ++-- developer-guide/hat-button.html | 4 ++-- developer-guide/i2c-addresses.html | 4 ++-- developer-guide/important-concepts.html | 4 ++-- developer-guide/intro-automations.html | 4 ++-- developer-guide/intro-background-jobs.html | 4 ++-- developer-guide/intro-plugins.html | 4 ++-- developer-guide/introduction.html | 4 ++-- developer-guide/local-development.html | 4 ++-- developer-guide/local-storage.html | 4 ++-- developer-guide/mqtt.html | 4 ++-- developer-guide/pi-development.html | 4 ++-- developer-guide/pinout.html | 4 ++-- developer-guide/plugin-as-python-package.html | 4 ++-- developer-guide/sqlite3.html | 4 ++-- developer-guide/web-ui-api.html | 4 ++-- developer-guide/web-ui-introduction.html | 4 ++-- developer-guide/writing-automations-1.html | 4 ++-- developer-guide/writing-automations-2.html | 4 ++-- developer-guide/writing-background-jobs.html | 4 ++-- developer-guide/writing-pump-software.html | 4 ++-- developer-guide/writing-scripts.html | 4 ++-- experiments/algae-day-night-cycle.html | 4 ++-- experiments/caffeine-inhibition.html | 4 ++-- ...continuous-cultures-using-turbidostat.html | 4 ++-- experiments/control-testing.html | 4 ++-- .../directed-evolution-salt-tolerance.html | 4 ++-- experiments/introduction.html | 4 ++-- experiments/low-vs-high-conc-media.html | 4 ++-- experiments/salt-stress-on-yeast.html | 4 ++-- experiments/tags.html | 4 ++-- experiments/tags/caffeine.html | 4 ++-- experiments/tags/continuous-culture.html | 4 ++-- experiments/tags/control.html | 4 ++-- experiments/tags/ethanol.html | 4 ++-- experiments/tags/nutrient.html | 4 ++-- experiments/tags/salt.html | 4 ++-- experiments/tags/secondary-education.html | 4 ++-- experiments/tags/seconday-education.html | 4 ++-- experiments/tags/temperature.html | 4 ++-- experiments/tags/turbidostat.html | 4 ++-- experiments/tags/university-education.html | 4 ++-- experiments/tags/yeast.html | 4 ++-- experiments/temp-cycle.html | 4 ++-- experiments/yeast-growth-by-temperature.html | 4 ++-- experiments/yeast-in-ethanol.html | 4 ++-- index.html | 4 ++-- search-index.json | 2 +- search.html | 4 ++-- user-guide/20ml-v11-hardware-setup-intro.html | 4 ++-- user-guide/20ml-v11-optics-assembly.html | 4 ++-- user-guide/20ml-v11-putting-it-together.html | 4 ++-- user-guide/20ml-v11-rpi-hat-assembly.html | 4 ++-- user-guide/20ml-v11-wetware-assembly.html | 4 ++-- user-guide/accessing-raspberry-pi.html | 4 ++-- user-guide/activities.html | 4 ++-- user-guide/addition-hardware-pumps.html | 4 ++-- user-guide/available-plugins.html | 4 ++-- user-guide/calibrate-od600.html | 4 ++-- user-guide/cli.html | 4 ++-- user-guide/common-questions.html | 4 ++-- user-guide/configuration.html | 4 ++-- user-guide/create-cluster.html | 4 ++-- .../create-edit-experiment-profiles.html | 4 ++-- user-guide/dosing-automations.html | 4 ++-- user-guide/error-codes.html | 4 ++-- user-guide/experiment-profiles-schema.html | 4 ++-- user-guide/experiment-profiles.html | 4 ++-- user-guide/export-data.html | 4 ++-- user-guide/export-import-existing-data.html | 4 ++-- user-guide/external-power.html | 4 ++-- user-guide/getting-started.html | 4 ++-- user-guide/hardware-calibrations.html | 4 ++-- user-guide/hardware-connection-assembly.html | 4 ++-- user-guide/hardware-setup-intro.html | 4 ++-- user-guide/internet-sharing.html | 4 ++-- user-guide/intro-python-scripting.html | 4 ++-- user-guide/intro-to-automations.html | 4 ++-- user-guide/introduction.html | 4 ++-- user-guide/led-automations.html | 4 ++-- user-guide/local-access-point.html | 20 ++++++++++--------- user-guide/manual-dosing-leds.html | 4 ++-- user-guide/monitor-experiment.html | 4 ++-- user-guide/networking.html | 11 +++++----- user-guide/ngrok-remote-access.html | 4 ++-- user-guide/od-normal-growth-rate.html | 4 ++-- user-guide/optics-assembly.html | 4 ++-- user-guide/pinch-valves.html | 4 ++-- user-guide/powering-cluster.html | 4 ++-- user-guide/prepare-vial-for-cultures.html | 4 ++-- user-guide/putting-it-together.html | 4 ++-- user-guide/remote-access.html | 4 ++-- user-guide/rpi-hat-assembly.html | 4 ++-- user-guide/running-self-test.html | 4 ++-- user-guide/set-up-an-experiment.html | 4 ++-- user-guide/software-set-up.html | 4 ++-- user-guide/tailscale-remote-access.html | 4 ++-- user-guide/temperature-automations.html | 4 ++-- user-guide/temperature-expansion-kit.html | 4 ++-- user-guide/troubleshooting-hardware.html | 4 ++-- user-guide/troubleshooting-power.html | 4 ++-- user-guide/troubleshooting-stirring.html | 4 ++-- user-guide/troubleshooting-ui.html | 4 ++-- user-guide/updating-software.html | 4 ++-- user-guide/using-community-plugins.html | 4 ++-- user-guide/using-leds.html | 4 ++-- user-guide/using-pumps.html | 4 ++-- user-guide/using-stemma-qt.html | 4 ++-- .../v11-upgrade-building-vial-holder.html | 4 ++-- user-guide/v11-upgrade-hardware-setup.html | 4 ++-- user-guide/v11-upgrade-optics-assembly.html | 4 ++-- .../v11-upgrade-pioreactor-disassembly.html | 4 ++-- .../v11-upgrade-pioreactor-reassembly.html | 4 ++-- user-guide/wetware-assembly.html | 4 ++-- user-guide/write-own-automations.html | 4 ++-- 132 files changed, 269 insertions(+), 265 deletions(-) create mode 100644 assets/js/275a01bc.477a2979.js delete mode 100644 assets/js/275a01bc.c6b989a7.js create mode 100644 assets/js/622dee83.93464809.js delete mode 100644 assets/js/622dee83.a95fbcd6.js rename assets/js/{6293b6ce.48bdce34.js => 6293b6ce.03d2baae.js} (52%) rename assets/js/{main.d45b6e26.js => main.4d698acb.js} (99%) rename assets/js/{main.d45b6e26.js.LICENSE.txt => main.4d698acb.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.386b276d.js => runtime~main.6e2ac15c.js} (98%) diff --git a/404.html b/404.html index 3cd1f8efd..098978188 100644 --- a/404.html +++ b/404.html @@ -16,8 +16,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/275a01bc.477a2979.js b/assets/js/275a01bc.477a2979.js new file mode 100644 index 000000000..3418843af --- /dev/null +++ b/assets/js/275a01bc.477a2979.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[935],{10425:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=t(85893),r=t(11151);const s={title:"Adding basic time series charts",slug:"/chart-to-ui"},a=void 0,o={id:"User interface/adding-charts",title:"Adding basic time series charts",description:"You can add custom charts to the UI. Below is an example of adding a chart that displays historical and real-time CO2 sensor data.",source:"@site/developer-guide/20-User interface/04-adding-charts.md",sourceDirName:"20-User interface",slug:"/chart-to-ui",permalink:"/developer-guide/chart-to-ui",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Adding basic time series charts",slug:"/chart-to-ui"},sidebar:"tutorialSidebar",previous:{title:"Examples of using the API",permalink:"/developer-guide/examples-api"},next:{title:"Adding a new calibration type",permalink:"/developer-guide/adding-calibration-type"}},c={},d=[{value:"Step 1",id:"step-1",level:3},{value:"Step 2",id:"step-2",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function l(e){const i={a:"a",code:"code",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.p,{children:"You can add custom charts to the UI. Below is an example of adding a chart that displays historical and real-time CO2 sensor data."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"custom chart of CO2 reading",src:t(89255).Z+"",width:"1444",height:"754"})}),"\n",(0,n.jsx)(i.h3,{id:"step-1",children:"Step 1"}),"\n",(0,n.jsxs)(i.p,{children:["Create a yaml file with the following fields, and place it in ",(0,n.jsx)(i.code,{children:"/home/pioreactor/.pioreactor/plugins/ui/contrib/charts/"}),". (Plugins can put the yaml file under ",(0,n.jsx)(i.code,{children:"ui/contrib/charts"})," in there project folder - it will be added upon installation.)"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"chart_key"}),": a unique identifier for the chart being added, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"data_source"}),": the SQL table to read historical data from. The data source must have a ",(0,n.jsx)(i.code,{children:"timestamp"}),", ",(0,n.jsx)(i.code,{children:"pioreactor_unit"}),", and ",(0,n.jsx)(i.code,{children:"experiment"})," column, along with a numeric column to plot (see below), string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"data_source_column"}),": the column in ",(0,n.jsx)(i.code,{children:"data_source"})," to read and display, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"title"}),": title on the chart, string"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"y_axis_label"}),": the y-axis label, string"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"fixed_decimals"}),": How many decimals to display, integer."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"mqtt_topic"}),": a truncated MQTT topic to read live data from - stripped of the ",(0,n.jsx)(i.code,{children:"pioreactor//"})," part. Ex: ",(0,n.jsx)(i.code,{children:"co2_readings/ppm"})," if the entire MQTT topic is ",(0,n.jsx)(i.code,{children:"pioreactor///co2_readings/ppm"}),", string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"payload_key"}),": (Optional) If the MQTT topic is json blobs, use the ",(0,n.jsx)(i.code,{children:"payload_key"})," to retrieve the data from the blob, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"interpolation"}),": (Optional) the interpolation to use between points, default is ",(0,n.jsx)(i.code,{children:"stepAfter"}),", string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"y_axis_domain"}),": (Optional) specify a starting y-axis domain. Must be an array, like ",(0,n.jsx)(i.code,{children:"[0.0, 0.5]"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"y_transformation"}),": (Optional) an inline JS function to transform the y data. Default is the identity function, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"down_sample"}),": (Optional) A boolean to down-sample the data points from the server or not."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["See examples of yaml files ",(0,n.jsx)(i.a,{href:"https://github.com/Pioreactor/pioreactorui/tree/master/contrib/charts",children:"here"})," and ",(0,n.jsx)(i.a,{href:"https://forum.pioreactor.com/t/creating-stirring-rpm-and-pwm-duty-cycle-charts-on-the-ui/339",children:"here"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:"step-2",children:"Step 2"}),"\n",(0,n.jsxs)(i.p,{children:["In your config.ini, add your chart key under ",(0,n.jsx)(i.code,{children:"[ui.overview.charts]"})," and assign it 1. Example:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"[ui.overview.charts]\n# show/hide charts on the PioreactorUI dashboard\n# 1 is show, 0 is hide\n...\nco2_readings=1\n...\n"})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{src:t(71539).Z+"",width:"1168",height:"942"})}),"\n",(0,n.jsx)(i.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"If the UI stops displaying data, you may have introduced a yaml file that is not being read correctly. Check out the Pioreactor UI logs by sshing into the leader, and running:"}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"tail /var/log/pioreactor.log\n"})}),"\n",(0,n.jsx)(i.p,{children:"The last few lines should tell you about if a field is missing, a wrong type, etc."}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"There is a 30 second cache, so it may take up to 30 second to see new changes in the UI."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},71539:(e,i,t)=>{t.d(i,{Z:()=>n});const n=t.p+"assets/images/adding_chart_to_config-0a40556bd41c8cd70abdf292e4f2ef52.png"},89255:(e,i,t)=>{t.d(i,{Z:()=>n});const n=t.p+"assets/images/custom_chart-483a2cbf50e927eda0208ebab3521cae.png"},11151:(e,i,t)=>{t.d(i,{Z:()=>o,a:()=>a});var n=t(67294);const r={},s=n.createContext(r);function a(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/275a01bc.c6b989a7.js b/assets/js/275a01bc.c6b989a7.js deleted file mode 100644 index ad225d0bd..000000000 --- a/assets/js/275a01bc.c6b989a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[935],{10425:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var n=t(85893),r=t(11151);const s={title:"Adding basic time series charts",slug:"/chart-to-ui"},a=void 0,o={id:"User interface/adding-charts",title:"Adding basic time series charts",description:"You can add custom charts to the UI. Below is an example of adding a chart that displays historical and real-time CO2 sensor data.",source:"@site/developer-guide/20-User interface/04-adding-charts.md",sourceDirName:"20-User interface",slug:"/chart-to-ui",permalink:"/developer-guide/chart-to-ui",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Adding basic time series charts",slug:"/chart-to-ui"},sidebar:"tutorialSidebar",previous:{title:"Examples of using the API",permalink:"/developer-guide/examples-api"},next:{title:"Adding a new calibration type",permalink:"/developer-guide/adding-calibration-type"}},c={},d=[{value:"Step 1",id:"step-1",level:3},{value:"Step 2",id:"step-2",level:3},{value:"Troubleshooting",id:"troubleshooting",level:3}];function l(e){const i={a:"a",code:"code",h3:"h3",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.p,{children:"You can add custom charts to the UI. Below is an example of adding a chart that displays historical and real-time CO2 sensor data."}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"custom chart of CO2 reading",src:t(89255).Z+"",width:"1444",height:"754"})}),"\n",(0,n.jsx)(i.h3,{id:"step-1",children:"Step 1"}),"\n",(0,n.jsxs)(i.p,{children:["Create a yaml file with the following fields, and place it in ",(0,n.jsx)(i.code,{children:"/home/pioreactor/.pioreactor/plugins/ui/contrib/charts"}),". (Plugins can put the yaml file under ",(0,n.jsx)(i.code,{children:"ui/contrib/charts"})," in there project folder - it will be added upon installation.)"]}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"chart_key"}),": a unique identifier for the chart being added, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"data_source"}),": the SQL table to read historical data from. The data source must have a ",(0,n.jsx)(i.code,{children:"timestamp"}),", ",(0,n.jsx)(i.code,{children:"pioreactor_unit"}),", and ",(0,n.jsx)(i.code,{children:"experiment"})," column, along with a numeric column to plot (see below), string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"data_source_column"}),": the column in ",(0,n.jsx)(i.code,{children:"data_source"})," to read and display, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"title"}),": title on the chart, string"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"y_axis_label"}),": the y-axis label, string"]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"fixed_decimals"}),": How many decimals to display, integer."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"mqtt_topic"}),": a truncated MQTT topic to read live data from - stripped of the ",(0,n.jsx)(i.code,{children:"pioreactor//"})," part. Ex: ",(0,n.jsx)(i.code,{children:"co2_readings/ppm"})," if the entire MQTT topic is ",(0,n.jsx)(i.code,{children:"pioreactor///co2_readings/ppm"}),", string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"payload_key"}),": (Optional) If the MQTT topic is json blobs, use the ",(0,n.jsx)(i.code,{children:"payload_key"})," to retrieve the data from the blob, string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"interpolation"}),": (Optional) the interpolation to use between points, default is ",(0,n.jsx)(i.code,{children:"stepAfter"}),", string."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"y_axis_domain"}),": (Optional) specify a starting y-axis domain. Must be an array, like ",(0,n.jsx)(i.code,{children:"[0.0, 0.5]"}),"."]}),"\n",(0,n.jsxs)(i.li,{children:[(0,n.jsx)(i.code,{children:"y_transformation"}),": (Optional) an inline JS function to transform the y data. Default is the identity function, string."]}),"\n"]}),"\n",(0,n.jsxs)(i.p,{children:["See examples of yaml files ",(0,n.jsx)(i.a,{href:"https://github.com/Pioreactor/pioreactorui/tree/master/contrib/charts",children:"here"})," and ",(0,n.jsx)(i.a,{href:"https://forum.pioreactor.com/t/creating-stirring-rpm-and-pwm-duty-cycle-charts-on-the-ui/339",children:"here"}),"."]}),"\n",(0,n.jsx)(i.h3,{id:"step-2",children:"Step 2"}),"\n",(0,n.jsxs)(i.p,{children:["In your config.ini, add your chart key under ",(0,n.jsx)(i.code,{children:"[ui.overview.charts]"})," and assign it 1. Example:"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"[ui.overview.charts]\n# show/hide charts on the PioreactorUI dashboard\n# 1 is show, 0 is hide\n...\nco2_readings=1\n...\n"})}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{src:t(71539).Z+"",width:"1168",height:"942"})}),"\n",(0,n.jsx)(i.h3,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"If the UI stops displaying data, you may have introduced a yaml file that is not being read correctly. Check out the Pioreactor UI logs by sshing into the leader, and running:"}),"\n"]}),"\n",(0,n.jsx)(i.pre,{children:(0,n.jsx)(i.code,{children:"tail /var/log/pioreactor.log\n"})}),"\n",(0,n.jsx)(i.p,{children:"The last few lines should tell you about if a field is missing, a wrong type, etc."}),"\n",(0,n.jsxs)(i.ul,{children:["\n",(0,n.jsx)(i.li,{children:"There is a 30sec cache, so it may take up to 30sec to see new changes in the UI."}),"\n"]})]})}function h(e={}){const{wrapper:i}={...(0,r.a)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},71539:(e,i,t)=>{t.d(i,{Z:()=>n});const n=t.p+"assets/images/adding_chart_to_config-0a40556bd41c8cd70abdf292e4f2ef52.png"},89255:(e,i,t)=>{t.d(i,{Z:()=>n});const n=t.p+"assets/images/custom_chart-483a2cbf50e927eda0208ebab3521cae.png"},11151:(e,i,t)=>{t.d(i,{Z:()=>o,a:()=>a});var n=t(67294);const r={},s=n.createContext(r);function a(e){const i=n.useContext(s);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),n.createElement(s.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/622dee83.93464809.js b/assets/js/622dee83.93464809.js new file mode 100644 index 000000000..d6126acc2 --- /dev/null +++ b/assets/js/622dee83.93464809.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[8596],{95980:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var i=o(85893),t=o(11151);const r={title:"Networking tools",slug:"/networking"},s=void 0,c={id:"Advanced/networking/networking",title:"Networking tools",description:"Previously, Raspberry Pis used a file called wpasupplicant.conf to handle wifi network connections. **This is not longer the case**. Modern Raspberry Pi software, including the Pioreactor, doesn't use wpasupplicant.conf at all. Instead, the tool nmcli replaces it. Don't follow tutorials that use wpa_supplicant.conf.",source:"@site/user-guide/30-Advanced/02-networking/10-networking.md",sourceDirName:"30-Advanced/02-networking",slug:"/networking",permalink:"/user-guide/networking",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Networking tools",slug:"/networking"},sidebar:"tutorialSidebar",previous:{title:"Local access points",permalink:"/user-guide/local-access-point"},next:{title:"More on peristaltic pumps",permalink:"/user-guide/addition-hardware-pumps"}},l={},a=[{value:"General networking tools",id:"general-networking-tools",level:2},{value:"Connecting to a wifi network using nmcli",id:"connecting-to-a-wifi-network-using-nmcli",level:3},{value:"Connecting to multiple networks simultaneously",id:"connecting-to-multiple-networks-simultaneously",level:3},{value:"Starting the Pioreactor local access point using nmcli",id:"starting-the-pioreactor-local-access-point-using-nmcli",level:3},{value:"Changing leader_address and MQTT broker in your config.ini",id:"changing-leader_address-and-mqtt-broker-in-your-configini",level:4},{value:"Changing web UI port from 80 to something else",id:"changing-web-ui-port-from-80-to-something-else",level:3},{value:"Connecting to eduroam",id:"connecting-to-eduroam",level:2},{value:"Common questions",id:"common-questions",level:2},{value:"My Pioreactor activities start very slowly from the UI",id:"my-pioreactor-activities-start-very-slowly-from-the-ui",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Previously, Raspberry Pis used a file called ",(0,i.jsx)(n.code,{children:"wpa_supplicant.conf"})," to handle wifi network connections. ",(0,i.jsx)(n.strong,{children:"This is not longer the case"}),". Modern Raspberry Pi software, including the Pioreactor, doesn't use ",(0,i.jsx)(n.code,{children:"wpa_supplicant.conf"})," at all. Instead, the tool ",(0,i.jsx)(n.code,{children:"nmcli"})," replaces it. Don't follow tutorials that use ",(0,i.jsx)(n.code,{children:"wpa_supplicant.conf"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"general-networking-tools",children:"General networking tools"}),"\n",(0,i.jsxs)(n.p,{children:['The main "entry point" for networking on the Pioreactor (and Raspberry Pi\'s in general) is the tool ',(0,i.jsx)(n.code,{children:"nmcli"}),". This controls discovering networks, connecting to them, and editing connections. For example, running ",(0,i.jsx)(n.code,{children:"nmcli con"})," will diplay a list of possible networking connections, and connected ones in green."]}),"\n",(0,i.jsxs)(n.h3,{id:"connecting-to-a-wifi-network-using-nmcli",children:["Connecting to a wifi network using ",(0,i.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,i.jsx)(n.p,{children:"You can first discover all the visible networks with:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli d wifi list\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you see your network on the list, then run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan0\n"})}),"\n",(0,i.jsxs)(n.p,{children:['(If you get a "Can\'t find" error, try running the above ',(0,i.jsx)(n.code,{children:"list"})," command again.)"]}),"\n",(0,i.jsx)(n.h3,{id:"connecting-to-multiple-networks-simultaneously",children:"Connecting to multiple networks simultaneously"}),"\n",(0,i.jsx)(n.p,{children:"First, some terminology and understanding for us: a computer, like a Pi, has networking interfaces. For example, the onboard wifi on RPi\u2019s is one such interface. The larger, model Bs, have an ethernet connector, which is another interface. Each interface can connect to 0 or 1 networks."}),"\n",(0,i.jsxs)(n.p,{children:["In order to connect to multiple networks, you need a Raspberry Pi with multiple interfaces. You can add interfaces with devices like a ",(0,i.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3",children:"USB wifi device"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"To see what your current interfaces are doing, use:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"nmcli device\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The right hand side shows your connected interfaces. For example, if have a ethernet connection to a router, you'll see an ",(0,i.jsx)(n.code,{children:"eth0"})," connection active. If you have an additional wifi hardware device attached to your Pi, you'll see ",(0,i.jsx)(n.code,{children:"wlan1"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["To connect to another wifi network using an external ",(0,i.jsx)(n.code,{children:"wlan1"})," interface, use:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan1\n"})})]}),"\n",(0,i.jsxs)(n.p,{children:["If your leader is connected to multiple networks ",(0,i.jsx)(n.code,{children:"A"})," and ",(0,i.jsx)(n.code,{children:"B"}),", and you access the UI over network ",(0,i.jsx)(n.code,{children:"A"}),", but your workers access over network ",(0,i.jsx)(n.code,{children:"B"}),', the leader is in the position called a "gateway". You\'ll need to make some configuration changes to your cluster. Since the leader is attached to networks ',(0,i.jsx)(n.code,{children:"A"})," and ",(0,i.jsx)(n.code,{children:"B"}),", it has two IPs (use ",(0,i.jsx)(n.code,{children:"hostname -I"})," to see all the ips), let's call them ",(0,i.jsx)(n.code,{children:"ipA"})," and ",(0,i.jsx)(n.code,{children:"ipB"})," respectively."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Access the configuration in the UI."}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.em,{children:"shared"})," config.ini, edit the ",(0,i.jsx)(n.code,{children:"[mqtt]"})," ",(0,i.jsx)(n.code,{children:"broker"})," field to be equal to ",(0,i.jsx)(n.code,{children:"ipA"}),". Also edit the ",(0,i.jsx)(n.code,{children:"leader_address"})," to be ",(0,i.jsx)(n.code,{children:"ipB"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["In each of the workers (including the leader's config.ini, if it's a worker), add the following:","\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[mqtt]\nbroker=ipB\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"You may need to restart your cluster for these to take full effect."}),"\n",(0,i.jsxs)(n.h3,{id:"starting-the-pioreactor-local-access-point-using-nmcli",children:["Starting the ",(0,i.jsx)(n.a,{href:"/user-guide/local-access-point",children:"Pioreactor local access"})," point using ",(0,i.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,i.jsx)(n.p,{children:"Note that you can only have one network connection for each network interface. So if you have only one wifi device (by default, RPi's only have one wifi device on them, which implies only one wifi interface), the following will replace any existing wifi connection."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli con up PioreactorAP\n"})}),"\n",(0,i.jsxs)(n.p,{children:["If have a second wifi device with interface ",(0,i.jsx)(n.code,{children:"wlan1"}),", you can change the interface of the local access point using:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli con modify PioreactorAP ifname wlan1\nsudo nmcli con up PioreactorAP\n"})}),"\n",(0,i.jsxs)(n.h4,{id:"changing-leader_address-and-mqtt-broker-in-your-configini",children:["Changing ",(0,i.jsx)(n.code,{children:"leader_address"})," and MQTT ",(0,i.jsx)(n.code,{children:"broker"})," in your config.ini"]}),"\n",(0,i.jsxs)(n.p,{children:["You may need to change the ",(0,i.jsx)(n.code,{children:"leader_address"})," in your config.ini: this is the address where workers will communicate with your leader."]}),"\n",(0,i.jsxs)(n.p,{children:["Likewise, you may need to change the mqtt ",(0,i.jsx)(n.code,{children:"broker"})," in your config.ini for the same reason. It may be required to change it in the unit specific config.inis."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ini",metastring:'title="config_worker01.ini"',children:"[mqtt]\nbroker=leader.local\n"})}),"\n",(0,i.jsxs)(n.h3,{id:"changing-web-ui-port-from-80-to-something-else",children:["Changing web UI port from ",(0,i.jsx)(n.code,{children:"80"})," to something else"]}),"\n",(0,i.jsxs)(n.p,{children:["To change the web UI port from the default of ",(0,i.jsx)(n.code,{children:"80"}),", following these instructions:"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["This will change the web server port for all leaders and workers. There is currently not a way to have different ports on different Pioreactors. See ",(0,i.jsx)(n.a,{href:"https://github.com/Pioreactor/pioreactor/issues/526",children:"this issue"}),"."]})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"SSH into each Pioreactor in your cluster, leader and workers."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"We'll edit the lighttpd configuration first:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nano /etc/lighttpd/lighttpd.conf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["and find the line starting with ",(0,i.jsx)(n.code,{children:"server.port"}),". Change this to something else (preferably not a value below 1024). Save and exit."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart lighttpd with:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo systemctl restart lighttpd.service\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You should be able to access the web UI only on http://",(0,i.jsx)(n.code,{children:"leader name"}),":",(0,i.jsx)(n.code,{children:"new port"}),", for example: ",(0,i.jsx)(n.a,{href:"http://leader.local:8080",children:"http://leader.local:8080"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In your configuration, under the ",(0,i.jsx)(n.code,{children:"[ui]"})," section, change the ",(0,i.jsx)(n.code,{children:"port"})," option from ",(0,i.jsx)(n.code,{children:"80"})," to your new port value. Save. You may need to restart your cluster for this new port to propagate to all Pioreactors correctly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-eduroam",children:"Connecting to eduroam"}),"\n",(0,i.jsxs)(n.p,{children:["This is a work-in-progress, but here's ",(0,i.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3#connecting-to-eduroam-2",children:"one example"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"common-questions",children:"Common questions"}),"\n",(0,i.jsx)(n.h3,{id:"my-pioreactor-activities-start-very-slowly-from-the-ui",children:"My Pioreactor activities start very slowly from the UI"}),"\n",(0,i.jsxs)(n.p,{children:['It is possible that your mDNS is being blocked or restricted. If possible, log into your router and enable settings that allow "multicast", or "mDNS", or "IGMP proxing". If you are using a the builtin ',(0,i.jsx)(n.a,{href:"/user-guide/local-access-point",children:"local access point"}),", this solution is not the correct one."]}),"\n",(0,i.jsx)(n.p,{children:"Also, if you are able to provide a permanent IPv4 address to your leader, you can get a significant performance boost by setting the configuration some config parameters to the IPv4 address."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[cluster.topology]\n# below is an example, your IPv4 may differ:\nleader_address=192.168.0.3\n\n[mqtt]\nbroker_address=192.168.0.3\n\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,o)=>{o.d(n,{Z:()=>c,a:()=>s});var i=o(67294);const t={},r=i.createContext(t);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/622dee83.a95fbcd6.js b/assets/js/622dee83.a95fbcd6.js deleted file mode 100644 index bb951ad4e..000000000 --- a/assets/js/622dee83.a95fbcd6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[8596],{95980:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=i(85893),t=i(11151);const r={title:"Networking tools",slug:"/networking"},s=void 0,c={id:"Advanced/networking/networking",title:"Networking tools",description:"Previously, Raspberry Pis used a file called wpasupplicant.conf to handle wifi network connections. **This is not longer the case**. Modern Raspberry Pi software, including the Pioreactor, doesn't use wpasupplicant.conf at all. Instead, the tool nmcli replaces it. Don't follow tutorials that use wpa_supplicant.conf.",source:"@site/user-guide/30-Advanced/02-networking/10-networking.md",sourceDirName:"30-Advanced/02-networking",slug:"/networking",permalink:"/user-guide/networking",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Networking tools",slug:"/networking"},sidebar:"tutorialSidebar",previous:{title:"Local access points",permalink:"/user-guide/local-access-point"},next:{title:"More on peristaltic pumps",permalink:"/user-guide/addition-hardware-pumps"}},l={},a=[{value:"General networking tools",id:"general-networking-tools",level:2},{value:"Connecting to a wifi network using nmcli",id:"connecting-to-a-wifi-network-using-nmcli",level:3},{value:"Connecting to multiple networks simultaneously",id:"connecting-to-multiple-networks-simultaneously",level:3},{value:"Starting the Pioreactor local access point using nmcli",id:"starting-the-pioreactor-local-access-point-using-nmcli",level:3},{value:"Changing leader_address and MQTT broker in your config.ini",id:"changing-leader_address-and-mqtt-broker-in-your-configini",level:4},{value:"Changing web UI port from 80 to something else",id:"changing-web-ui-port-from-80-to-something-else",level:3},{value:"Connecting to eduroam",id:"connecting-to-eduroam",level:2},{value:"Common questions",id:"common-questions",level:2},{value:"My Pioreactor activities start very slowly from the UI",id:"my-pioreactor-activities-start-very-slowly-from-the-ui",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["Previously, Raspberry Pis used a file called ",(0,o.jsx)(n.code,{children:"wpa_supplicant.conf"})," to handle wifi network connections. ",(0,o.jsx)(n.strong,{children:"This is not longer the case"}),". Modern Raspberry Pi software, including the Pioreactor, doesn't use ",(0,o.jsx)(n.code,{children:"wpa_supplicant.conf"})," at all. Instead, the tool ",(0,o.jsx)(n.code,{children:"nmcli"})," replaces it. Don't follow tutorials that use ",(0,o.jsx)(n.code,{children:"wpa_supplicant.conf"}),"."]})}),"\n",(0,o.jsx)(n.h2,{id:"general-networking-tools",children:"General networking tools"}),"\n",(0,o.jsxs)(n.p,{children:['The main "entry point" for networking on the Pioreactor (and Raspberry Pi\'s in general) is the tool ',(0,o.jsx)(n.code,{children:"nmcli"}),". This controls discovering networks, connecting to them, and editing connections. For example, running ",(0,o.jsx)(n.code,{children:"nmcli con"})," will diplay a list of possible networking connections, and connected ones in green."]}),"\n",(0,o.jsxs)(n.h3,{id:"connecting-to-a-wifi-network-using-nmcli",children:["Connecting to a wifi network using ",(0,o.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,o.jsx)(n.p,{children:"You can first discover all the visible networks with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli d wifi list\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you see your network on the list, then run:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan0\n"})}),"\n",(0,o.jsxs)(n.p,{children:['(If you get a "Can\'t find" error, try running the above ',(0,o.jsx)(n.code,{children:"list"})," command again.)"]}),"\n",(0,o.jsx)(n.h3,{id:"connecting-to-multiple-networks-simultaneously",children:"Connecting to multiple networks simultaneously"}),"\n",(0,o.jsx)(n.p,{children:"First, some terminology and understanding for us: a computer, like a Pi, has networking interfaces. For example, the onboard wifi on RPi\u2019s is one such interface. The larger, model Bs, have an ethernet connector, which is another interface. Each interface can connect to 0 or 1 networks."}),"\n",(0,o.jsxs)(n.p,{children:["In order to connect to multiple networks, you need a Raspberry Pi with multiple interfaces. You can add interfaces with devices like a ",(0,o.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3",children:"USB wifi device"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To see what your current interfaces are doing, use:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"nmcli device\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The right hand side shows your connected interfaces. For example, if have a ethernet connection to a router, you'll see an ",(0,o.jsx)(n.code,{children:"eth0"})," connection active. If you have an additional wifi hardware device attached to your Pi, you'll see ",(0,o.jsx)(n.code,{children:"wlan1"}),"."]}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsxs)(n.p,{children:["To connect to another wifi network using an external ",(0,o.jsx)(n.code,{children:"wlan1"})," interface, use:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan1\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["If your leader is connected to multiple networks ",(0,o.jsx)(n.code,{children:"A"})," and ",(0,o.jsx)(n.code,{children:"B"}),", and you access the UI over network ",(0,o.jsx)(n.code,{children:"A"}),", but your workers access over network ",(0,o.jsx)(n.code,{children:"B"}),', the leader is in the position called a "gateway". You\'ll need to make some configuration changes to your cluster. Since the leader is attached to networks ',(0,o.jsx)(n.code,{children:"A"})," and ",(0,o.jsx)(n.code,{children:"B"}),", it has two IPs (use ",(0,o.jsx)(n.code,{children:"hostname -I"})," to see all the ips), let's call them ",(0,o.jsx)(n.code,{children:"ipA"})," and ",(0,o.jsx)(n.code,{children:"ipB"})," respectively."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Access the configuration in the UI."}),"\n",(0,o.jsxs)(n.li,{children:["In the ",(0,o.jsx)(n.em,{children:"shared"})," config.ini, edit the ",(0,o.jsx)(n.code,{children:"[mqtt]"})," ",(0,o.jsx)(n.code,{children:"broker"})," field to be equal to ",(0,o.jsx)(n.code,{children:"ipA"}),". Also edit the ",(0,o.jsx)(n.code,{children:"leader_address"})," to be ",(0,o.jsx)(n.code,{children:"ipB"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["In each of the workers (including the leader's config.ini, if it's a worker), add the following:","\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[mqtt]\nbroker=ipB\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"You may need to restart your cluster for these to take full effect."}),"\n",(0,o.jsxs)(n.h3,{id:"starting-the-pioreactor-local-access-point-using-nmcli",children:["Starting the ",(0,o.jsx)(n.a,{href:"/user-guide/local-access-point",children:"Pioreactor local access"})," point using ",(0,o.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,o.jsx)(n.p,{children:"Note that you can only have one network connection for each network interface. So if you have only one wifi device (by default, RPi's only have one wifi device on them, which implies only one wifi interface), the following will replace any existing wifi connection."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli con up PioreactorAP\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If have a second wifi device with interface ",(0,o.jsx)(n.code,{children:"wlan1"}),", you can change the interface of the local access point using:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli connection modify PioreactorAP ifname wlan1\nsudo nmcli con up PioreactorAP\n"})}),"\n",(0,o.jsxs)(n.h4,{id:"changing-leader_address-and-mqtt-broker-in-your-configini",children:["Changing ",(0,o.jsx)(n.code,{children:"leader_address"})," and MQTT ",(0,o.jsx)(n.code,{children:"broker"})," in your config.ini"]}),"\n",(0,o.jsxs)(n.p,{children:["You may need to change the ",(0,o.jsx)(n.code,{children:"leader_address"})," in your config.ini: this is the address where workers will communicate with your leader."]}),"\n",(0,o.jsxs)(n.p,{children:["Likewise, you may need to change the mqtt ",(0,o.jsx)(n.code,{children:"broker"})," in your config.ini for the same reason. It may be required to change it in the unit specific config.inis."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ini",metastring:'title="config_worker01.ini"',children:"[mqtt]\nbroker=leader.local\n"})}),"\n",(0,o.jsxs)(n.h3,{id:"changing-web-ui-port-from-80-to-something-else",children:["Changing web UI port from ",(0,o.jsx)(n.code,{children:"80"})," to something else"]}),"\n",(0,o.jsxs)(n.p,{children:["To change the web UI port from the default of ",(0,o.jsx)(n.code,{children:"80"}),", following these instructions:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"SSH into your leader Pioreactor."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"We'll edit the lighttpd configuration first:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nano /etc/lighttpd/lighttpd.conf\n"})}),"\n",(0,o.jsxs)(n.p,{children:["and find the line starting with ",(0,o.jsx)(n.code,{children:"server.port"}),". Change this to something else (preferably not a value below 1024). Save and exit."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Restart lighttpd with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo systemctl restart lighttpd.service\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You should be able to access the web UI only on http://",(0,o.jsx)(n.code,{children:"leader name"}),":",(0,o.jsx)(n.code,{children:"new port"}),", for example: ",(0,o.jsx)(n.a,{href:"http://leader.local:8080",children:"http://leader.local:8080"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In your configuration, under the ",(0,o.jsx)(n.code,{children:"[ui]"})," section, change the ",(0,o.jsx)(n.code,{children:"port"})," option from ",(0,o.jsx)(n.code,{children:"80"})," to your new port value. Save. You may need to restart your cluster for this new port to propagate to all machines correctly."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"connecting-to-eduroam",children:"Connecting to eduroam"}),"\n",(0,o.jsxs)(n.p,{children:["This is a work-in-progress, but here's ",(0,o.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3#connecting-to-eduroam-2",children:"one example"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"common-questions",children:"Common questions"}),"\n",(0,o.jsx)(n.h3,{id:"my-pioreactor-activities-start-very-slowly-from-the-ui",children:"My Pioreactor activities start very slowly from the UI"}),"\n",(0,o.jsxs)(n.p,{children:['It is possible that your mDNS is being blocked or restricted. If possible, log into your router and enable settings that allow "multicast", or "mDNS", or "IGMP proxing". If you are using a the builtin ',(0,o.jsx)(n.a,{href:"/user-guide/local-access-point",children:"local access point"}),", this solution is not the correct one."]}),"\n",(0,o.jsx)(n.p,{children:"Also, if you are able to provide a permanent IPv4 address to your leader, you can get a significant performance boost by setting the configuration some config parameters to the IPv4 address."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[cluster.topology]\n# below is an example, your IPv4 may differ:\nleader_address=192.168.0.3\n\n[mqtt]\nbroker_address=192.168.0.3\n\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>c,a:()=>s});var o=i(67294);const t={},r=o.createContext(t);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6293b6ce.48bdce34.js b/assets/js/6293b6ce.03d2baae.js similarity index 52% rename from assets/js/6293b6ce.48bdce34.js rename to assets/js/6293b6ce.03d2baae.js index 783b3266f..77596ca1d 100644 --- a/assets/js/6293b6ce.48bdce34.js +++ b/assets/js/6293b6ce.03d2baae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[5214],{81298:(e,a,o)=>{o.r(a),o.d(a,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>m});var n=o(85893),c=o(11151),t=o(67294);function i(){const[e,a]=t.useState("");return(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{children:" Select your country: "}),(0,n.jsx)("select",{name:"country",onChange:e=>a(e.target.value),style:{width:"180px"},children:[{code:"",name:"-- Select --"},{code:"AF",name:"Afghanistan"},{code:"AX",name:"Aland Islands"},{code:"AL",name:"Albania"},{code:"DZ",name:"Algeria"},{code:"AS",name:"American Samoa"},{code:"AD",name:"Andorra"},{code:"AO",name:"Angola"},{code:"AI",name:"Anguilla"},{code:"AQ",name:"Antarctica"},{code:"AG",name:"Antigua And Barbuda"},{code:"AR",name:"Argentina"},{code:"AM",name:"Armenia"},{code:"AW",name:"Aruba"},{code:"AU",name:"Australia"},{code:"AT",name:"Austria"},{code:"AZ",name:"Azerbaijan"},{code:"BS",name:"Bahamas"},{code:"BH",name:"Bahrain"},{code:"BD",name:"Bangladesh"},{code:"BB",name:"Barbados"},{code:"BY",name:"Belarus"},{code:"BE",name:"Belgium"},{code:"BZ",name:"Belize"},{code:"BJ",name:"Benin"},{code:"BM",name:"Bermuda"},{code:"BT",name:"Bhutan"},{code:"BO",name:"Bolivia"},{code:"BA",name:"Bosnia And Herzegovina"},{code:"BW",name:"Botswana"},{code:"BV",name:"Bouvet Island"},{code:"BR",name:"Brazil"},{code:"IO",name:"British Indian Ocean Territory"},{code:"BN",name:"Brunei Darussalam"},{code:"BG",name:"Bulgaria"},{code:"BF",name:"Burkina Faso"},{code:"BI",name:"Burundi"},{code:"KH",name:"Cambodia"},{code:"CM",name:"Cameroon"},{code:"CA",name:"Canada"},{code:"CV",name:"Cape Verde"},{code:"KY",name:"Cayman Islands"},{code:"CF",name:"Central African Republic"},{code:"TD",name:"Chad"},{code:"CL",name:"Chile"},{code:"CN",name:"China"},{code:"CX",name:"Christmas Island"},{code:"CC",name:"Cocos (Keeling) Islands"},{code:"CO",name:"Colombia"},{code:"KM",name:"Comoros"},{code:"CG",name:"Congo"},{code:"CD",name:"Congo, Democratic Republic"},{code:"CK",name:"Cook Islands"},{code:"CR",name:"Costa Rica"},{code:"CI",name:"Cote D'Ivoire"},{code:"HR",name:"Croatia"},{code:"CU",name:"Cuba"},{code:"CY",name:"Cyprus"},{code:"CZ",name:"Czech Republic"},{code:"DK",name:"Denmark"},{code:"DJ",name:"Djibouti"},{code:"DM",name:"Dominica"},{code:"DO",name:"Dominican Republic"},{code:"EC",name:"Ecuador"},{code:"EG",name:"Egypt"},{code:"SV",name:"El Salvador"},{code:"GQ",name:"Equatorial Guinea"},{code:"ER",name:"Eritrea"},{code:"EE",name:"Estonia"},{code:"ET",name:"Ethiopia"},{code:"FK",name:"Falkland Islands (Malvinas)"},{code:"FO",name:"Faroe Islands"},{code:"FJ",name:"Fiji"},{code:"FI",name:"Finland"},{code:"FR",name:"France"},{code:"GF",name:"French Guiana"},{code:"PF",name:"French Polynesia"},{code:"TF",name:"French Southern Territories"},{code:"GA",name:"Gabon"},{code:"GM",name:"Gambia"},{code:"GE",name:"Georgia"},{code:"DE",name:"Germany"},{code:"GH",name:"Ghana"},{code:"GI",name:"Gibraltar"},{code:"GR",name:"Greece"},{code:"GL",name:"Greenland"},{code:"GD",name:"Grenada"},{code:"GP",name:"Guadeloupe"},{code:"GU",name:"Guam"},{code:"GT",name:"Guatemala"},{code:"GG",name:"Guernsey"},{code:"GN",name:"Guinea"},{code:"GW",name:"Guinea-Bissau"},{code:"GY",name:"Guyana"},{code:"HT",name:"Haiti"},{code:"HM",name:"Heard Island & Mcdonald Islands"},{code:"VA",name:"Holy See (Vatican City State)"},{code:"HN",name:"Honduras"},{code:"HK",name:"Hong Kong"},{code:"HU",name:"Hungary"},{code:"IS",name:"Iceland"},{code:"IN",name:"India"},{code:"ID",name:"Indonesia"},{code:"IR",name:"Iran}, Islamic Republic Of"},{code:"IQ",name:"Iraq"},{code:"IE",name:"Ireland"},{code:"IM",name:"Isle Of Man"},{code:"IL",name:"Israel"},{code:"IT",name:"Italy"},{code:"JM",name:"Jamaica"},{code:"JP",name:"Japan"},{code:"JE",name:"Jersey"},{code:"JO",name:"Jordan"},{code:"KZ",name:"Kazakhstan"},{code:"KE",name:"Kenya"},{code:"KI",name:"Kiribati"},{code:"KR",name:"Korea"},{code:"KW",name:"Kuwait"},{code:"KG",name:"Kyrgyzstan"},{code:"LA",name:"Lao People's Democratic Republic"},{code:"LV",name:"Latvia"},{code:"LB",name:"Lebanon"},{code:"LS",name:"Lesotho"},{code:"LR",name:"Liberia"},{code:"LY",name:"Libyan Arab Jamahiriya"},{code:"LI",name:"Liechtenstein"},{code:"LT",name:"Lithuania"},{code:"LU",name:"Luxembourg"},{code:"MO",name:"Macao"},{code:"MK",name:"Macedonia"},{code:"MG",name:"Madagascar"},{code:"MW",name:"Malawi"},{code:"MY",name:"Malaysia"},{code:"MV",name:"Maldives"},{code:"ML",name:"Mali"},{code:"MT",name:"Malta"},{code:"MH",name:"Marshall Islands"},{code:"MQ",name:"Martinique"},{code:"MR",name:"Mauritania"},{code:"MU",name:"Mauritius"},{code:"YT",name:"Mayotte"},{code:"MX",name:"Mexico"},{code:"FM",name:"Micronesia}, Federated States Of"},{code:"MD",name:"Moldova"},{code:"MC",name:"Monaco"},{code:"MN",name:"Mongolia"},{code:"ME",name:"Montenegro"},{code:"MS",name:"Montserrat"},{code:"MA",name:"Morocco"},{code:"MZ",name:"Mozambique"},{code:"MM",name:"Myanmar"},{code:"NA",name:"Namibia"},{code:"NR",name:"Nauru"},{code:"NP",name:"Nepal"},{code:"NL",name:"Netherlands"},{code:"AN",name:"Netherlands Antilles"},{code:"NC",name:"New Caledonia"},{code:"NZ",name:"New Zealand"},{code:"NI",name:"Nicaragua"},{code:"NE",name:"Niger"},{code:"NG",name:"Nigeria"},{code:"NU",name:"Niue"},{code:"NF",name:"Norfolk Island"},{code:"MP",name:"Northern Mariana Islands"},{code:"NO",name:"Norway"},{code:"OM",name:"Oman"},{code:"PK",name:"Pakistan"},{code:"PW",name:"Palau"},{code:"PS",name:"Palestinian Territory}, Occupied"},{code:"PA",name:"Panama"},{code:"PG",name:"Papua New Guinea"},{code:"PY",name:"Paraguay"},{code:"PE",name:"Peru"},{code:"PH",name:"Philippines"},{code:"PN",name:"Pitcairn"},{code:"PL",name:"Poland"},{code:"PT",name:"Portugal"},{code:"PR",name:"Puerto Rico"},{code:"QA",name:"Qatar"},{code:"RE",name:"Reunion"},{code:"RO",name:"Romania"},{code:"RU",name:"Russian Federation"},{code:"RW",name:"Rwanda"},{code:"BL",name:"Saint Barthelemy"},{code:"SH",name:"Saint Helena"},{code:"KN",name:"Saint Kitts And Nevis"},{code:"LC",name:"Saint Lucia"},{code:"MF",name:"Saint Martin"},{code:"PM",name:"Saint Pierre And Miquelon"},{code:"VC",name:"Saint Vincent And Grenadines"},{code:"WS",name:"Samoa"},{code:"SM",name:"San Marino"},{code:"ST",name:"Sao Tome And Principe"},{code:"SA",name:"Saudi Arabia"},{code:"SN",name:"Senegal"},{code:"RS",name:"Serbia"},{code:"SC",name:"Seychelles"},{code:"SL",name:"Sierra Leone"},{code:"SG",name:"Singapore"},{code:"SK",name:"Slovakia"},{code:"SI",name:"Slovenia"},{code:"SB",name:"Solomon Islands"},{code:"SO",name:"Somalia"},{code:"ZA",name:"South Africa"},{code:"GS",name:"South Georgia And Sandwich Isl."},{code:"ES",name:"Spain"},{code:"LK",name:"Sri Lanka"},{code:"SD",name:"Sudan"},{code:"SR",name:"Suriname"},{code:"SJ",name:"Svalbard And Jan Mayen"},{code:"SZ",name:"Swaziland"},{code:"SE",name:"Sweden"},{code:"CH",name:"Switzerland"},{code:"SY",name:"Syrian Arab Republic"},{code:"TW",name:"Taiwan"},{code:"TJ",name:"Tajikistan"},{code:"TZ",name:"Tanzania"},{code:"TH",name:"Thailand"},{code:"TL",name:"Timor-Leste"},{code:"TG",name:"Togo"},{code:"TK",name:"Tokelau"},{code:"TO",name:"Tonga"},{code:"TT",name:"Trinidad And Tobago"},{code:"TN",name:"Tunisia"},{code:"TR",name:"Turkey"},{code:"TM",name:"Turkmenistan"},{code:"TC",name:"Turks And Caicos Islands"},{code:"TV",name:"Tuvalu"},{code:"UG",name:"Uganda"},{code:"UA",name:"Ukraine"},{code:"AE",name:"United Arab Emirates"},{code:"GB",name:"United Kingdom"},{code:"US",name:"United States"},{code:"UM",name:"United States Outlying Islands"},{code:"UY",name:"Uruguay"},{code:"UZ",name:"Uzbekistan"},{code:"VU",name:"Vanuatu"},{code:"VE",name:"Venezuela"},{code:"VN",name:"Vietnam"},{code:"VG",name:"Virgin Islands}, British"},{code:"VI",name:"Virgin Islands}, U.S."},{code:"WF",name:"Wallis And Futuna"},{code:"EH",name:"Western Sahara"},{code:"YE",name:"Yemen"},{code:"ZM",name:"Zambia"},{code:"ZW",name:"Zimbabwe"}].map((e=>(0,n.jsx)("option",{value:e.code,children:e.name})))}),(0,n.jsxs)("span",{children:[" and download the specific ",(0,n.jsx)("code",{children:"local_acccess_point"})," file: "]}),(0,n.jsx)("button",{onClick:()=>((a,o)=>{const n=document.createElement("a"),c=new Blob([e],{type:a}),t=URL.createObjectURL(c);n.setAttribute("href",t),n.setAttribute("download",o),n.click()})("application/octet-stream","local_access_point"),disabled:""===e,children:"Download"})]})}const r={title:"Local access points",slug:"/local-access-point"},s=void 0,d={id:"Advanced/networking/local-access-point",title:"Local access points",description:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?",source:"@site/user-guide/30-Advanced/02-networking/06-local-access-point.md",sourceDirName:"30-Advanced/02-networking",slug:"/local-access-point",permalink:"/user-guide/local-access-point",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Local access points",slug:"/local-access-point"},sidebar:"tutorialSidebar",previous:{title:"Internet sharing between a PC and a Pioreactor",permalink:"/user-guide/internet-sharing"},next:{title:"Networking tools",permalink:"/user-guide/networking"}},l={},m=[{value:"Starting a local access point",id:"starting-a-local-access-point",level:2},{value:"Access the local access point",id:"access-the-local-access-point",level:2},{value:"Connecting more Pioreactors to your local access point",id:"connecting-more-pioreactors-to-your-local-access-point",level:3},{value:"Adding internet access to your local access point",id:"adding-internet-access-to-your-local-access-point",level:2},{value:"Turning off a local access point",id:"turning-off-a-local-access-point",level:2},{value:"Changing SSID name or password for your local access point",id:"changing-ssid-name-or-password-for-your-local-access-point",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"My computer can't connect to the local-access-point",id:"my-computer-cant-connect-to-the-local-access-point",level:3},{value:"Do you see the pioreactor network in the list of available wifi networks?",id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"Alternatively, do you not see the pioreactor network in the list of available wifi networks?",id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"I'm on the network, but can't load the Pioreactor UI at http://pioreactor.local",id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",level:3},{value:"I can't connect a worker to my local access point",id:"i-cant-connect-a-worker-to-my-local-access-point",level:3},{value:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?",id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",level:3}];function h(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.p,{children:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"If you want to get started right away, without dealing with exiting WiFi networks."}),"\n",(0,n.jsx)(a.li,{children:"If your usual WiFi network is restrictive (ex: doesn't allow Raspberry Pis, or requires IT support to host them)."}),"\n",(0,n.jsx)(a.li,{children:"If you want to take the Pioreactor, or cluster of Pioreactors, out into the field where there is no network."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor comes with the ability to create its own local access point, which other Pioreactors can connect to. See image below:"}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point",src:o(13726).Z+"",width:"1191",height:"387"})}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsx)(a.p,{children:"The built-in local access point is meant for small clusters of Pioreactors, and it's range and stability is limited. If you want a proper local access point, we suggest purchasing an inexpensive wifi router and using that (the router does not need to be connected to the internet - it will still create a wifi network you can connect Pioreactors to regardless)."})}),"\n",(0,n.jsx)(a.h2,{id:"starting-a-local-access-point",children:"Starting a local access point"}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor has the necessary software and hardware to create the local access point. To start the access point:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["If starting with a new Pioreactor, during software set up:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:['Leave the "Configure wireless LAN" unchecked. Continue with the instructions at ',(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n",(0,n.jsxs)(a.li,{children:["After the SD card has been written to, remove the SD card from your computer, and immediately insert it back in. A ",(0,n.jsx)(a.code,{children:"boot"})," (or ",(0,n.jsx)(a.code,{children:"bootfs"}),") device should be present now that is your SD card. If asked to reformat the SD card, select NO."]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to the SD card directory."]}),"\n",(0,n.jsxs)(a.li,{children:["Eject the SD card safely, and continue with instructions at ",(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["If starting from an existing Pioreactor:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"with the power off remove the SD card from the Pioreactor and insert it into a computer."}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to your SD card (called ",(0,n.jsx)(a.code,{children:"boot"})," or ",(0,n.jsx)(a.code,{children:"bootfs"}),")."]}),"\n",(0,n.jsx)(a.li,{children:"Eject the SD card safely, and put back into the Pioreactor."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"access-the-local-access-point",children:"Access the local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After plugging in the Pioreactor, the local access point will start and you should see a new network called ",(0,n.jsx)(a.code,{children:"pioreactor"}),", with password ",(0,n.jsx)(a.code,{children:"raspberry"}),". You should be able to connect to this new access point with any computer, phone, tablet, etc."]}),"\n",(0,n.jsx)("img",{src:"/img/user-guide/pioreactor_ap.png",width:"325"}),"\n",(0,n.jsxs)(a.p,{children:["Once connected, the usual urls should work: ",(0,n.jsx)(a.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," will bring up the Pioreactor interface (having trouble? Not working? Try our troubleshooting steps below."]}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Without access to the internet, the Pioreactor will have the wrong internal time. You can change this ",(0,n.jsx)(a.a,{href:"/user-guide/common-questions#how-do-i-change-the-date-or-time-on-the-pioreactor",children:"using this method"})]})}),"\n",(0,n.jsx)(a.h3,{id:"connecting-more-pioreactors-to-your-local-access-point",children:"Connecting more Pioreactors to your local access point"}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Raspberry Pi 3B and Raspberry Pi Zero W have trouble connecting to these local access points. Follow instructions ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/blob/992d986881f3a3504a08b781a494b1a6e3b5a0e3/CHANGELOG.md?plain=1#L110C11-L121",children:"here"}),"."]})}),"\n",(0,n.jsxs)(a.p,{children:["Other Pioreactors will need to be reconfigured to connect to this new access point. During set up in the Raspberry Pi Imager, using the ssid / wifi credentials: ",(0,n.jsx)(a.code,{children:"pioreactor"})," and password ",(0,n.jsx)(a.code,{children:"raspberry"})," in the wireless LAN section. ",(0,n.jsxs)(a.strong,{children:["Don't add the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to these other Pioreactors - you only need to do that once"]}),"."]}),"\n",(0,n.jsxs)(a.p,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n",(0,n.jsx)(a.p,{children:"This network may not be connected to the internet, so you won't be able to upgrade any software on the Pioreactors. See section below on how to add internet."}),"\n",(0,n.jsx)(a.h2,{id:"adding-internet-access-to-your-local-access-point",children:"Adding internet access to your local access point"}),"\n",(0,n.jsx)(a.p,{children:"If you are hosting the local access point on a Raspberry Pi that has an ethernet port (B models), you can plug this into a router that has access to the internet to provide internet to your entire cluster."}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point, and the is connected to a router",src:o(8026).Z+"",width:"578",height:"387"})}),"\n",(0,n.jsx)(a.h2,{id:"turning-off-a-local-access-point",children:"Turning off a local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After SSH-ing into your Pioreactor, simply delete the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file in the ",(0,n.jsx)(a.code,{children:"/boot/firmware/"})," directory, and reboot."]}),"\n",(0,n.jsx)(a.h2,{id:"changing-ssid-name-or-password-for-your-local-access-point",children:"Changing SSID name or password for your local access point"}),"\n",(0,n.jsxs)(a.p,{children:["In the ",(0,n.jsx)(a.code,{children:"config.ini"}),", the SSID and password are editable under the section ",(0,n.jsx)(a.code,{children:"local_access_point"}),". This requires a power-cycle to take effect."]}),"\n",(0,n.jsx)(a.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(a.h3,{id:"my-computer-cant-connect-to-the-local-access-point",children:"My computer can't connect to the local-access-point"}),"\n",(0,n.jsxs)(a.h4,{id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Do you see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:'If presented, use the option "Use security key to connect" (this is an alias for the password).'}),"\n",(0,n.jsx)(a.li,{children:"Try power-cycling your Pioreactor"}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(a.h4,{id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Alternatively, do you ",(0,n.jsx)(a.em,{children:"not"})," see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Try power-cycling the Raspberry Pi"}),"\n",(0,n.jsxs)(a.li,{children:["If you unplug the Pioreactor, and place the SD card back into your computer, do you see the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file? If not, try adding the file again, inserting the SD card in the Pioreactor, and restarting the Pioreactor."]}),"\n"]}),"\n",(0,n.jsxs)(a.h3,{id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",children:["I'm on the network, but can't load the Pioreactor UI at ",(0,n.jsx)(a.code,{children:"http://pioreactor.local"})]}),"\n",(0,n.jsxs)(a.p,{children:["Try ",(0,n.jsx)(a.code,{children:"http://.local"}),". Still not working? Try ",(0,n.jsx)(a.code,{children:"http://10.42.0.1"}),")"]}),"\n",(0,n.jsx)(a.h3,{id:"i-cant-connect-a-worker-to-my-local-access-point",children:"I can't connect a worker to my local access point"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["confirm that you are using the right wifi name and password in the Imager (default ",(0,n.jsx)(a.code,{children:"pioreactor"})," and ",(0,n.jsx)(a.code,{children:"raspberry"}),")"]}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of access point clients (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.h3,{id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",children:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"You can purchase an inexpensive wifi router and use that as the access point. Note that you don't need to connect this router to the internet - it will operate a network regardless."}),"\n",(0,n.jsxs)(a.li,{children:["You can purchase a Wifi USB stick to improve the number clients and range of your local-access-point. For example, the Alfa AWUS036AC (take note to confirm your Raspberry Pi can has the correct USB connection). To check if the device is active, use ",(0,n.jsx)(a.code,{children:"nmcli device"})," and look for a ",(0,n.jsx)(a.code,{children:"wlan1"})," (which represents the USB stick). To move the local access point to this USB stick, use","\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"sudo nmcli connection modify PioreactorAP ifname wlan1\n"})}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,c.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8026:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/lap_with_internet-ac1e9e680aaeaa368935366c54db0007.png"},13726:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/local_access_point-9455ab0ce2fa6461e80fc732e06e4a0d.png"},11151:(e,a,o)=>{o.d(a,{Z:()=>r,a:()=>i});var n=o(67294);const c={},t=n.createContext(c);function i(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[5214],{81298:(e,a,o)=>{o.r(a),o.d(a,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>m});var n=o(85893),c=o(11151),t=o(67294);function i(){const[e,a]=t.useState("");return(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{children:" Select your country: "}),(0,n.jsx)("select",{name:"country",onChange:e=>a(e.target.value),style:{width:"180px"},children:[{code:"",name:"-- Select --"},{code:"AF",name:"Afghanistan"},{code:"AX",name:"Aland Islands"},{code:"AL",name:"Albania"},{code:"DZ",name:"Algeria"},{code:"AS",name:"American Samoa"},{code:"AD",name:"Andorra"},{code:"AO",name:"Angola"},{code:"AI",name:"Anguilla"},{code:"AQ",name:"Antarctica"},{code:"AG",name:"Antigua And Barbuda"},{code:"AR",name:"Argentina"},{code:"AM",name:"Armenia"},{code:"AW",name:"Aruba"},{code:"AU",name:"Australia"},{code:"AT",name:"Austria"},{code:"AZ",name:"Azerbaijan"},{code:"BS",name:"Bahamas"},{code:"BH",name:"Bahrain"},{code:"BD",name:"Bangladesh"},{code:"BB",name:"Barbados"},{code:"BY",name:"Belarus"},{code:"BE",name:"Belgium"},{code:"BZ",name:"Belize"},{code:"BJ",name:"Benin"},{code:"BM",name:"Bermuda"},{code:"BT",name:"Bhutan"},{code:"BO",name:"Bolivia"},{code:"BA",name:"Bosnia And Herzegovina"},{code:"BW",name:"Botswana"},{code:"BV",name:"Bouvet Island"},{code:"BR",name:"Brazil"},{code:"IO",name:"British Indian Ocean Territory"},{code:"BN",name:"Brunei Darussalam"},{code:"BG",name:"Bulgaria"},{code:"BF",name:"Burkina Faso"},{code:"BI",name:"Burundi"},{code:"KH",name:"Cambodia"},{code:"CM",name:"Cameroon"},{code:"CA",name:"Canada"},{code:"CV",name:"Cape Verde"},{code:"KY",name:"Cayman Islands"},{code:"CF",name:"Central African Republic"},{code:"TD",name:"Chad"},{code:"CL",name:"Chile"},{code:"CN",name:"China"},{code:"CX",name:"Christmas Island"},{code:"CC",name:"Cocos (Keeling) Islands"},{code:"CO",name:"Colombia"},{code:"KM",name:"Comoros"},{code:"CG",name:"Congo"},{code:"CD",name:"Congo, Democratic Republic"},{code:"CK",name:"Cook Islands"},{code:"CR",name:"Costa Rica"},{code:"CI",name:"Cote D'Ivoire"},{code:"HR",name:"Croatia"},{code:"CU",name:"Cuba"},{code:"CY",name:"Cyprus"},{code:"CZ",name:"Czech Republic"},{code:"DK",name:"Denmark"},{code:"DJ",name:"Djibouti"},{code:"DM",name:"Dominica"},{code:"DO",name:"Dominican Republic"},{code:"EC",name:"Ecuador"},{code:"EG",name:"Egypt"},{code:"SV",name:"El Salvador"},{code:"GQ",name:"Equatorial Guinea"},{code:"ER",name:"Eritrea"},{code:"EE",name:"Estonia"},{code:"ET",name:"Ethiopia"},{code:"FK",name:"Falkland Islands (Malvinas)"},{code:"FO",name:"Faroe Islands"},{code:"FJ",name:"Fiji"},{code:"FI",name:"Finland"},{code:"FR",name:"France"},{code:"GF",name:"French Guiana"},{code:"PF",name:"French Polynesia"},{code:"TF",name:"French Southern Territories"},{code:"GA",name:"Gabon"},{code:"GM",name:"Gambia"},{code:"GE",name:"Georgia"},{code:"DE",name:"Germany"},{code:"GH",name:"Ghana"},{code:"GI",name:"Gibraltar"},{code:"GR",name:"Greece"},{code:"GL",name:"Greenland"},{code:"GD",name:"Grenada"},{code:"GP",name:"Guadeloupe"},{code:"GU",name:"Guam"},{code:"GT",name:"Guatemala"},{code:"GG",name:"Guernsey"},{code:"GN",name:"Guinea"},{code:"GW",name:"Guinea-Bissau"},{code:"GY",name:"Guyana"},{code:"HT",name:"Haiti"},{code:"HM",name:"Heard Island & Mcdonald Islands"},{code:"VA",name:"Holy See (Vatican City State)"},{code:"HN",name:"Honduras"},{code:"HK",name:"Hong Kong"},{code:"HU",name:"Hungary"},{code:"IS",name:"Iceland"},{code:"IN",name:"India"},{code:"ID",name:"Indonesia"},{code:"IR",name:"Iran}, Islamic Republic Of"},{code:"IQ",name:"Iraq"},{code:"IE",name:"Ireland"},{code:"IM",name:"Isle Of Man"},{code:"IL",name:"Israel"},{code:"IT",name:"Italy"},{code:"JM",name:"Jamaica"},{code:"JP",name:"Japan"},{code:"JE",name:"Jersey"},{code:"JO",name:"Jordan"},{code:"KZ",name:"Kazakhstan"},{code:"KE",name:"Kenya"},{code:"KI",name:"Kiribati"},{code:"KR",name:"Korea"},{code:"KW",name:"Kuwait"},{code:"KG",name:"Kyrgyzstan"},{code:"LA",name:"Lao People's Democratic Republic"},{code:"LV",name:"Latvia"},{code:"LB",name:"Lebanon"},{code:"LS",name:"Lesotho"},{code:"LR",name:"Liberia"},{code:"LY",name:"Libyan Arab Jamahiriya"},{code:"LI",name:"Liechtenstein"},{code:"LT",name:"Lithuania"},{code:"LU",name:"Luxembourg"},{code:"MO",name:"Macao"},{code:"MK",name:"Macedonia"},{code:"MG",name:"Madagascar"},{code:"MW",name:"Malawi"},{code:"MY",name:"Malaysia"},{code:"MV",name:"Maldives"},{code:"ML",name:"Mali"},{code:"MT",name:"Malta"},{code:"MH",name:"Marshall Islands"},{code:"MQ",name:"Martinique"},{code:"MR",name:"Mauritania"},{code:"MU",name:"Mauritius"},{code:"YT",name:"Mayotte"},{code:"MX",name:"Mexico"},{code:"FM",name:"Micronesia}, Federated States Of"},{code:"MD",name:"Moldova"},{code:"MC",name:"Monaco"},{code:"MN",name:"Mongolia"},{code:"ME",name:"Montenegro"},{code:"MS",name:"Montserrat"},{code:"MA",name:"Morocco"},{code:"MZ",name:"Mozambique"},{code:"MM",name:"Myanmar"},{code:"NA",name:"Namibia"},{code:"NR",name:"Nauru"},{code:"NP",name:"Nepal"},{code:"NL",name:"Netherlands"},{code:"AN",name:"Netherlands Antilles"},{code:"NC",name:"New Caledonia"},{code:"NZ",name:"New Zealand"},{code:"NI",name:"Nicaragua"},{code:"NE",name:"Niger"},{code:"NG",name:"Nigeria"},{code:"NU",name:"Niue"},{code:"NF",name:"Norfolk Island"},{code:"MP",name:"Northern Mariana Islands"},{code:"NO",name:"Norway"},{code:"OM",name:"Oman"},{code:"PK",name:"Pakistan"},{code:"PW",name:"Palau"},{code:"PS",name:"Palestinian Territory}, Occupied"},{code:"PA",name:"Panama"},{code:"PG",name:"Papua New Guinea"},{code:"PY",name:"Paraguay"},{code:"PE",name:"Peru"},{code:"PH",name:"Philippines"},{code:"PN",name:"Pitcairn"},{code:"PL",name:"Poland"},{code:"PT",name:"Portugal"},{code:"PR",name:"Puerto Rico"},{code:"QA",name:"Qatar"},{code:"RE",name:"Reunion"},{code:"RO",name:"Romania"},{code:"RU",name:"Russian Federation"},{code:"RW",name:"Rwanda"},{code:"BL",name:"Saint Barthelemy"},{code:"SH",name:"Saint Helena"},{code:"KN",name:"Saint Kitts And Nevis"},{code:"LC",name:"Saint Lucia"},{code:"MF",name:"Saint Martin"},{code:"PM",name:"Saint Pierre And Miquelon"},{code:"VC",name:"Saint Vincent And Grenadines"},{code:"WS",name:"Samoa"},{code:"SM",name:"San Marino"},{code:"ST",name:"Sao Tome And Principe"},{code:"SA",name:"Saudi Arabia"},{code:"SN",name:"Senegal"},{code:"RS",name:"Serbia"},{code:"SC",name:"Seychelles"},{code:"SL",name:"Sierra Leone"},{code:"SG",name:"Singapore"},{code:"SK",name:"Slovakia"},{code:"SI",name:"Slovenia"},{code:"SB",name:"Solomon Islands"},{code:"SO",name:"Somalia"},{code:"ZA",name:"South Africa"},{code:"GS",name:"South Georgia And Sandwich Isl."},{code:"ES",name:"Spain"},{code:"LK",name:"Sri Lanka"},{code:"SD",name:"Sudan"},{code:"SR",name:"Suriname"},{code:"SJ",name:"Svalbard And Jan Mayen"},{code:"SZ",name:"Swaziland"},{code:"SE",name:"Sweden"},{code:"CH",name:"Switzerland"},{code:"SY",name:"Syrian Arab Republic"},{code:"TW",name:"Taiwan"},{code:"TJ",name:"Tajikistan"},{code:"TZ",name:"Tanzania"},{code:"TH",name:"Thailand"},{code:"TL",name:"Timor-Leste"},{code:"TG",name:"Togo"},{code:"TK",name:"Tokelau"},{code:"TO",name:"Tonga"},{code:"TT",name:"Trinidad And Tobago"},{code:"TN",name:"Tunisia"},{code:"TR",name:"Turkey"},{code:"TM",name:"Turkmenistan"},{code:"TC",name:"Turks And Caicos Islands"},{code:"TV",name:"Tuvalu"},{code:"UG",name:"Uganda"},{code:"UA",name:"Ukraine"},{code:"AE",name:"United Arab Emirates"},{code:"GB",name:"United Kingdom"},{code:"US",name:"United States"},{code:"UM",name:"United States Outlying Islands"},{code:"UY",name:"Uruguay"},{code:"UZ",name:"Uzbekistan"},{code:"VU",name:"Vanuatu"},{code:"VE",name:"Venezuela"},{code:"VN",name:"Vietnam"},{code:"VG",name:"Virgin Islands}, British"},{code:"VI",name:"Virgin Islands}, U.S."},{code:"WF",name:"Wallis And Futuna"},{code:"EH",name:"Western Sahara"},{code:"YE",name:"Yemen"},{code:"ZM",name:"Zambia"},{code:"ZW",name:"Zimbabwe"}].map((e=>(0,n.jsx)("option",{value:e.code,children:e.name})))}),(0,n.jsxs)("span",{children:[" and download the specific ",(0,n.jsx)("code",{children:"local_acccess_point"})," file: "]}),(0,n.jsx)("button",{onClick:()=>((a,o)=>{const n=document.createElement("a"),c=new Blob([e],{type:a}),t=URL.createObjectURL(c);n.setAttribute("href",t),n.setAttribute("download",o),n.click()})("application/octet-stream","local_access_point"),disabled:""===e,children:"Download"})]})}const r={title:"Local access points",slug:"/local-access-point"},s=void 0,d={id:"Advanced/networking/local-access-point",title:"Local access points",description:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?",source:"@site/user-guide/30-Advanced/02-networking/06-local-access-point.md",sourceDirName:"30-Advanced/02-networking",slug:"/local-access-point",permalink:"/user-guide/local-access-point",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Local access points",slug:"/local-access-point"},sidebar:"tutorialSidebar",previous:{title:"Internet sharing between a PC and a Pioreactor",permalink:"/user-guide/internet-sharing"},next:{title:"Networking tools",permalink:"/user-guide/networking"}},l={},m=[{value:"Starting a local access point",id:"starting-a-local-access-point",level:2},{value:"Access the local access point",id:"access-the-local-access-point",level:2},{value:"Connecting more Pioreactors to your local access point",id:"connecting-more-pioreactors-to-your-local-access-point",level:3},{value:"Adding internet access to your local access point",id:"adding-internet-access-to-your-local-access-point",level:2},{value:"Turning off a local access point",id:"turning-off-a-local-access-point",level:2},{value:"Changing SSID name or password for your local access point",id:"changing-ssid-name-or-password-for-your-local-access-point",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"My computer can't connect to the local-access-point",id:"my-computer-cant-connect-to-the-local-access-point",level:3},{value:"Do you see the pioreactor network in the list of available wifi networks?",id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"Alternatively, do you not see the pioreactor network in the list of available wifi networks?",id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"I'm on the network, but can't load the Pioreactor UI at http://pioreactor.local",id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",level:3},{value:"I can't connect a worker to my local access point",id:"i-cant-connect-a-worker-to-my-local-access-point",level:3},{value:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?",id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",level:3}];function h(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.p,{children:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"If you want to get started right away, without dealing with exiting WiFi networks."}),"\n",(0,n.jsx)(a.li,{children:"If your usual WiFi network is restrictive (ex: doesn't allow Raspberry Pis, or requires IT support to host them)."}),"\n",(0,n.jsx)(a.li,{children:"If you want to take the Pioreactor, or cluster of Pioreactors, out into the field where there is no network."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor comes with the ability to create its own local access point, which other Pioreactors can connect to. See image below:"}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point",src:o(13726).Z+"",width:"1191",height:"387"})}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsx)(a.p,{children:"The built-in local access point is meant for small clusters of Pioreactors, and it's range and stability is limited. If you want a proper local access point, we suggest purchasing an inexpensive Wifi router and using that, or a Wifi USB device (the router does not need to be connected to the internet - it will still create a wireless network you can connect Pioreactors to regardless)."})}),"\n",(0,n.jsx)(a.h2,{id:"starting-a-local-access-point",children:"Starting a local access point"}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor has the necessary software and hardware to create the local access point. To start the access point:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["If starting with a new Pioreactor, during software set up:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:['Leave the "Configure wireless LAN" unchecked. Continue with the instructions at ',(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n",(0,n.jsxs)(a.li,{children:["After the SD card has been written to, remove the SD card from your computer, and immediately insert it back in. A ",(0,n.jsx)(a.code,{children:"boot"})," (or ",(0,n.jsx)(a.code,{children:"bootfs"}),") device should be present now that is your SD card. If asked to reformat the SD card, select NO."]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to the SD card directory."]}),"\n",(0,n.jsxs)(a.li,{children:["Eject the SD card safely, and continue with instructions at ",(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["If starting from an existing Pioreactor:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"with the power off remove the SD card from the Pioreactor and insert it into a computer."}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to your SD card (called ",(0,n.jsx)(a.code,{children:"boot"})," or ",(0,n.jsx)(a.code,{children:"bootfs"}),")."]}),"\n",(0,n.jsx)(a.li,{children:"Eject the SD card safely, and put back into the Pioreactor."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"access-the-local-access-point",children:"Access the local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After plugging in the Pioreactor, the local access point will start and you should see a new network called ",(0,n.jsx)(a.code,{children:"pioreactor"}),", with password ",(0,n.jsx)(a.code,{children:"raspberry"}),". You should be able to connect to this new access point with any computer, phone, tablet, etc."]}),"\n",(0,n.jsx)("img",{src:"/img/user-guide/pioreactor_ap.png",width:"325"}),"\n",(0,n.jsxs)(a.p,{children:["Once connected, the usual urls should work: ",(0,n.jsx)(a.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," will bring up the Pioreactor interface (having trouble? Not working? Try our troubleshooting steps below."]}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Without access to the internet, the Pioreactor will have the wrong internal time. You can change this ",(0,n.jsx)(a.a,{href:"/user-guide/common-questions#how-do-i-change-the-date-or-time-on-the-pioreactor",children:"using this method"})]})}),"\n",(0,n.jsx)(a.h3,{id:"connecting-more-pioreactors-to-your-local-access-point",children:"Connecting more Pioreactors to your local access point"}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Raspberry Pi 3B (not B+) and Raspberry Pi Zero W (not Zero 2) have trouble connecting to these local access points. Follow instructions ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/blob/992d986881f3a3504a08b781a494b1a6e3b5a0e3/CHANGELOG.md?plain=1#L110C11-L121",children:"here"}),"."]})}),"\n",(0,n.jsxs)(a.p,{children:["Other Pioreactors will need to be reconfigured to connect to this new access point. During set up in the Raspberry Pi Imager, using the ssid / wifi credentials: ",(0,n.jsx)(a.code,{children:"pioreactor"})," and password ",(0,n.jsx)(a.code,{children:"raspberry"})," in the wireless LAN section. ",(0,n.jsxs)(a.strong,{children:["Don't add the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to these other Pioreactors - you only need to do that once"]}),"."]}),"\n",(0,n.jsxs)(a.p,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n",(0,n.jsx)(a.p,{children:"This network may not be connected to the internet, so you won't be able to upgrade any software on the Pioreactors. See section below on how to add internet."}),"\n",(0,n.jsx)(a.h2,{id:"adding-internet-access-to-your-local-access-point",children:"Adding internet access to your local access point"}),"\n",(0,n.jsx)(a.p,{children:"If you are hosting the local access point on a Raspberry Pi that has an ethernet port (B models, or via a usb-ethernet gadget), you can plug this into a router that has access to the internet to provide internet to your entire cluster."}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point, and the is connected to a router",src:o(8026).Z+"",width:"578",height:"387"})}),"\n",(0,n.jsx)(a.h2,{id:"turning-off-a-local-access-point",children:"Turning off a local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After SSH-ing into your Pioreactor, simply delete the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file in the ",(0,n.jsx)(a.code,{children:"/boot/firmware/"})," directory, and reboot."]}),"\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"sudo rm /boot/firmware/local_access_point\n"})}),"\n",(0,n.jsx)(a.h2,{id:"changing-ssid-name-or-password-for-your-local-access-point",children:"Changing SSID name or password for your local access point"}),"\n",(0,n.jsxs)(a.p,{children:["In the ",(0,n.jsx)(a.code,{children:"config.ini"}),", the SSID and password are editable under the section ",(0,n.jsx)(a.code,{children:"local_access_point"}),". This requires a power-cycle to take effect, and any other workers in the cluster will need to be updated."]}),"\n",(0,n.jsx)(a.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(a.h3,{id:"my-computer-cant-connect-to-the-local-access-point",children:"My computer can't connect to the local-access-point"}),"\n",(0,n.jsxs)(a.h4,{id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Do you see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:'If presented, use the option "Use security key to connect" (this is an alias for the password).'}),"\n",(0,n.jsx)(a.li,{children:"Try power-cycling your Pioreactor"}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(a.h4,{id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Alternatively, do you ",(0,n.jsx)(a.em,{children:"not"})," see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Try power-cycling the Raspberry Pi"}),"\n",(0,n.jsxs)(a.li,{children:["If you unplug the Pioreactor, and place the SD card back into your computer, do you see the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file? If not, try adding the file again, inserting the SD card in the Pioreactor, and restarting the Pioreactor."]}),"\n"]}),"\n",(0,n.jsxs)(a.h3,{id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",children:["I'm on the network, but can't load the Pioreactor UI at ",(0,n.jsx)(a.code,{children:"http://pioreactor.local"})]}),"\n",(0,n.jsxs)(a.p,{children:["Try ",(0,n.jsx)(a.code,{children:"http://.local"}),". Still not working? Try ",(0,n.jsx)(a.code,{children:"http://10.42.0.1"}),")"]}),"\n",(0,n.jsx)(a.h3,{id:"i-cant-connect-a-worker-to-my-local-access-point",children:"I can't connect a worker to my local access point"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["confirm that you are using the right wifi name and password in the Imager (default ",(0,n.jsx)(a.code,{children:"pioreactor"})," and ",(0,n.jsx)(a.code,{children:"raspberry"}),"), and the hostname is correct and unique."]}),"\n",(0,n.jsx)(a.li,{children:"The maximum number of access point clients (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. See question below."}),"\n"]}),"\n",(0,n.jsx)(a.h3,{id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",children:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"You can purchase an inexpensive wifi router and use that as the access point. Note that you don't need to connect this router to the internet - it will operate a wireless network regardless."}),"\n",(0,n.jsxs)(a.li,{children:["You can purchase a Wifi USB stick to improve the number clients and range of your local-access-point. For example, the Alfa AWUS036AC (take note to confirm your Raspberry Pi can has the correct USB connection). To check if the device is active, use ",(0,n.jsx)(a.code,{children:"nmcli device"})," and look for a ",(0,n.jsx)(a.code,{children:"wlan1"})," (which represents the USB stick). To move the local access point to this USB stick, use","\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"sudo nmcli connection modify PioreactorAP ifname wlan1\n"})}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Another possible option is purely software based: There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,c.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8026:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/lap_with_internet-ac1e9e680aaeaa368935366c54db0007.png"},13726:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/local_access_point-9455ab0ce2fa6461e80fc732e06e4a0d.png"},11151:(e,a,o)=>{o.d(a,{Z:()=>r,a:()=>i});var n=o(67294);const c={},t=n.createContext(c);function i(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.d45b6e26.js b/assets/js/main.4d698acb.js similarity index 99% rename from assets/js/main.d45b6e26.js rename to assets/js/main.4d698acb.js index a79b02a64..da9e41b95 100644 --- a/assets/js/main.d45b6e26.js +++ b/assets/js/main.4d698acb.js @@ -1,2 +1,2 @@ -/*! For license information please see main.d45b6e26.js.LICENSE.txt */ -(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(67294);var r=n(68356),a=n.n(r),o=n(16887);const i={"003b35d7":[()=>n.e(9545).then(n.bind(n,77874)),"@site/user-guide/03-Extending your Pioreactor/04-Experiment Profiles/01-experiment-profiles-intro.md",77874],"00d2eda0":[()=>n.e(4469).then(n.bind(n,23895)),"@site/user-guide/50-Troubleshooting/Stirring troubleshooting.md",23895],"011272c3":[()=>n.e(7543).then(n.bind(n,9716)),"@site/developer-guide/10-Hardware/05-pinout.md",9716],"05dbb4f6":[()=>Promise.all([n.e(532),n.e(6390)]).then(n.bind(n,47169)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/05-optics-assembly.md",47169],"063154f2":[()=>n.e(8756).then(n.bind(n,77299)),"@site/user-guide/29-Automations/04-writing-automations.md",77299],"07a88ca4":[()=>n.e(5953).then(n.t.bind(n,44654,19)),"~docs/experiments/version-current-metadata-prop-751.json",44654],"0be1c1c9":[()=>n.e(7197).then(n.bind(n,5631)),"@site/user-guide/30-Advanced/02-networking/01-internet-sharing.md",5631],"0fa95718":[()=>Promise.all([n.e(532),n.e(3582)]).then(n.bind(n,26429)),"@site/experiments/02-Secondary level education/low-vs-high-conc-media.md",26429],"12af2043":[()=>n.e(9631).then(n.bind(n,43483)),"@site/user-guide/50-Troubleshooting/Hardware troubleshooting.md",43483],"1305c50d":[()=>n.e(6094).then(n.bind(n,56091)),"@site/user-guide/30-Advanced/07-remote-access/03-tailscale.md",56091],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,49618)),"@theme/DocItem",49618],"17e57afd":[()=>n.e(8961).then(n.bind(n,92544)),"@site/user-guide/03-Extending your Pioreactor/04-Experiment Profiles/02-create-edit-experiment-profiles.md",92544],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,51473)),"@theme/SearchPage",51473],"1aa51b29":[()=>n.e(8470).then(n.bind(n,90920)),"@site/user-guide/02-Experiment basics/09-od-normal-growth-rate.md",90920],"1f29aed5":[()=>n.e(8289).then(n.t.bind(n,43177,19)),"~docs/developer-guide/version-current-metadata-prop-751.json",43177],"242a2306":[()=>Promise.all([n.e(532),n.e(5879)]).then(n.bind(n,18270)),"@site/experiments/02-Secondary level education/yeast-in-ethanol.md",18270],"270e3b24":[()=>n.e(3255).then(n.bind(n,98338)),"@site/developer-guide/09-Storage and the filesystem/02-filesystem.md",98338],"275a01bc":[()=>n.e(935).then(n.bind(n,10425)),"@site/developer-guide/20-User interface/04-adding-charts.md",10425],"27a03a91":[()=>Promise.all([n.e(532),n.e(7615)]).then(n.bind(n,79079)),"@site/experiments/03-University level education/00-continuous-cultures-using-turbidostat.md",79079],28292353:[()=>Promise.all([n.e(532),n.e(9056)]).then(n.bind(n,22117)),"@site/user-guide/03-Extending your Pioreactor/06a-using-community-plugins.mdx",22117],"2ad4a15f":[()=>Promise.all([n.e(532),n.e(5525)]).then(n.bind(n,59982)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/03-v11-wetware-assembly.md",59982],"2b5b8f8a":[()=>n.e(6217).then(n.bind(n,35056)),"@site/user-guide/03-Extending your Pioreactor/11-using-stemma-qt.md",35056],"2c924c11":[()=>Promise.all([n.e(532),n.e(4962)]).then(n.bind(n,25254)),"@site/experiments/01-Introduction.md",25254],"2d7bf355":[()=>n.e(7118).then(n.bind(n,76248)),"@site/developer-guide/20-User interface/01-introduction.md",76248],"2dd9ad3f":[()=>Promise.all([n.e(532),n.e(4934)]).then(n.bind(n,5488)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/04-faceplate-all-together.md",5488],"2fd9ad7f":[()=>n.e(2516).then(n.t.bind(n,38070,19)),"~docs/experiments/tag-experiments-tags-salt-717.json",38070],"306898ad":[()=>Promise.all([n.e(532),n.e(1691)]).then(n.bind(n,97468)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/01-v11-introduction.md",97468],"333a627e":[()=>n.e(4334).then(n.bind(n,54813)),"@site/user-guide/30-Advanced/07-remote-access/02-ngrok.md",54813],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,9861)),"@theme/DocTagsListPage",9861],"3ab34b0a":[()=>n.e(2939).then(n.t.bind(n,21060,19)),"~docs/experiments/tags-list-current-prop-15a.json",21060],"3b1fd47b":[()=>n.e(4304).then(n.t.bind(n,76650,19)),"~docs/experiments/tag-experiments-tags-caffeine-17d.json",76650],"3b424f39":[()=>n.e(1981).then(n.bind(n,29167)),"@site/user-guide/03-Extending your Pioreactor/01-cluster-management/01-create-cluster.md",29167],"3c3add90":[()=>n.e(2084).then(n.bind(n,71279)),"@site/developer-guide/20-User interface/02-api.md",71279],"433fc4eb":[()=>Promise.all([n.e(532),n.e(301)]).then(n.bind(n,37916)),"@site/user-guide/02-Experiment basics/04-set-up-an-experiment.md",37916],"4618fa18":[()=>n.e(1326).then(n.bind(n,90545)),"@site/developer-guide/30-Development/01-local-development.md",90545],"496d660a":[()=>n.e(6682).then(n.bind(n,40783)),"@site/developer-guide/03-Background jobs/03-avoiding-od.md",40783],"4b7e99ca":[()=>n.e(7062).then(n.bind(n,93107)),"@site/user-guide/02-Experiment basics/06-monitor-experiment.md",93107],"54bf282b":[()=>Promise.all([n.e(532),n.e(9963)]).then(n.bind(n,44751)),"@site/experiments/02-Secondary level education/salt-stress-on-yeast.md",44751],"55bdb91f":[()=>n.e(3700).then(n.t.bind(n,15745,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"582d4a8c":[()=>n.e(3796).then(n.bind(n,81567)),"@site/user-guide/30-Advanced/07-remote-access/01-introduction.md",81567],"58be8993":[()=>Promise.all([n.e(532),n.e(3963)]).then(n.bind(n,52176)),"@site/experiments/02-Secondary level education/caffeine-inhibition.md",52176],"5a51baf4":[()=>n.e(3298).then(n.t.bind(n,5370,19)),"~docs/experiments/tag-experiments-tags-control-549.json",5370],"5c89fd85":[()=>Promise.all([n.e(532),n.e(7478)]).then(n.bind(n,9452)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/03-wetware-assembly.md",9452],"5ca67ec2":[()=>Promise.all([n.e(532),n.e(235)]).then(n.bind(n,23367)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/01-introduction.md",23367],"5e774627":[()=>n.e(3543).then(n.bind(n,47721)),"@site/developer-guide/05-Scripts/01-writing-scripts.md",47721],"5e95c892":[()=>n.e(9661).then(n.bind(n,41892)),"@theme/DocsRoot",41892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"6023936b":[()=>Promise.all([n.e(532),n.e(1386)]).then(n.bind(n,72175)),"@site/experiments/04-Research and beyond/directed-evolution-salt-tolerance.md",72175],"60a56950":[()=>n.e(5542).then(n.bind(n,5156)),"@site/developer-guide/07-Plugins/03-plugin-as-python-package.md",5156],61980625:[()=>n.e(5707).then(n.bind(n,45046)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/03_mqtt.md",45046],"622dee83":[()=>n.e(8596).then(n.bind(n,95980)),"@site/user-guide/30-Advanced/02-networking/10-networking.md",95980],"6293b6ce":[()=>n.e(5214).then(n.bind(n,81298)),"@site/user-guide/30-Advanced/02-networking/06-local-access-point.md",81298],"65af3e53":[()=>n.e(1294).then(n.bind(n,23083)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/02-sqlite.md",23083],"6c06c3a0":[()=>n.e(3786).then(n.bind(n,18510)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/01-data-stores-intro.md",18510],"6e112274":[()=>n.e(2554).then(n.bind(n,51354)),"@site/user-guide/02-Experiment basics/08-export-data.md",51354],"6f4861e3":[()=>n.e(2057).then(n.bind(n,62195)),"@site/developer-guide/03-Background jobs/01-intro-background-jobs.md",62195],"741d3c43":[()=>n.e(3866).then(n.bind(n,26229)),"@site/user-guide/03-Extending your Pioreactor/04-Experiment Profiles/10-experiment-profiles-schema.md",26229],"7aaba939":[()=>n.e(9155).then(n.bind(n,45272)),"@site/user-guide/50-Troubleshooting/04-error-codes.md",45272],"7b2a33b6":[()=>n.e(2369).then(n.bind(n,4372)),"@site/user-guide/02-Experiment basics/05-Activities.md",4372],"7c1ae5e6":[()=>n.e(5856).then(n.bind(n,65165)),"@site/developer-guide/03-Background jobs/02-writing-background-jobs.md",65165],"7cd291a4":[()=>n.e(1823).then(n.bind(n,87998)),"@site/user-guide/30-Advanced/16-export-import-existing-data.md",87998],"7dada797":[()=>n.e(9344).then(n.bind(n,98067)),"@site/user-guide/29-Automations/03-led-automations.md",98067],"7ee13ef4":[()=>n.e(4066).then(n.bind(n,8858)),"@site/developer-guide/07-Plugins/01-intro-plugins.md",8858],"81ab6d50":[()=>n.e(4211).then(n.bind(n,20774)),"@site/user-guide/30-Advanced/00-accessing-raspberry-pi.md",20774],"81b74097":[()=>Promise.all([n.e(8187),n.e(7445)]).then(n.bind(n,38230)),"@site/user-guide/03-Extending your Pioreactor/06b-list-of-plugins.mdx",38230],"877afda0":[()=>n.e(4286).then(n.bind(n,22851)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/local_storage.md",22851],"896ec0e8":[()=>n.e(939).then(n.bind(n,78065)),"@site/developer-guide/20-User interface/03-example-api.md",78065],"89efa1e0":[()=>Promise.all([n.e(532),n.e(3463)]).then(n.bind(n,10720)),"@site/experiments/02-Secondary level education/01-control-testing.md",10720],"8ee85411":[()=>n.e(804).then(n.t.bind(n,83769,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"913b8639":[()=>n.e(8093).then(n.bind(n,54298)),"@site/user-guide/00-introduction.md",54298],92376444:[()=>n.e(4522).then(n.bind(n,41554)),"@site/user-guide/29-Automations/00-intro-to-automations.md",41554],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9659efb8":[()=>Promise.all([n.e(532),n.e(5984)]).then(n.bind(n,32775)),"@site/experiments/04-Research and beyond/temp-cycle.md",32775],"9692f74e":[()=>n.e(3270).then(n.bind(n,13287)),"@site/user-guide/30-Advanced/07-additional-hardware/99-hardware-connection-assembly.md",13287],"9730623d":[()=>n.e(3787).then(n.bind(n,70097)),"@site/user-guide/03-Extending your Pioreactor/01-cluster-management/02-power-cluster.md",70097],"99ba85f0":[()=>Promise.all([n.e(532),n.e(2352)]).then(n.bind(n,19702)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/01-version-upgrade.md",19702],"9c7dcd7f":[()=>Promise.all([n.e(532),n.e(9940)]).then(n.bind(n,63864)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/05-optics-reassembly.md",63864],"9d23e5ef":[()=>n.e(1741).then(n.t.bind(n,95078,19)),"~docs/experiments/tag-experiments-tags-temperature-d68.json",95078],a4165bd8:[()=>n.e(1069).then(n.bind(n,61611)),"@site/user-guide/03-Extending your Pioreactor/09-external-power.md",61611],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a888ed47:[()=>n.e(842).then(n.bind(n,45564)),"@site/user-guide/30-Advanced/01-cli.md",45564],a891e202:[()=>Promise.all([n.e(532),n.e(156)]).then(n.bind(n,51058)),"@site/user-guide/03-Extending your Pioreactor/08-hardware-calibrations.md",51058],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,12674)),"@theme/DocRoot",12674],afe9f542:[()=>n.e(5733).then(n.bind(n,39505)),"@site/user-guide/02-Experiment basics/10-manual-led-dosing.md",39505],b053ee98:[()=>Promise.all([n.e(532),n.e(4161)]).then(n.bind(n,44239)),"@site/user-guide/03-Extending your Pioreactor/03-adding-leds.md",44239],b3a861a3:[()=>n.e(9081).then(n.bind(n,93596)),"@site/user-guide/03-Extending your Pioreactor/20-updating-software.md",93596],b4cc13e2:[()=>Promise.all([n.e(532),n.e(5169)]).then(n.bind(n,84838)),"@site/user-guide/03-Extending your Pioreactor/07-using-pumps.md",84838],b504501c:[()=>Promise.all([n.e(532),n.e(3018)]).then(n.bind(n,47802)),"@site/user-guide/29-Automations/02-dosing-automations.md",47802],b5dcdecc:[()=>n.e(9514).then(n.bind(n,62273)),"@site/developer-guide/30-Development/02-development-on-Raspberry-Pi.md",62273],b9d0f450:[()=>n.e(4254).then(n.bind(n,83680)),"@site/user-guide/30-Advanced/07-additional-hardware/02-pinch-valves.md",83680],b9f7fcdb:[()=>n.e(7043).then(n.t.bind(n,79318,19)),"~docs/experiments/tag-experiments-tags-ethanol-a7b.json",79318],ba53f54e:[()=>n.e(4583).then(n.bind(n,49148)),"@site/user-guide/02-Experiment basics/11-running-self-test.md",49148],ba87e863:[()=>n.e(5665).then(n.bind(n,91475)),"@site/developer-guide/04-Automations/03-writing-automations-2.md",91475],bd51d30e:[()=>n.e(4529).then(n.bind(n,43559)),"@site/developer-guide/10-Hardware/06-button-down.md",43559],be95d305:[()=>Promise.all([n.e(532),n.e(6820)]).then(n.bind(n,43727)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/03-build-vial-holder.md",43727],bfe43e66:[()=>Promise.all([n.e(532),n.e(9871)]).then(n.bind(n,10847)),"@site/user-guide/01-getting-started/00-gettingstarted.mdx",10847],c0383162:[()=>n.e(9446).then(n.t.bind(n,12702,19)),"~docs/experiments/tag-experiments-tags-university-education-92d.json",12702],c0a440a7:[()=>n.e(7046).then(n.bind(n,50010)),"@site/developer-guide/02-important-concepts.md",50010],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,59335)),"@site/src/pages/index.js",59335],c61c48fd:[()=>n.e(8095).then(n.t.bind(n,69609,19)),"~docs/experiments/tag-experiments-tags-yeast-4fe.json",69609],c982b89f:[()=>Promise.all([n.e(532),n.e(2519)]).then(n.bind(n,15461)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/02-v11-rpi-hat-assembly.md",15461],ca4bdbc2:[()=>n.e(508).then(n.bind(n,18040)),"@site/developer-guide/99-architecture.md",18040],cbc1afae:[()=>n.e(3418).then(n.t.bind(n,35591,19)),"~docs/experiments/tag-experiments-tags-turbidostat-a78.json",35591],cef17ed2:[()=>Promise.all([n.e(532),n.e(8578)]).then(n.bind(n,84869)),"@site/experiments/03-University level education/01-algae-day-night-cycle.md",84869],cf4872bb:[()=>n.e(8720).then(n.bind(n,66953)),"@site/user-guide/30-Advanced/07-additional-hardware/01-pumps.md",66953],d46cf9e1:[()=>n.e(7849).then(n.bind(n,25357)),"@site/user-guide/30-Advanced/15-intro-python-scripting.md",25357],d51704e4:[()=>n.e(7691).then(n.t.bind(n,12776,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",12776],d53b0e99:[()=>Promise.all([n.e(532),n.e(258)]).then(n.bind(n,34859)),"@site/experiments/02-Secondary level education/yeast-growth-by-temperature.md",34859],d5df37f5:[()=>n.e(5125).then(n.t.bind(n,77966,19)),"~docs/experiments/tag-experiments-tags-continuous-culture-051.json",77966],d5df4937:[()=>Promise.all([n.e(532),n.e(1179)]).then(n.bind(n,1017)),"@site/user-guide/99-common-questions.mdx",1017],d92ee6a6:[()=>n.e(4459).then(n.bind(n,90688)),"@site/user-guide/50-Troubleshooting/Power troubleshooting.md",90688],df063027:[()=>n.e(6911).then(n.bind(n,12170)),"@site/user-guide/29-Automations/01-temperature-automations.md",12170],df203c0f:[()=>Promise.all([n.e(532),n.e(9924)]).then(n.bind(n,40491)),"@theme/DocTagDocListPage",40491],df71d8ce:[()=>n.e(5204).then(n.t.bind(n,91275,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-docs/experiments/plugin-route-context-module-100.json",91275],e2f2dfe9:[()=>n.e(2515).then(n.bind(n,35205)),"@site/developer-guide/01-introduction.md",35205],e4b799f3:[()=>Promise.all([n.e(532),n.e(8688)]).then(n.bind(n,10784)),"@site/user-guide/01-getting-started/02-software-set-up.mdx",10784],e63f9848:[()=>Promise.all([n.e(532),n.e(7955)]).then(n.bind(n,29475)),"@site/user-guide/03-Extending your Pioreactor/05-calibrate-od600.md",29475],e67d5fa3:[()=>n.e(1057).then(n.bind(n,5559)),"@site/user-guide/02-Experiment basics/02-prepare-vial-for-cultures.md",5559],e8b7a5c5:[()=>Promise.all([n.e(532),n.e(7124)]).then(n.bind(n,37338)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/04-pioreactor-reassembly.md",37338],e8d327cb:[()=>n.e(8033).then(n.bind(n,66033)),"@site/developer-guide/25-Calibrations/01-Calibrations.md",66033],e91ab90f:[()=>n.e(575).then(n.bind(n,80404)),"@site/developer-guide/04-Automations/01-intro-automations.md",80404],eb6e170c:[()=>n.e(1699).then(n.bind(n,37221)),"@site/developer-guide/08-Custom pumps/20-writing-pump-software.md",37221],eba206dc:[()=>n.e(3916).then(n.t.bind(n,24224,19)),"~docs/experiments/tag-experiments-tags-seconday-education-f0e.json",24224],ebcf55cf:[()=>n.e(2829).then(n.bind(n,54612)),"@site/developer-guide/04-Automations/02-writing-automations-1.md",54612],edd8515e:[()=>Promise.all([n.e(532),n.e(657)]).then(n.bind(n,95403)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/02-pioreactor-disassembly.md",95403],f0e1c95b:[()=>Promise.all([n.e(532),n.e(895)]).then(n.bind(n,59376)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/05-v11-optics-assembly.md",59376],f1e83790:[()=>n.e(5867).then(n.t.bind(n,18020,19)),"~docs/experiments/tag-experiments-tags-secondary-education-aef.json",18020],f2e19255:[()=>Promise.all([n.e(532),n.e(9828)]).then(n.bind(n,51793)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/02-rpi-hat-assembly.md",51793],f565d366:[()=>n.e(2305).then(n.bind(n,57432)),"@site/user-guide/50-Troubleshooting/UI troubleshooting.md",57432],f5935d94:[()=>n.e(5790).then(n.bind(n,8547)),"@site/developer-guide/04-Automations/05-events.md",8547],f6cabd81:[()=>n.e(6651).then(n.t.bind(n,30980,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-docs/developer-guide/plugin-route-context-module-100.json",30980],f738ccb2:[()=>n.e(3073).then(n.bind(n,16141)),"@site/developer-guide/07-Plugins/02-adding-plugins-to-ui.md",16141],fb3a9273:[()=>n.e(6845).then(n.bind(n,58027)),"@site/user-guide/03-Extending your Pioreactor/05-configuration.md",58027],fb40132f:[()=>Promise.all([n.e(532),n.e(2723)]).then(n.bind(n,64559)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/04-v11-faceplate-all-together.md",64559],fb56bb93:[()=>n.e(6405).then(n.t.bind(n,73477,19)),"~docs/experiments/tag-experiments-tags-nutrient-746.json",73477],fc13d485:[()=>n.e(5433).then(n.bind(n,75614)),"@site/developer-guide/10-Hardware/05-i2c-addresses.md",75614],fdd92877:[()=>Promise.all([n.e(532),n.e(3687)]).then(n.bind(n,58942)),"@site/user-guide/03-Extending your Pioreactor/30-Upgrade kits/12-temperature-expansion-kit.md",58942]};var s=n(85893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(99670),c=n(30226);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(1772).then(n.bind(n,51772)),modules:["@theme/NotFound"],webpack:()=>[51772],render(e,t){const n=e.default;return(0,s.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],m=(0,u.Z)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,s.jsx)(c.z,{value:i,children:(0,s.jsx)(o,{...a,...n})})}})}const p=[{path:"/search",component:d("/search","2d8"),exact:!0},{path:"/developer-guide",component:d("/developer-guide","ffd"),routes:[{path:"/developer-guide",component:d("/developer-guide","f60"),routes:[{path:"/developer-guide",component:d("/developer-guide","087"),routes:[{path:"/developer-guide/adding-calibration-type",component:d("/developer-guide/adding-calibration-type","29d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/adding-plugins-to-ui",component:d("/developer-guide/adding-plugins-to-ui","8f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/architecture",component:d("/developer-guide/architecture","e8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/avoiding-od",component:d("/developer-guide/avoiding-od","6f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/chart-to-ui",component:d("/developer-guide/chart-to-ui","52d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/data-stores-intro",component:d("/developer-guide/data-stores-intro","d51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/events",component:d("/developer-guide/events","b12"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/examples-api",component:d("/developer-guide/examples-api","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/filesystem-locations",component:d("/developer-guide/filesystem-locations","5a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/hat-button",component:d("/developer-guide/hat-button","060"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/i2c-addresses",component:d("/developer-guide/i2c-addresses","1f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/important-concepts",component:d("/developer-guide/important-concepts","6d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/intro-automations",component:d("/developer-guide/intro-automations","956"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/intro-background-jobs",component:d("/developer-guide/intro-background-jobs","2c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/intro-plugins",component:d("/developer-guide/intro-plugins","62c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/introduction",component:d("/developer-guide/introduction","191"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/local-development",component:d("/developer-guide/local-development","8d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/local-storage",component:d("/developer-guide/local-storage","59f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/mqtt",component:d("/developer-guide/mqtt","617"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/pi-development",component:d("/developer-guide/pi-development","1f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/pinout",component:d("/developer-guide/pinout","d7b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/plugin-as-python-package",component:d("/developer-guide/plugin-as-python-package","7d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/sqlite3",component:d("/developer-guide/sqlite3","261"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/web-ui-api",component:d("/developer-guide/web-ui-api","ead"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/web-ui-introduction",component:d("/developer-guide/web-ui-introduction","0ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-automations-1",component:d("/developer-guide/writing-automations-1","f5c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-automations-2",component:d("/developer-guide/writing-automations-2","af5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-background-jobs",component:d("/developer-guide/writing-background-jobs","a33"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-pump-software",component:d("/developer-guide/writing-pump-software","6fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-scripts",component:d("/developer-guide/writing-scripts","7c7"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/experiments",component:d("/experiments","9d4"),routes:[{path:"/experiments",component:d("/experiments","d46"),routes:[{path:"/experiments/tags",component:d("/experiments/tags","800"),exact:!0},{path:"/experiments/tags/caffeine",component:d("/experiments/tags/caffeine","ae9"),exact:!0},{path:"/experiments/tags/continuous-culture",component:d("/experiments/tags/continuous-culture","800"),exact:!0},{path:"/experiments/tags/control",component:d("/experiments/tags/control","603"),exact:!0},{path:"/experiments/tags/ethanol",component:d("/experiments/tags/ethanol","d0e"),exact:!0},{path:"/experiments/tags/nutrient",component:d("/experiments/tags/nutrient","c3e"),exact:!0},{path:"/experiments/tags/salt",component:d("/experiments/tags/salt","e3c"),exact:!0},{path:"/experiments/tags/secondary-education",component:d("/experiments/tags/secondary-education","1cf"),exact:!0},{path:"/experiments/tags/seconday-education",component:d("/experiments/tags/seconday-education","39f"),exact:!0},{path:"/experiments/tags/temperature",component:d("/experiments/tags/temperature","c3f"),exact:!0},{path:"/experiments/tags/turbidostat",component:d("/experiments/tags/turbidostat","4c0"),exact:!0},{path:"/experiments/tags/university-education",component:d("/experiments/tags/university-education","313"),exact:!0},{path:"/experiments/tags/yeast",component:d("/experiments/tags/yeast","789"),exact:!0},{path:"/experiments",component:d("/experiments","0c6"),routes:[{path:"/experiments/algae-day-night-cycle",component:d("/experiments/algae-day-night-cycle","2b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/caffeine-inhibition",component:d("/experiments/caffeine-inhibition","bde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/continuous-cultures-using-turbidostat",component:d("/experiments/continuous-cultures-using-turbidostat","4d1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/control-testing",component:d("/experiments/control-testing","541"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/directed-evolution-salt-tolerance",component:d("/experiments/directed-evolution-salt-tolerance","eed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/introduction",component:d("/experiments/introduction","803"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/low-vs-high-conc-media",component:d("/experiments/low-vs-high-conc-media","00f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/salt-stress-on-yeast",component:d("/experiments/salt-stress-on-yeast","42c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/temp-cycle",component:d("/experiments/temp-cycle","7c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/yeast-growth-by-temperature",component:d("/experiments/yeast-growth-by-temperature","022"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/yeast-in-ethanol",component:d("/experiments/yeast-in-ethanol","a49"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/user-guide",component:d("/user-guide","aef"),routes:[{path:"/user-guide",component:d("/user-guide","d8e"),routes:[{path:"/user-guide",component:d("/user-guide","e9b"),routes:[{path:"/user-guide/20ml-v11-hardware-setup-intro",component:d("/user-guide/20ml-v11-hardware-setup-intro","86d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-optics-assembly",component:d("/user-guide/20ml-v11-optics-assembly","070"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-putting-it-together",component:d("/user-guide/20ml-v11-putting-it-together","039"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-rpi-hat-assembly",component:d("/user-guide/20ml-v11-rpi-hat-assembly","7c4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-wetware-assembly",component:d("/user-guide/20ml-v11-wetware-assembly","6de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/accessing-raspberry-pi",component:d("/user-guide/accessing-raspberry-pi","bfa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/activities",component:d("/user-guide/activities","aaa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/addition-hardware-pumps",component:d("/user-guide/addition-hardware-pumps","d50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/available-plugins",component:d("/user-guide/available-plugins","5b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/calibrate-od600",component:d("/user-guide/calibrate-od600","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/cli",component:d("/user-guide/cli","31e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/common-questions",component:d("/user-guide/common-questions","83c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/configuration",component:d("/user-guide/configuration","15c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/create-cluster",component:d("/user-guide/create-cluster","689"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/create-edit-experiment-profiles",component:d("/user-guide/create-edit-experiment-profiles","8d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/dosing-automations",component:d("/user-guide/dosing-automations","6c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/error-codes",component:d("/user-guide/error-codes","4ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/experiment-profiles",component:d("/user-guide/experiment-profiles","036"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/experiment-profiles-schema",component:d("/user-guide/experiment-profiles-schema","51e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/export-data",component:d("/user-guide/export-data","acb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/export-import-existing-data",component:d("/user-guide/export-import-existing-data","99b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/external-power",component:d("/user-guide/external-power","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/getting-started",component:d("/user-guide/getting-started","7fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/hardware-calibrations",component:d("/user-guide/hardware-calibrations","6dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/hardware-connection-assembly",component:d("/user-guide/hardware-connection-assembly","4f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/hardware-setup-intro",component:d("/user-guide/hardware-setup-intro","d1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/internet-sharing",component:d("/user-guide/internet-sharing","0aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/intro-python-scripting",component:d("/user-guide/intro-python-scripting","3ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/intro-to-automations",component:d("/user-guide/intro-to-automations","edd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/introduction",component:d("/user-guide/introduction","382"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/led-automations",component:d("/user-guide/led-automations","88f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/local-access-point",component:d("/user-guide/local-access-point","f28"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/manual-dosing-leds",component:d("/user-guide/manual-dosing-leds","582"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/monitor-experiment",component:d("/user-guide/monitor-experiment","da6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/networking",component:d("/user-guide/networking","021"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/ngrok-remote-access",component:d("/user-guide/ngrok-remote-access","7eb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/od-normal-growth-rate",component:d("/user-guide/od-normal-growth-rate","872"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/optics-assembly",component:d("/user-guide/optics-assembly","abf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/pinch-valves",component:d("/user-guide/pinch-valves","262"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/powering-cluster",component:d("/user-guide/powering-cluster","c44"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/prepare-vial-for-cultures",component:d("/user-guide/prepare-vial-for-cultures","fe9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/putting-it-together",component:d("/user-guide/putting-it-together","4ad"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/remote-access",component:d("/user-guide/remote-access","4d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/rpi-hat-assembly",component:d("/user-guide/rpi-hat-assembly","143"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/running-self-test",component:d("/user-guide/running-self-test","dc5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/set-up-an-experiment",component:d("/user-guide/set-up-an-experiment","3bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/software-set-up",component:d("/user-guide/software-set-up","eb7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/tailscale-remote-access",component:d("/user-guide/tailscale-remote-access","015"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/temperature-automations",component:d("/user-guide/temperature-automations","4fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/temperature-expansion-kit",component:d("/user-guide/temperature-expansion-kit","599"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-hardware",component:d("/user-guide/troubleshooting-hardware","3de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-power",component:d("/user-guide/troubleshooting-power","80f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-stirring",component:d("/user-guide/troubleshooting-stirring","374"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-ui",component:d("/user-guide/troubleshooting-ui","fd5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/updating-software",component:d("/user-guide/updating-software","c4f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-community-plugins",component:d("/user-guide/using-community-plugins","a38"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-leds",component:d("/user-guide/using-leds","a97"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-pumps",component:d("/user-guide/using-pumps","55c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-stemma-qt",component:d("/user-guide/using-stemma-qt","103"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-building-vial-holder",component:d("/user-guide/v11-upgrade-building-vial-holder","151"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-hardware-setup",component:d("/user-guide/v11-upgrade-hardware-setup","ea8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-optics-assembly",component:d("/user-guide/v11-upgrade-optics-assembly","057"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-pioreactor-disassembly",component:d("/user-guide/v11-upgrade-pioreactor-disassembly","c5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-pioreactor-reassembly",component:d("/user-guide/v11-upgrade-pioreactor-reassembly","489"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/wetware-assembly",component:d("/user-guide/wetware-assembly","ac6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/write-own-automations",component:d("/user-guide/write-own-automations","61d"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","f02"),exact:!0},{path:"*",component:d("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(67294),a=n(85893);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},97221:(e,t,n)=>{"use strict";var r=n(67294),a=n(20745),o=n(73727),i=n(70405),s=n(10412);const l=[n(56657),n(32497),n(3310),n(18320),n(52295),n(74367)];var u=n(723),c=n(16550),d=n(18790),p=n(85893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(35742),g=n(52263),h=n(44996),b=n(86668),y=n(1944),v=n(94711),w=n(19727),x=n(43320),k=n(69356),S=n(90197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.Z)(),r=(0,v.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(m.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,c.TH)();return e+(0,k.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.Z,{tag:x.HX,locale:e}),(0,p.jsx)(m.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function P(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var L=n(98934),j=n(58940),A=n(20469);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,A.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,p.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(c.AW,{location:t,render:()=>e})})}}const D=I,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(99670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(o.VK,{children:(0,p.jsx)(V,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};O(window.location.pathname).then(s)}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(67294),a=n(36809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-KR7J91QFT2"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/user-guide","versions":[{"name":"current","label":"Next","isLast":true,"path":"/user-guide","mainDocId":"introduction","docs":[{"id":"Advanced/accessing-raspberry-pi","path":"/user-guide/accessing-raspberry-pi","sidebar":"tutorialSidebar"},{"id":"Advanced/additional-hardware/hardware-connection-assembly","path":"/user-guide/hardware-connection-assembly","sidebar":"tutorialSidebar"},{"id":"Advanced/additional-hardware/pinch-valves","path":"/user-guide/pinch-valves","sidebar":"tutorialSidebar"},{"id":"Advanced/additional-hardware/pumps","path":"/user-guide/addition-hardware-pumps","sidebar":"tutorialSidebar"},{"id":"Advanced/cli","path":"/user-guide/cli","sidebar":"tutorialSidebar"},{"id":"Advanced/export-import-existing-data","path":"/user-guide/export-import-existing-data","sidebar":"tutorialSidebar"},{"id":"Advanced/intro-python-scripting","path":"/user-guide/intro-python-scripting","sidebar":"tutorialSidebar"},{"id":"Advanced/networking/internet-sharing","path":"/user-guide/internet-sharing","sidebar":"tutorialSidebar"},{"id":"Advanced/networking/local-access-point","path":"/user-guide/local-access-point","sidebar":"tutorialSidebar"},{"id":"Advanced/networking/networking","path":"/user-guide/networking","sidebar":"tutorialSidebar"},{"id":"Advanced/remote-access/introduction","path":"/user-guide/remote-access","sidebar":"tutorialSidebar"},{"id":"Advanced/remote-access/ngrok","path":"/user-guide/ngrok-remote-access","sidebar":"tutorialSidebar"},{"id":"Advanced/remote-access/tailscale","path":"/user-guide/tailscale-remote-access","sidebar":"tutorialSidebar"},{"id":"Automations/dosing-automations","path":"/user-guide/dosing-automations","sidebar":"tutorialSidebar"},{"id":"Automations/intro-to-automations","path":"/user-guide/intro-to-automations","sidebar":"tutorialSidebar"},{"id":"Automations/led-automations","path":"/user-guide/led-automations","sidebar":"tutorialSidebar"},{"id":"Automations/temperature-automations","path":"/user-guide/temperature-automations","sidebar":"tutorialSidebar"},{"id":"Automations/writing-automations","path":"/user-guide/write-own-automations","sidebar":"tutorialSidebar"},{"id":"common-questions","path":"/user-guide/common-questions","sidebar":"tutorialSidebar"},{"id":"Experiment basics/Activities","path":"/user-guide/activities","sidebar":"tutorialSidebar"},{"id":"Experiment basics/export-data","path":"/user-guide/export-data","sidebar":"tutorialSidebar"},{"id":"Experiment basics/manual-led-dosing","path":"/user-guide/manual-dosing-leds","sidebar":"tutorialSidebar"},{"id":"Experiment basics/monitor-experiment","path":"/user-guide/monitor-experiment","sidebar":"tutorialSidebar"},{"id":"Experiment basics/od-normal-growth-rate","path":"/user-guide/od-normal-growth-rate","sidebar":"tutorialSidebar"},{"id":"Experiment basics/prepare-vial-for-cultures","path":"/user-guide/prepare-vial-for-cultures","sidebar":"tutorialSidebar"},{"id":"Experiment basics/running-self-test","path":"/user-guide/running-self-test","sidebar":"tutorialSidebar"},{"id":"Experiment basics/set-up-an-experiment","path":"/user-guide/set-up-an-experiment","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/06a-using-community-plugins","path":"/user-guide/using-community-plugins","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/06b-list-of-plugins","path":"/user-guide/available-plugins","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/adding-leds","path":"/user-guide/using-leds","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/calibrate-od600","path":"/user-guide/calibrate-od600","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/cluster-management/create-cluster","path":"/user-guide/create-cluster","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/cluster-management/power-cluster","path":"/user-guide/powering-cluster","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/configuration","path":"/user-guide/configuration","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Experiment Profiles/create-edit-experiment-profiles","path":"/user-guide/create-edit-experiment-profiles","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Experiment Profiles/experiment-profiles-intro","path":"/user-guide/experiment-profiles","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Experiment Profiles/experiment-profiles-schema","path":"/user-guide/experiment-profiles-schema","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/external-power","path":"/user-guide/external-power","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/hardware-calibrations","path":"/user-guide/hardware-calibrations","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/updating-software","path":"/user-guide/updating-software","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Upgrade kits/temperature-expansion-kit","path":"/user-guide/temperature-expansion-kit","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/using-pumps","path":"/user-guide/using-pumps","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/using-stemma-qt","path":"/user-guide/using-stemma-qt","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/build-vial-holder","path":"/user-guide/v11-upgrade-building-vial-holder","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/optics-reassembly","path":"/user-guide/v11-upgrade-optics-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/pioreactor-disassembly","path":"/user-guide/v11-upgrade-pioreactor-disassembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/pioreactor-reassembly","path":"/user-guide/v11-upgrade-pioreactor-reassembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/version-upgrade","path":"/user-guide/v11-upgrade-hardware-setup","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/faceplate-all-together","path":"/user-guide/putting-it-together","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/introduction","path":"/user-guide/hardware-setup-intro","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/optics-assembly","path":"/user-guide/optics-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/rpi-hat-assembly","path":"/user-guide/rpi-hat-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/wetware-assembly","path":"/user-guide/wetware-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-faceplate-all-together","path":"/user-guide/20ml-v11-putting-it-together","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-introduction","path":"/user-guide/20ml-v11-hardware-setup-intro","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-optics-assembly","path":"/user-guide/20ml-v11-optics-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-rpi-hat-assembly","path":"/user-guide/20ml-v11-rpi-hat-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-wetware-assembly","path":"/user-guide/20ml-v11-wetware-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/gettingstarted","path":"/user-guide/getting-started","sidebar":"tutorialSidebar"},{"id":"getting-started/software-set-up","path":"/user-guide/software-set-up","sidebar":"tutorialSidebar"},{"id":"introduction","path":"/user-guide/introduction","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/error-codes","path":"/user-guide/error-codes","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/Hardware troubleshooting","path":"/user-guide/troubleshooting-hardware","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/Power troubleshooting","path":"/user-guide/troubleshooting-power","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/Stirring troubleshooting","path":"/user-guide/troubleshooting-stirring","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/UI troubleshooting","path":"/user-guide/troubleshooting-ui","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/user-guide/introduction","label":"introduction"}}}}],"breadcrumbs":false},"developer-guide":{"path":"/developer-guide","versions":[{"name":"current","label":"Next","isLast":true,"path":"/developer-guide","mainDocId":"introduction","docs":[{"id":"architecture","path":"/developer-guide/architecture","sidebar":"tutorialSidebar"},{"id":"Automations/events","path":"/developer-guide/events","sidebar":"tutorialSidebar"},{"id":"Automations/intro-automations","path":"/developer-guide/intro-automations","sidebar":"tutorialSidebar"},{"id":"Automations/writing-automations-1","path":"/developer-guide/writing-automations-1","sidebar":"tutorialSidebar"},{"id":"Automations/writing-automations-2","path":"/developer-guide/writing-automations-2","sidebar":"tutorialSidebar"},{"id":"Background jobs/avoiding-od","path":"/developer-guide/avoiding-od","sidebar":"tutorialSidebar"},{"id":"Background jobs/intro-background-jobs","path":"/developer-guide/intro-background-jobs","sidebar":"tutorialSidebar"},{"id":"Background jobs/writing-background-jobs","path":"/developer-guide/writing-background-jobs","sidebar":"tutorialSidebar"},{"id":"Calibrations/Calibrations","path":"/developer-guide/adding-calibration-type","sidebar":"tutorialSidebar"},{"id":"Custom pumps/writing-pump-software","path":"/developer-guide/writing-pump-software","sidebar":"tutorialSidebar"},{"id":"Development/development-on-Raspberry-Pi","path":"/developer-guide/pi-development","sidebar":"tutorialSidebar"},{"id":"Development/local-development","path":"/developer-guide/local-development","sidebar":"tutorialSidebar"},{"id":"Hardware/button-down","path":"/developer-guide/hat-button","sidebar":"tutorialSidebar"},{"id":"Hardware/i2c-addresses","path":"/developer-guide/i2c-addresses","sidebar":"tutorialSidebar"},{"id":"Hardware/pinout","path":"/developer-guide/pinout","sidebar":"tutorialSidebar"},{"id":"important-concepts","path":"/developer-guide/important-concepts","sidebar":"tutorialSidebar"},{"id":"introduction","path":"/developer-guide/introduction","sidebar":"tutorialSidebar"},{"id":"Plugins/adding-plugins-to-ui","path":"/developer-guide/adding-plugins-to-ui","sidebar":"tutorialSidebar"},{"id":"Plugins/intro-plugins","path":"/developer-guide/intro-plugins","sidebar":"tutorialSidebar"},{"id":"Plugins/plugin-as-python-package","path":"/developer-guide/plugin-as-python-package","sidebar":"tutorialSidebar"},{"id":"Scripts/writing-scripts","path":"/developer-guide/writing-scripts","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/data-stores-intro","path":"/developer-guide/data-stores-intro","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/local_storage","path":"/developer-guide/local-storage","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/mqtt","path":"/developer-guide/mqtt","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/sqlite","path":"/developer-guide/sqlite3","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/filesystem","path":"/developer-guide/filesystem-locations","sidebar":"tutorialSidebar"},{"id":"User interface/adding-charts","path":"/developer-guide/chart-to-ui","sidebar":"tutorialSidebar"},{"id":"User interface/api","path":"/developer-guide/web-ui-api","sidebar":"tutorialSidebar"},{"id":"User interface/example-api","path":"/developer-guide/examples-api","sidebar":"tutorialSidebar"},{"id":"User interface/introduction","path":"/developer-guide/web-ui-introduction","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/developer-guide/introduction","label":"introduction"}}}}],"breadcrumbs":false},"experiments":{"path":"/experiments","versions":[{"name":"current","label":"Next","isLast":true,"path":"/experiments","mainDocId":"Introduction","docs":[{"id":"Introduction","path":"/experiments/introduction","sidebar":"tutorialSidebar"},{"id":"Research and beyond/directed-evolution-salt-tolerance","path":"/experiments/directed-evolution-salt-tolerance","sidebar":"tutorialSidebar"},{"id":"Research and beyond/temp-cycle","path":"/experiments/temp-cycle","sidebar":"tutorialSidebar"},{"id":"Secondary level education/caffeine-inhibition","path":"/experiments/caffeine-inhibition","sidebar":"tutorialSidebar"},{"id":"Secondary level education/control-testing","path":"/experiments/control-testing","sidebar":"tutorialSidebar"},{"id":"Secondary level education/low-vs-high-conc-media","path":"/experiments/low-vs-high-conc-media","sidebar":"tutorialSidebar"},{"id":"Secondary level education/salt-stress-on-yeast","path":"/experiments/salt-stress-on-yeast","sidebar":"tutorialSidebar"},{"id":"Secondary level education/yeast-growth-by-temperature","path":"/experiments/yeast-growth-by-temperature","sidebar":"tutorialSidebar"},{"id":"Secondary level education/yeast-in-ethanol","path":"/experiments/yeast-in-ethanol","sidebar":"tutorialSidebar"},{"id":"University level education/algae-day-night-cycle","path":"/experiments/algae-day-night-cycle","sidebar":"tutorialSidebar"},{"id":"University level education/continuous-cultures-using-turbidostat","path":"/experiments/continuous-cultures-using-turbidostat","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/experiments/introduction","label":"Introduction"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const l=JSON.parse('{"docusaurusVersion":"3.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.1"},"docusaurus-plugin-google-analytics":{"type":"package","name":"@docusaurus/plugin-google-analytics","version":"3.0.1"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.38.1"}}}');var u=n(85893);const c={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(c);function p(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(10412),o=n(35742),i=n(69356),s=n(8862),l=n(85893);function u(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(c,{error:t})]})}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(u,{error:t,tryAgain:n}),children:[(0,l.jsx)(o.Z,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.Z,{children:(0,l.jsx)(u,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??p)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);var r=n(70405),a=n(85893);function o(e){return(0,a.jsx)(r.ql,{...e})}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(73727),o=n(69356),i=n(52263),s=n(13919),l=n(10412),u=n(85893);const c=r.createContext({collectLink:()=>{}});var d=n(44996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:x}=(0,d.C)(),k=(0,r.useContext)(c),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.Z)(_),C=_?.replace("pathname://","");let T=void 0!==C?(P=C,b&&(e=>e.startsWith("/"))(P)?x(P):P):void 0;var P;T&&E&&(T=(0,o.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const L=(0,r.useRef)(!1),j=n?a.OL:a.rU,A=l.Z.canUseIntersectionObserver,R=(0,r.useRef)(),N=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,r.useEffect)((()=>(!A&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{A&&R.current&&R.current.disconnect()})),[R,T,A,E]);const O=T?.startsWith("#")??!1,I=!T||!E||O;return I||h||k.collectLink(T),I?(0,u.jsx)("a",{ref:S,href:T,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,u.jsx)(j,{...y,onMouseEnter:N,onTouchStart:N,innerRef:e=>{S.current=e,A&&e&&E&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T,...n&&{isActive:g,activeClassName:m}})}const f=r.forwardRef(p)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u,I:()=>l});var r=n(67294),a=n(85893);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(57529);function s(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function u(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=s({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(67294),a=n(52263),o=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(58940);function o(){return(0,r.useContext)(a._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},20469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294);const a=n(10412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(67294),a=n(85893);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},5743:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},7192:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},69356:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(5743);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(7192);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>f});var r=n(16550),a=n(52263),o=n(29935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function m(e){const t=d(e);return s(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},74367:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||(window.ga("set","page",t.pathname+t.search+t.hash),window.ga("send","pageview"))}}},56657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(34798),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(96854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},92503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(36905),a=n(95999),o=n(86668),i=n(39960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var l=n(85893);function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:c}}=(0,o.L)();if("h1"===t||!n)return(0,l.jsx)(t,{...u,id:void 0});const d=(0,a.I)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,l.jsxs)(t,{...u,className:(0,r.Z)("anchor",c?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,l.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d,children:"\u200b"})]})}},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(85893);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},8862:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ot});var r=n(67294),a=n(36905),o=n(44763),i=n(1944),s=n(16550),l=n(95999),u=n(85936),c=n(85893);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function g(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(35281),b=n(19727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(g,{className:y.skipToContent})}var w=n(86668),x=n(59689);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.Z)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function P(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,x.nT)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:T.announcementBarPlaceholder}),(0,c.jsx)(C,{className:T.announcementBarContent}),o&&(0,c.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var L=n(93163),j=n(12466);var A=n(902),R=n(13102);const N=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,R.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,A.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(N.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,R.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=D();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(92949),z=n(72389);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.Z)(),s=(0,l.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.Z)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.I)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var V=n(21327);function G(){return(0,c.jsx)(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,L.e)();return(0,c.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,c.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(G,{}),(0,c.jsx)(Z,{className:"margin-right--md"}),(0,c.jsx)(W,{})]})}var Y=n(39960),X=n(44996),J=n(13919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...u}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(a,{forcePrependBaseUrl:!0}),m=o&&a&&!(0,J.Z)(a),g=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,m&&(0,c.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return a?(0,c.jsx)(Y.Z,{href:l?f:a,...u,...g}):(0,c.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...u,...g})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.Z)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(86043),se=n(48596),le=n(52263);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[l]),(0,c.jsxs)("div",{ref:l,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:s.children??s.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ze,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),(0,c.jsxs)("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.Z)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,c.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ze,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,c.jsx)(r,{...n})}var me=n(94711);function ge(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const he="iconLanguage_nlXk";var be=n(61029),ye=n(86010),ve=n(60373),we=n(80143),xe=n(90022),ke=n(98202),Se=n(73926),_e=n(91073),Ee=n(82539),Ce=n(10726);const Te='',Pe='',Le='',je='',Ae='',Re='',Ne='',Oe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ie(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,u=1===n,c=[];i?c.push(Re):s&&c.push(Ne);const d=c.map((e=>`${e}`)),p=`${l?Te:u?Pe:Le}`,f=[`${(0,Ce.o)(t.t,(0,_e.m)(a,"t"),o)}`];if(!i&&!s&&be.H6){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Se.e)(e??[])}`)}else l||f.push(`${(0,Ee.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const m=`${je}`;return[...d,p,``,...f,"",m].join("")}function De(){return`${Ae}${(0,l.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Fe=n(80311);async function Me(){const e=await Promise.all([n.e(8443),n.e(6165)]).then(n.t.bind(n,68443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const ze="_highlight";const Be=function(e){let{handleSearchBarToggle:t}=e;const n=(0,z.Z)(),{siteConfig:{baseUrl:a}}=(0,le.Z)(),o=(0,we.gA)();let i=a;try{const{preferredVersion:e}=(0,ve.J)(o?.pluginId??be.gQ);e&&!e.isLast&&(i=e.path+"/")}catch(D){if(be.l9&&!(D instanceof A.i6))throw D}const u=(0,s.k6)(),d=(0,s.TH)(),p=(0,r.useRef)(null),f=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[g,h]=(0,r.useState)(!1),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(""),x=(0,r.useRef)(null),k=(0,r.useRef)(""),[S,_]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Kc))return;let e="";if(d.pathname.startsWith(i)){const t=d.pathname.substring(i.length),n=be.Kc.find((e=>t===e||t.startsWith(`${e}/`)));n&&(e=n)}k.current!==e&&(f.current.delete(e),k.current=e),_(e)}),[d.pathname,i]);const E=!!be.hG&&Array.isArray(be.Kc)&&""===S,C=(0,r.useCallback)((async()=>{if(E||f.current.get(S))return;f.current.set(S,"loading"),x.current?.autocomplete.destroy(),h(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,xe.w)(i,S),Me()]);if(x.current=n(p.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.Z)(Oe.searchBar,{[Oe.searchBarLeft]:"left"===be.pu}),noPrefix:!0,dropdownMenu:Oe.dropdownMenu,input:Oe.input,hint:Oe.hint,suggestions:Oe.suggestions,suggestion:Oe.suggestion,cursor:Oe.cursor,dataset:Oe.dataset,empty:Oe.empty}},[{source:(0,ke.v)(e,t,be.qo),templates:{suggestion:Ie,empty:De,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&!S)return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),o=new URLSearchParams,s=(0,l.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),c=(0,l.I)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:S}),d=(0,l.I)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:S});let p;if(o.set("q",t),p=S&&n?c:S?d:s,Array.isArray(be.Kc)&&!n&&o.set("ctx",S),i!==a){if(!i.startsWith(a))throw new Error(`Version url '${i}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",i.substring(a.length))}const f=`${a}search?${o.toString()}`;return r.href=f,r.textContent=p,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),x.current?.autocomplete.close(),u.push(f))})),r})({query:t,isEmpty:n}),o=document.createElement("div");return o.className=Oe.hitFooter,o.appendChild(r),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;p.current?.blur();let o=n;if(be.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(ze,t);o+=`?${e.toString()}`}r&&(o+=r),u.push(o)})).on("autocomplete:closed",(()=>{p.current?.blur()})),f.current.set(S,"done"),h(!1),m.current){const e=p.current;e.value&&x.current?.autocomplete.open(),e.focus()}}),[E,S,i,a,u]);(0,r.useEffect)((()=>{if(!be.vc)return;const e=n?new URLSearchParams(d.search).getAll(ze):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.vc(t);n.unmark(),0!==e.length&&n.mark(e),w(e.join(" ")),x.current?.autocomplete.setVal(e.join(" "))}))}),[n,d.search,d.pathname]);const[T,P]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{m.current=!0,C(),P(!0),t?.(!0)}),[t,C]),j=(0,r.useCallback)((()=>{P(!1),t?.(!1)}),[t]),R=(0,r.useCallback)((()=>{C()}),[C]),N=(0,r.useCallback)((e=>{w(e.target.value),e.target.value&&y(!0)}),[]),O=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.AY)return;const e=e=>{!(O?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),p.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[O,L]);const I=(0,r.useCallback)((()=>{const e=new URLSearchParams(d.search);e.delete(ze);const t=e.toString(),n=d.pathname+(""!=t?`?${t}`:"")+d.hash;n!=d.pathname+d.search+d.hash&&u.push(n),w(""),x.current?.autocomplete.setVal("")}),[d.pathname,d.search,d.hash,u]);return(0,c.jsxs)("div",{className:(0,ye.Z)("navbar__search",Oe.searchBarContainer,{[Oe.searchIndexLoading]:g&&b,[Oe.focused]:T}),hidden:E,children:[(0,c.jsx)("input",{placeholder:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:L,onBlur:j,onChange:N,ref:p,value:v}),(0,c.jsx)(Fe.Z,{className:Oe.searchBarLoadingRing}),be.AY&&be.t_&&(""!==v?(0,c.jsx)("button",{className:Oe.searchClearButton,onClick:I,children:"\u2715"}):n&&(0,c.jsxs)("div",{className:Oe.searchHintContainer,children:[(0,c.jsx)("kbd",{className:Oe.searchHint,children:O?"\u2318":"ctrl"}),(0,c.jsx)("kbd",{className:Oe.searchHint,children:"K"})]}))]})},$e={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ue(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.Z)(n,$e.navbarSearchContainer),children:t})}var qe=n(53438);const He=e=>e.docs.find((t=>t.id===e.mainDocId));const Qe={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,le.Z)(),p=(0,me.l)(),{search:f,hash:m}=(0,s.TH)(),g=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(fe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ge,{className:he}),h]}),items:g})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(Ue,{className:n,children:(0,c.jsx)(Be,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.Z)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,qe.vY)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,qe.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,qe.lO)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,s.TH)(),p=(0,we.Iw)(n),f=(0,we.gB)(n),{savePreferredVersionName:m}=(0,ve.J)(n),g=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??He(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...o],h=(0,qe.lO)(n)[0],b=t&&g.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&g.length>1?void 0:He(h).path;return g.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,c.jsx)(fe,{...i,mobile:t,label:b,to:y,items:g,isActive:r?()=>!1:void 0})}};function Ze(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Qe[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function Ve(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ze,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ge(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(l.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function We(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ge,{onClick:()=>t.hide()}),t.content]})}function Ke(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,c.jsx)(F,{header:(0,c.jsx)(K,{}),primaryMenu:(0,c.jsx)(Ve,{}),secondaryMenu:(0,c.jsx)(We,{})}):null}const Ye={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Xe(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.Z)("navbar-sidebar__backdrop",e.className)})}function Je(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,j.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ye.navbarHideable,!d&&Ye.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Xe,{onClick:i.toggle}),(0,c.jsx)(Ke,{})]})}var et=n(69356);const tt={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function nt(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(l.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function rt(e){let{error:t}=e;const n=(0,et.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:tt.errorBoundaryError,children:n})}class at extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const ot="right";function it(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function st(){const{toggle:e,shown:t}=(0,L.e)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,l.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,c.jsx)(it,{})})}const lt={colorModeToggle:"colorModeToggle_DEke"};function ut(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(at,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,c.jsx)(Ze,{...e})},t)))})}function ct(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function dt(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??ot)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,c.jsx)(ct,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(st,{}),(0,c.jsx)(G,{}),(0,c.jsx)(ut,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ut,{items:r}),(0,c.jsx)(Z,{className:lt.colorModeToggle}),!a&&(0,c.jsx)(Ue,{children:(0,c.jsx)(Be,{})})]})})}function pt(){return(0,c.jsx)(Je,{children:(0,c.jsx)(dt,{})})}function ft(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.Z)(n),l=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...i,children:[a,r&&!(0,J.Z)(r)&&(0,c.jsx)(te.Z,{})]})}function mt(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(ft,{item:t})},t.href??t.to)}function gt(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(mt,{item:e},t)))})]})}function ht(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(gt,{column:e},t)))})}function bt(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function yt(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(ft,{item:t})}function vt(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(yt,{item:e}),t.length!==n+1&&(0,c.jsx)(bt,{})]},n)))})})}function wt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(ht,{columns:t}):(0,c.jsx)(vt,{links:t})}var xt=n(19965);const kt={footerLogoLink:"footerLogoLink_BH7S"};function St(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(xt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function _t(e){let{logo:t}=e;return t.href?(0,c.jsx)(Y.Z,{href:t.href,className:kt.footerLogoLink,target:t.target,children:(0,c.jsx)(St,{logo:t})}):(0,c.jsx)(St,{logo:t})}function Et(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ct(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function Tt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(Ct,{style:a,links:n&&n.length>0&&(0,c.jsx)(wt,{links:n}),logo:r&&(0,c.jsx)(_t,{logo:r}),copyright:t&&(0,c.jsx)(Et,{copyright:t})})}const Pt=r.memo(Tt),Lt=(0,A.Qc)([M.S,x.pl,j.OC,ve.L5,i.VC,function(e){let{children:t}=e;return(0,c.jsx)(R.n2,{children:(0,c.jsx)(L.M,{children:(0,c.jsx)(O,{children:t})})})}]);function jt(e){let{children:t}=e;return(0,c.jsx)(Lt,{children:t})}var At=n(92503);function Rt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(At.Z,{as:"h1",className:"hero__title",children:(0,c.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(nt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(rt,{error:t})})]})})})}const Nt={mainWrapper:"mainWrapper_z2l0"};function Ot(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,c.jsxs)(jt,{children:[(0,c.jsx)(i.d,{title:s,description:l}),(0,c.jsx)(v,{}),(0,c.jsx)(P,{}),(0,c.jsx)(pt,{}),(0,c.jsx)("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,Nt.mainWrapper,r),children:(0,c.jsx)(o.Z,{fallback:e=>(0,c.jsx)(Rt,{...e}),children:t})}),!n&&(0,c.jsx)(Pt,{})]})}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(67294);var r=n(39960),a=n(44996),o=n(52263),i=n(86668),s=n(19965),l=n(85893);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Z)(t.src),dark:(0,a.Z)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:c,titleClassName:d,...p}=e,f=(0,a.Z)(s?.href||"/"),m=n?"":t,g=s?.alt??m;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(u,{logo:s,alt:g,imageClassName:c}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);var r=n(35742),a=n(85893);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.Z,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},19965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(67294),a=n(788),o=n(72389),i=n(92949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(85893);function u(e){let{className:t,children:n}=e;const u=(0,o.Z)(),{colorMode:c}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>u,z:()=>b});var r=n(67294),a=n(10412),o=n(20469),i=n(91442),s=n(85893);const l="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function m(e){if(!a.Z.canUseDOM)return e?c:d}function g(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:c,style:u?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(c.current,n),i?.(n))},className:l,children:a})}function h(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,u]=(0,r.useState)(t);return(0,o.Z)((()=>{t||i(!0)}),[t]),(0,o.Z)((()=>{a&&u(t)}),[a,t]),a?(0,s.jsx)(g,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:g;return(0,s.jsx)(r,{...n})}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>m});var r=n(67294),a=n(72389),o=n(50012),i=n(902),s=n(86668),l=n(85893);const u=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===u.get(),p=e=>u.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>h});var r=n(67294),a=n(10412),o=n(902),i=n(50012),s=n(86668),l=n(85893);const u=r.createContext(void 0),c="theme",d=(0,i.WA)(c),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),g=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&g(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,l.jsx)(u.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(u);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b});var r=n(67294),a=n(80143),o=n(29935),i=n(86668),s=n(53438),l=n(902),u=n(50012),c=n(85893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,u.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return(0,c.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.cE?(0,c.jsx)(h,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function y(){const e=(0,r.useContext)(m);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>u,b:()=>l});var r=n(67294),a=n(902),o=n(85893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(s.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(s);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(67294),a=n(902),o=n(85893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.i6("DocsVersionProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(67294),a=n(13102),o=n(87524),i=n(91980),s=n(86668),l=n(902),u=n(85893);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,u]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function p(e){let{children:t}=e;const n=d();return(0,u.jsx)(c.Provider,{value:n,children:t})}function f(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>u,n2:()=>s});var r=n(67294),a=n(902),o=n(85893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(67294),a=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){const[e,t]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){t(function(){if(!a.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>i?o.desktop:o.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},35281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},91442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},53438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,SN:()=>_,_F:()=>h,cE:()=>p,f:()=>y,lO:()=>x,oz:()=>k,s1:()=>w,vY:()=>S});var r=n(67294),a=n(16550),o=n(18790),i=n(80143),s=n(60373),l=n(74477),u=n(1116),c=n(67392),d=n(48596);const p=!!i._r;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),g=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||g(e.items,t))}function b(e,t){switch(e.type){case"category":return h(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||h(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,u.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,a.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,a.LX)(n.pathname,e)));if(!s)return null;const u=s.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,o.H)(i),sidebarName:u,sidebarItems:c}}},91980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>s});var r=n(67294),a=n(16550),o=n(902);function i(e){!function(e){const t=(0,a.k6)(),n=(0,o.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},67392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>m});var r=n(67294),a=n(788),o=n(35742),i=n(30226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(44996),u=n(52263);var c=n(85893);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const s=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.Z,{children:[t&&(0,c.jsx)("title",{children:s}),t&&(0,c.jsx)("meta",{property:"og:title",content:s}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),s=(0,a.Z)(i,t);return(0,c.jsxs)(p.Provider,{value:s,children:[(0,c.jsx)(o.Z,{children:(0,c.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,a.Z)(r,o),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>c,Ql:()=>u,i6:()=>l,zX:()=>i});var r=n(67294),a=n(20469),o=n(85893);function i(e){const t=(0,r.useRef)(e);return(0,a.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,a.Z)((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),a=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>g,OC:()=>c,RF:()=>f,o5:()=>m});var r=n(67294),a=n(10412),o=n(72389),i=n(20469),s=n(902),l=n(85893);const u=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(u.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(u);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),a=(0,r.useRef)(p()),o=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function m(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),a=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function g(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(52263);const r="default";function a(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>c,WA:()=>u});var r=n(67294);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=i(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),o({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),o({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function c(e,t){const n=(0,r.useRef)((()=>null===e?l:u(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(52263),a=n(16550),o=n(69356);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=s===i?e:e.replace(`/${s}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},80311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(67294);var r=n(86010);const a={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var o=n(85893);function i(e){let{className:t}=e;return(0,o.jsxs)("div",{className:(0,r.Z)(a.loadingRing,t),children:[(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{})]})}},90022:(e,t,n)=>{"use strict";n.d(t,{w:()=>s});var r=n(31336),a=n.n(r),o=n(61029);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},98202:(e,t,n)=>{"use strict";n.d(t,{v:()=>l});var r=n(31336),a=n.n(r);var o=n(61029);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===l.length)return void s([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:a.missed,term:a.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>o;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){o=t;const s={missed:a.missed,term:a.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const a of s)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)l.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(l))}(l,t),c=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(c.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},21690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},91073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},82539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(21690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},10726:(e,t,n)=>{"use strict";n.d(t,{o:()=>l});var r=n(21690),a=n(82539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var s=n(61029);function l(e,t,n,o){void 0===o&&(o=s.Hk);const{chunkIndex:l,chunks:u}=function(e,t,n){const o=[];let s=0,l=0,u=-1;for(;sl){const t=i(e.substring(l,c)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===u&&(u=o.length),l=c+d,o.push({html:(0,a.C)(e.substring(c,l),n,!0),textLength:d})}}if(l({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:u,chunks:o}}(e,t,n),c=u.slice(0,l),d=u[l],p=[d.html],f=u.slice(l+1);let m=d.textLength,g=0,h=0,b=!1,y=!1;for(;m0){const e=c.pop();m+e.textLength<=o?(p.unshift(e.html),g+=e.textLength,m+=e.textLength):(b=!0,c.length=0)}else{if(!(f.length>0))break;{const e=f.shift();m+e.textLength<=o?(p.push(e.html),h+=e.textLength,m+=e.textLength):(y=!0,f.length=0)}}return(b||c.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},61029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>o,gQ:()=>f,H6:()=>u,hG:()=>h,l9:()=>m,dK:()=>r,_k:()=>a,pu:()=>p,AY:()=>c,t_:()=>d,Kc:()=>g,J:()=>i,Hk:()=>l,qo:()=>s,pQ:()=>b});n(31336);const r=["en"],a=!1,o=null,i="search-index{dir}.json?_=06b7fd19",s=8,l=50,u=!1,c=!0,d=!0,p="right",f=void 0,m=!0,g=null,h=!1,b=!1},86010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>P,Ep:()=>p});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(38776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var s=l(t),g=l(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},31336:(e,t,n)=>{var r,a;!function(){var o,i,s,l,u,c,d,p,f,m,g,h,b,y,v,w,x,k,S,_,E,C,T,P,L,j,A,R,N,O,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=a.length,a.push(new I.Token(n.slice(i,o),l))}i=o+1}}return a},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:os?u+=2:i==s&&(t+=n[l+1]*r[u+1],l+=2,u+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new I.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new I.TokenSet;a.node.edges["*"]=s}if(0==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new I.TokenSet;a.node.edges["*"]=l}1==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new I.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(a.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=a)}()},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,a;r=function(){var e,t,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 a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,i(e,c,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},14779:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,s="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],g=n[2],h=n[3],b=n[4],y=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var x=null!=g&&null!=m&&m!==g,k="+"===v||"*"===v,S="?"===v||"*"===v,_=n[2]||c,E=b||y;r.push({name:h||o++,prefix:g||"",delimiter:_,optional:S,repeat:k,partial:x,asterisk:!!w,pattern:E?u(E):w?".*":"[^"+l(_)+"]+?"})}}return i{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(29901),a=n(39642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),o.add(e)}))}i.silent=!1,e.exports=i},96854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var u=s[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),m=p.indexOf(f);if(m>-1){++a;var g=p.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),y=[];g&&y.push.apply(y,i([g])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof u?s.splice.apply(s,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return s}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},16500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=16500},39642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var s={},l=e[r];if(l){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,o),s[t]=!0,n[t])s[i]=!0}t(l.require,u),t(l.optional,u),t(l.modify,u)}n[r]=s,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(l);i=i.map(u),s=(s||[]).map(u);var c=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var p,f=r(l),m=c;a(m);){for(var g in p={},m){var h=l[g];t(h&&h.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in c))for(var y in f(b))if(y in c){p[b]=!0;break}for(var v in m=p)c[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,s={},l={};function u(e){if(e in s)return s[e];l[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var p=i(c.map((function(e){var t=u(e);return delete l[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return s[e]=a}for(var c in n)u(c);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,c,t,n)}};return w}}();e.exports=t},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(63840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n