From f4868991023550a6b3eee22dafe119ef3e5cb2b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 14:38:08 +0000 Subject: [PATCH] deploy: c0d808f18964749ef19d0b814503bd03758be063 --- 404.html | 8 ++++---- assets/js/04115efe.a166a43b.js | 1 + assets/js/04115efe.e8aeff5d.js | 1 - .../{1db64337.2675c864.js => 1db64337.b2a8d27d.js} | 2 +- .../{1df93b7f.b6548682.js => 1df93b7f.224599d5.js} | 2 +- assets/js/735d0569.85fea1fa.js | 1 + assets/js/735d0569.d2da1b08.js | 1 - .../{74876495.4b1a4773.js => 74876495.7da9c602.js} | 2 +- .../{935f2afb.f0c270bf.js => 935f2afb.609ede5f.js} | 2 +- assets/js/{main.95f684d1.js => main.7b9cd64a.js} | 4 ++-- ...js.LICENSE.txt => main.7b9cd64a.js.LICENSE.txt} | 0 ...e~main.b88d0fd0.js => runtime~main.c9b44e16.js} | 2 +- authenticating-with-api-keys.html | 8 ++++---- automated-testing/creating-custom-components.html | 8 ++++---- automated-testing/getting-started.html | 8 ++++---- automated-testing/gpt-assistant-bot.html | 8 ++++---- automated-testing/overview.html | 8 ++++---- blog.html | 8 ++++---- blog/archive.html | 8 ++++---- blog/first-blog-post.html | 8 ++++---- blog/long-blog-post.html | 8 ++++---- blog/mdx-blog-post.html | 8 ++++---- blog/tags.html | 8 ++++---- blog/tags/docusaurus.html | 8 ++++---- blog/tags/facebook.html | 8 ++++---- blog/tags/hello.html | 8 ++++---- blog/tags/hola.html | 8 ++++---- blog/welcome.html | 8 ++++---- changelog.html | 14 +++++++------- computer-vision.html | 8 ++++---- computer-vision/image-match.html | 8 ++++---- computer-vision/object-detection.html | 8 ++++---- computer-vision/text-match.html | 8 ++++---- creating-bots/csharp/adaptive-bots.html | 8 ++++---- creating-bots/csharp/agent-builder.html | 8 ++++---- .../gameplay-sessions-getting-started.html | 8 ++++---- gameplay-sessions/gameplay-sessions-reference.html | 8 ++++---- gameplay-sessions/gameplay-sessions-usage.html | 8 ++++---- generic-bots/monkey-bot.html | 8 ++++---- index.html | 10 +++++----- markdown-page.html | 8 ++++---- overview.html | 10 +++++----- pre-made-bots.html | 8 ++++---- quickstart.html | 10 +++++----- session-insights/client-dashboard.html | 8 ++++---- session-insights/in-editor-replay.html | 8 ++++---- tutorials/building-your-first-bot.html | 10 +++++----- tutorials/github-actions.html | 8 ++++---- validations/validations-getting-started.html | 8 ++++---- validations/validations-rules-reference.html | 8 ++++---- .../validations-scenario-builder-reference.html | 8 ++++---- 51 files changed, 176 insertions(+), 176 deletions(-) create mode 100644 assets/js/04115efe.a166a43b.js delete mode 100644 assets/js/04115efe.e8aeff5d.js rename assets/js/{1db64337.2675c864.js => 1db64337.b2a8d27d.js} (98%) rename assets/js/{1df93b7f.b6548682.js => 1df93b7f.224599d5.js} (99%) create mode 100644 assets/js/735d0569.85fea1fa.js delete mode 100644 assets/js/735d0569.d2da1b08.js rename assets/js/{74876495.4b1a4773.js => 74876495.7da9c602.js} (59%) rename assets/js/{935f2afb.f0c270bf.js => 935f2afb.609ede5f.js} (99%) rename assets/js/{main.95f684d1.js => main.7b9cd64a.js} (99%) rename assets/js/{main.95f684d1.js.LICENSE.txt => main.7b9cd64a.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.b88d0fd0.js => runtime~main.c9b44e16.js} (66%) diff --git a/404.html b/404.html index bc37e38d..18ade16f 100644 --- a/404.html +++ b/404.html @@ -9,13 +9,13 @@ - - + +
Skip to main content

Page Not Found

This page no longer exists. It may have moved, or its content is no longer supported by Regression Games.

- - + + \ No newline at end of file diff --git a/assets/js/04115efe.a166a43b.js b/assets/js/04115efe.a166a43b.js new file mode 100644 index 00000000..a23234e8 --- /dev/null +++ b/assets/js/04115efe.a166a43b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[5792],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(7294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=r(e,["components","mdxType","originalType","parentName"]),d=p(a),m=o,h=d["".concat(l,".").concat(m)]||d[m]||c[m]||i;return a?n.createElement(h,s(s({ref:t},u),{},{components:a})):n.createElement(h,s({ref:t},u))}));function h(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,s=new Array(i);s[0]=m;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[d]="string"==typeof e?e:o,s[1]=r;for(var p=2;p{a.d(t,{ZP:()=>r});var n=a(7462),o=(a(7294),a(3905));const i={toc:[]},s="wrapper";function r(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Find the ",(0,o.kt)("inlineCode",{parentName:"p"},"RGOverlayCanvasV2")," prefab by navigating to ",(0,o.kt)("strong",{parentName:"p"},"Packages")," > ",(0,o.kt)("strong",{parentName:"p"},"Regression Games Unity Bots")," > ",(0,o.kt)("strong",{parentName:"p"},"Runtime")," > ",(0,o.kt)("strong",{parentName:"p"},"Prefabs")," and\ndrag it into your scene's object hierarchy. Make sure that the canvas is at the top of the hierarchy, so that it is always\nvisible and interactable."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Note that this overlay ",(0,o.kt)("strong",{parentName:"p"},"must be present in your scene")," for Regression Games to function. The visibility\nof the overlay can be hidden through the Regression Games settings pane under ",(0,o.kt)("strong",{parentName:"p"},"Edit")," > ",(0,o.kt)("strong",{parentName:"p"},"Project Settings")," >\n",(0,o.kt)("strong",{parentName:"p"},"Regression Games"),". Place this component into each scene that must be able to use Regression Games SDK features.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the search pane for the RGOverlayCanvas.",src:a(4375).Z,width:"1084",height:"568"})))}r.isMDXComponent=!0},7360:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>u});var n=a(7462),o=(a(7294),a(3905)),i=a(7889);const s={sidebar_label:"Writing Your First Automated Test"},r="Writing Your First Automated Test",l={unversionedId:"tutorials/building-your-first-bot",id:"tutorials/building-your-first-bot",title:"Writing Your First Automated Test",description:"In this tutorial, we will get a simple automated test working in Unity using Regression Games. We will show you:",source:"@site/docs/tutorials/building-your-first-bot.mdx",sourceDirName:"tutorials",slug:"/tutorials/building-your-first-bot",permalink:"/tutorials/building-your-first-bot",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Writing Your First Automated Test"},sidebar:"unitySidebar",next:{title:"Getting Started with Gameplay Sessions",permalink:"/gameplay-sessions/gameplay-sessions-getting-started"}},p={},u=[{value:"(Optional) Download a sample game",id:"optional-download-a-sample-game",level:2},{value:"Import the Regression Games Unity Bots package",id:"import-the-regression-games-unity-bots-package",level:2},{value:"Restart Unity and your IDE",id:"restart-unity-and-your-ide",level:2},{value:"Record a gameplay session",id:"record-a-gameplay-session",level:2},{value:"Add the RGOverlayCanvas",id:"add-the-rgoverlaycanvas",level:3},{value:"Record a gameplay session as an automated test",id:"record-a-gameplay-session-as-an-automated-test",level:3},{value:"Create a Validation Suite",id:"create-a-validation-suite",level:2},{value:"Creating the test scenario",id:"creating-the-test-scenario",level:3},{value:"Run the Validation Suite on new automated runs",id:"run-the-validation-suite-on-new-automated-runs",level:3},{value:"Next Steps",id:"next-steps",level:2}],d={toc:u},c="wrapper";function m(e){let{components:t,...s}=e;return(0,o.kt)(c,(0,n.Z)({},d,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"writing-your-first-automated-test"},"Writing Your First Automated Test"),(0,o.kt)("p",null,"In this tutorial, we will get a simple automated test working in Unity using Regression Games. We will show you:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"How to integrate the RG Unity SDK into your game"),(0,o.kt)("li",{parentName:"ul"},"Record a ",(0,o.kt)("a",{parentName:"li",href:"/gameplay-sessions/gameplay-sessions-getting-started"},"Gameplay Session")," as an automated test"),(0,o.kt)("li",{parentName:"ul"},"Create a ",(0,o.kt)("a",{parentName:"li",href:"/validations/validations-getting-started"},"Validation Suite")," and run that against future test runs")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of results from a run",src:a(7909).Z,width:"3218",height:"1892"})),(0,o.kt)("h2",{id:"optional-download-a-sample-game"},"(Optional) Download a sample game"),(0,o.kt)("p",null,"Feel free to follow this tutorial within your own game, but we recommend starting with a sample game if you do not have\na game available. Our team often uses BossRoom, a simple multiplayer game created by Unity. However, you can start\nwith any game of your choosing!"),(0,o.kt)("p",null,"Download the BossRoom sample from the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Unity-Technologies/com.unity.multiplayer.samples.coop"},"official GitHub repository.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Note that there are some limitations of the package that may not work with your game. For instance, our framework\nworks best with games that use standard UI canvas elements and game objects. Learn\nmore about these limitations in our ",(0,o.kt)("a",{parentName:"p",href:"/gameplay-sessions/gameplay-sessions-getting-started"},"Gameplay Session recording docs"),".")),(0,o.kt)("p",null,"Open it within Unity version 2022.3 (visit the ",(0,o.kt)("a",{parentName:"p",href:"https://unity.com/releases/editor/whats-new/2022.3.27"},"Unity archive")," if\nyou can't find that version from Unity Hub). Once the project is loaded, open the ",(0,o.kt)("strong",{parentName:"p"},"MainMenu")," scene within\n",(0,o.kt)("strong",{parentName:"p"},"Assets")," > ",(0,o.kt)("strong",{parentName:"p"},"Scenes")," > ",(0,o.kt)("strong",{parentName:"p"},"MainMenu"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the playground scene",src:a(834).Z,width:"2692",height:"1676"})),(0,o.kt)("h2",{id:"import-the-regression-games-unity-bots-package"},"Import the Regression Games Unity Bots package"),(0,o.kt)("p",null,"You can find ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Regression-Games/RGUnityBots"},"our package on GitHub"),". Import the package into your Unity project by opening\nthe ",(0,o.kt)("strong",{parentName:"p"},"Package Manager")," window (",(0,o.kt)("strong",{parentName:"p"},"Window")," > ",(0,o.kt)("strong",{parentName:"p"},"Package Manager"),") and click ",(0,o.kt)("strong",{parentName:"p"},"Add package from git URL"),". Then, paste the following URL:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.28\n")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("ul",{parentName:"admonition"},(0,o.kt)("li",{parentName:"ul"},"This package utilizes TextMeshPro. If you are prompted by Unity to add TextMeshPro assets to your project, please add them."),(0,o.kt)("li",{parentName:"ul"},"This package installs a dependency of Newtonsoft Json (",(0,o.kt)("a",{parentName:"li",href:"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"},"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"),") for serializing/deserializing Json message payloads."),(0,o.kt)("li",{parentName:"ul"},"If you get a note about Unity's new input system, click ",(0,o.kt)("strong",{parentName:"li"},"Yes")," and allow the editor to restart.")),(0,o.kt)("p",{parentName:"admonition"},"If your game utilizes Unity's ECS, we now have an extension package available to support it."),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots.ecs#v0.0.28\n")),(0,o.kt)("p",{parentName:"admonition"},"Install this package in addition to / after installing the core RGUnityBots package.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Gif of the package imported into the project",src:a(1274).Z,width:"1084",height:"568"})),(0,o.kt)("p",null,"After importing the package, you will be greeted by a login screen. Create an account at\n",(0,o.kt)("a",{parentName:"p",href:"https://play.regression.gg"},"https://play.regression.gg")," and login to Unity with your account credentials. If you need to login again in the future,\nyou can enter your login info by visiting the ",(0,o.kt)("strong",{parentName:"p"},"Regression Games")," > ",(0,o.kt)("strong",{parentName:"p"},"Getting Started")," menu."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the package imported into the project",src:a(4589).Z,width:"3456",height:"2160"})),(0,o.kt)("h2",{id:"restart-unity-and-your-ide"},"Restart Unity and your IDE"),(0,o.kt)("p",null,"After installing the Regression Games Unity Bots package and its dependencies into Unity, please restart Unity\nand your code editor (e.g. Rider or Visual Studio). Without this step, Unity and your code editor may not properly\nresolve the new packages even after Unity recompiles the scripts."),(0,o.kt)("h2",{id:"record-a-gameplay-session"},"Record a gameplay session"),(0,o.kt)("p",null,"The first step in automating a test is to record a ",(0,o.kt)("a",{parentName:"p",href:"/gameplay-sessions/gameplay-sessions-getting-started"},"gameplay session"),".\nThis feature allows you to record real gameplay and play it back later as an automated test. Regression Games does\noffer other utilities for dynamic bots, but to get started with a simple example, we will record a click-through that\nverifies the functionality of the UI in BossRoom."),(0,o.kt)("h3",{id:"add-the-rgoverlaycanvas"},"Add the RGOverlayCanvas"),(0,o.kt)("p",null,"The RGOverlayCanvasV2 prefab provides an overlay that allows you to begin recording gameplay sessions."),(0,o.kt)(i.ZP,{mdxType:"OverlayPartial"}),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Your scene must have an EventSystem to make interaction with the overlay possible. You can add one by\nright-clicking in your scene's Hierarchy and selecting ",(0,o.kt)("strong",{parentName:"p"},"GameObject")," > ",(0,o.kt)("strong",{parentName:"p"},"UI")," > ",(0,o.kt)("strong",{parentName:"p"},"Event System"),".\nIf you are using the sample scene we provide, this is already included.")),(0,o.kt)("h3",{id:"record-a-gameplay-session-as-an-automated-test"},"Record a gameplay session as an automated test"),(0,o.kt)("p",null,"Once the overlay has been added to your scene(s), it's time to start a gameplay session recording! Our goal is to\n",(0,o.kt)("strong",{parentName:"p"},"record gameplay that can later be used as an automated test"),". More specifically, we will test the following\nsimple scenario (feel free to come up with your own if you are not using Boss Room):"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The game loads into the main menu"),(0,o.kt)("li",{parentName:"ul"},"We use the mouse to click the Volume Settings button"),(0,o.kt)("li",{parentName:"ul"},"We verify that the Volume Settings panel is displayed"),(0,o.kt)("li",{parentName:"ul"},"Finally, we close the volume settings panel")),(0,o.kt)("p",null,"These actions are ",(0,o.kt)("strong",{parentName:"p"},"recorded")," and can be ",(0,o.kt)("strong",{parentName:"p"},"played back")," later as an automated test. As the test is run, data from the\ngame is collected, which will then be used within validations."),(0,o.kt)("p",null,"As shown in the short video below, follow these steps:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Click the play button in the editor to start the game."),(0,o.kt)("li",{parentName:"ol"},"Click the red record button in the bottom right to start recording."),(0,o.kt)("li",{parentName:"ol"},"Click the Volume Settings button near the top right of the main menu."),(0,o.kt)("li",{parentName:"ol"},"Click the close button on the Volume Settings panel."),(0,o.kt)("li",{parentName:"ol"},"Click the rec recording button in the bottom right to stop recording."),(0,o.kt)("li",{parentName:"ol"},"When finished recording, click the hamburger menu next to the record button to open up a dialog for loading your\nrecording. You can find the recordings within ",(0,o.kt)("a",{parentName:"li",href:"/gameplay-sessions/gameplay-sessions-reference#folder-and-file-structure"},"the session directory"),".\nSelect the ",(0,o.kt)("inlineCode",{parentName:"li"},"bot_segments.zip")," file and click ",(0,o.kt)("strong",{parentName:"li"},"Load Replay"),"."),(0,o.kt)("li",{parentName:"ol"},"Click the play button under the Regression Games logo to see your recording play back!")),(0,o.kt)("div",{style:{position:"relative",paddingBottom:"50.40485829959515%",height:0}},(0,o.kt)("iframe",{src:"https://www.loom.com/embed/1a88ffcad1ff49d6940473d5637e35ed?sid=336eaf3b-208c-4ea3-a0b3-c6ad3d2d2cee",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})),(0,o.kt)("h2",{id:"create-a-validation-suite"},"Create a Validation Suite"),(0,o.kt)("p",null,"With your first gameplay session saved, we can now write a functional test that validates the behaviour of this\nscenario! Visit ",(0,o.kt)("a",{parentName:"p",href:"https://play.regression.gg/validations"},"https://play.regression.gg/validations")," to begin creating a new\n",(0,o.kt)("a",{parentName:"p",href:"/validations/validations-getting-started"},"validation suite")," using this session."),(0,o.kt)("h3",{id:"creating-the-test-scenario"},"Creating the test scenario"),(0,o.kt)("p",null,"Click ",(0,o.kt)("strong",{parentName:"p"},"Create Suite"),", enter a name for yor validation suite, and select the gameplay session you just recorded (if\nyou don't see it, try refreshing the page). You may notice that there are two or more sessions; these include both\nthe original test session and the sessions created through the automated playback, so make sure to select the one\nlowest in the list, which is the first one created. Click ",(0,o.kt)("strong",{parentName:"p"},"Create Suite")," in the bottom right."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the validation suite creation",src:a(8735).Z,width:"1772",height:"1098"})),(0,o.kt)("p",null,"Once the suite is created, you'll be able to select it within the Validation Suites Dashboard. Select your suite, and\nclick ",(0,o.kt)("strong",{parentName:"p"},"Create Scenario")," in the bottom right to start creating your first functional test."),(0,o.kt)("p",null,"The editor you see here is the ",(0,o.kt)("inlineCode",{parentName:"p"},"Scenario Editor"),". It features a screenshot scrubber to see your game in action, as well\nas a state panel to see in-depth information scraped from your game, including not only position information, but also\nMonobehaviour properties and fields, as well as keyboard and mouse inputs. For example, for a user interface, you can\nsee information such as image sources and text values."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot the scenario builder",src:a(8735).Z,width:"1772",height:"1098"})),(0,o.kt)("p",null,"Enter a name for your scenario (we used ",(0,o.kt)("inlineCode",{parentName:"p"},"Verify that the volume mixer opens"),"), and hover over the pane on the left to\nsee a list of options for validation. For this scenario, we will verify that:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"The scene loads properly"),(0,o.kt)("li",{parentName:"ol"},"The volume settings panel appears")),(0,o.kt)("p",null,"This tools allows a wide variety of test scenarios, including mouse and key press detection, state assertions, and\nstoring values for comparison (learn more in the ",(0,o.kt)("a",{parentName:"p",href:"/validations/validations-scenario-builder-reference"},"documentation for validations"),").\nFor now, we will keep it simple, and the two steps listed above. See the screenshot above and the video below to see\nhow to add these steps (the search feature can be helpful for finding relevant elements in your scene)."),(0,o.kt)("div",{style:{position:"relative",paddingBottom:"50.40485829959515%",height:0}},(0,o.kt)("iframe",{src:"https://www.loom.com/embed/3575d3ef72ae4ebc87dc4eab668d3284?sid=336eaf3b-208c-4ea3-a0b3-c6ad3d2d2cee",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})),(0,o.kt)("p",null,"Once you are done creating these steps, click ",(0,o.kt)("strong",{parentName:"p"},"Create Scenario")," to save it. Back on the Validation Suite page, you\ncan click the options menu next to the scenario you just created to run it, by selecting the ",(0,o.kt)("strong",{parentName:"p"},"Run Scenario")," option.\nThis will immediately run this scenario on the original gameplay session and provide you with the results."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of results from a scenario",src:a(7603).Z,width:"1530",height:"726"})),(0,o.kt)("h3",{id:"run-the-validation-suite-on-new-automated-runs"},"Run the Validation Suite on new automated runs"),(0,o.kt)("p",null,"Now that this validation suite exists, we can run it on the other runs conducted by the automated test! In the top\nright of the Validation Suite, click the ",(0,o.kt)("strong",{parentName:"p"},"Run Suite")," button, and select a more recent gameplay session to validate.\nOnce the test is run, you can click the result within the list of runs to see a detailed view of the passed and failed\nscenarios."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the validation suite runs",src:a(8837).Z,width:"2146",height:"1404"})),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of results from a run",src:a(7909).Z,width:"3218",height:"1892"})),(0,o.kt)("h2",{id:"next-steps"},"Next Steps"),(0,o.kt)("p",null,"We now have a repeatable automated gameplay session that can be verified using the validation tool! If you got stuck\nduring this tutorial, or want to brainstorm how to get the most of this tool, please\n",(0,o.kt)("a",{parentName:"p",href:"https://discord.com/invite/925SYVse2H"},"join our active Discord community."),". We are excited to make the best automation\ntools for game QA, and would love your feedback!"))}m.isMDXComponent=!0},4375:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/add-overlay-to-scene-d2369f9c6ecb17be282b7e6d175c0d32.gif"},834:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/bossroom-e2d90f0cd24bd29720d5f957f472c2e2.png"},8735:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/create-validation-suite-1e06e261be14acf7e407379829a9cba9.png"},1274:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/installing-sdk-935e0d98a5c03fa57b5bd51d752b4c20.gif"},8837:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/many-runs-a80de3b5750d354032f573092a032b17.png"},7909:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/run-details-cf545d899ae285e3f19cdeae414e0092.png"},7603:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/run-scenario-66214adfa78107a7f74a7a0b566e41e9.png"},4589:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/welcome_3-bbd5b9fb049a87d0719c924bf62625ce.png"}}]); \ No newline at end of file diff --git a/assets/js/04115efe.e8aeff5d.js b/assets/js/04115efe.e8aeff5d.js deleted file mode 100644 index e6c7ab58..00000000 --- a/assets/js/04115efe.e8aeff5d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[5792],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var n=a(7294);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},d="mdxType",c={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,u=r(e,["components","mdxType","originalType","parentName"]),d=p(a),m=o,h=d["".concat(l,".").concat(m)]||d[m]||c[m]||i;return a?n.createElement(h,s(s({ref:t},u),{},{components:a})):n.createElement(h,s({ref:t},u))}));function h(e,t){var a=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=a.length,s=new Array(i);s[0]=m;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r[d]="string"==typeof e?e:o,s[1]=r;for(var p=2;p{a.d(t,{ZP:()=>r});var n=a(7462),o=(a(7294),a(3905));const i={toc:[]},s="wrapper";function r(e){let{components:t,...r}=e;return(0,o.kt)(s,(0,n.Z)({},i,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("p",null,"Find the ",(0,o.kt)("inlineCode",{parentName:"p"},"RGOverlayCanvasV2")," prefab by navigating to ",(0,o.kt)("strong",{parentName:"p"},"Packages")," > ",(0,o.kt)("strong",{parentName:"p"},"Regression Games Unity Bots")," > ",(0,o.kt)("strong",{parentName:"p"},"Runtime")," > ",(0,o.kt)("strong",{parentName:"p"},"Prefabs")," and\ndrag it into your scene's object hierarchy. Make sure that the canvas is at the top of the hierarchy, so that it is always\nvisible and interactable."),(0,o.kt)("admonition",{type:"caution"},(0,o.kt)("p",{parentName:"admonition"},"Note that this overlay ",(0,o.kt)("strong",{parentName:"p"},"must be present in your scene")," for Regression Games to function. The visibility\nof the overlay can be hidden through the Regression Games settings pane under ",(0,o.kt)("strong",{parentName:"p"},"Edit")," > ",(0,o.kt)("strong",{parentName:"p"},"Project Settings")," >\n",(0,o.kt)("strong",{parentName:"p"},"Regression Games"),". Place this component into each scene that must be able to use Regression Games SDK features.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the search pane for the RGOverlayCanvas.",src:a(4375).Z,width:"1084",height:"568"})))}r.isMDXComponent=!0},7360:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>r,default:()=>m,frontMatter:()=>s,metadata:()=>l,toc:()=>u});var n=a(7462),o=(a(7294),a(3905)),i=a(7889);const s={sidebar_label:"Writing Your First Automated Test"},r="Writing Your First Automated Test",l={unversionedId:"tutorials/building-your-first-bot",id:"tutorials/building-your-first-bot",title:"Writing Your First Automated Test",description:"In this tutorial, we will get a simple automated test working in Unity using Regression Games. We will show you:",source:"@site/docs/tutorials/building-your-first-bot.mdx",sourceDirName:"tutorials",slug:"/tutorials/building-your-first-bot",permalink:"/tutorials/building-your-first-bot",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Writing Your First Automated Test"},sidebar:"unitySidebar",next:{title:"Getting Started with Gameplay Sessions",permalink:"/gameplay-sessions/gameplay-sessions-getting-started"}},p={},u=[{value:"(Optional) Download a sample game",id:"optional-download-a-sample-game",level:2},{value:"Import the Regression Games Unity Bots package",id:"import-the-regression-games-unity-bots-package",level:2},{value:"Restart Unity and your IDE",id:"restart-unity-and-your-ide",level:2},{value:"Record a gameplay session",id:"record-a-gameplay-session",level:2},{value:"Add the RGOverlayCanvas",id:"add-the-rgoverlaycanvas",level:3},{value:"Record a gameplay session as an automated test",id:"record-a-gameplay-session-as-an-automated-test",level:3},{value:"Create a Validation Suite",id:"create-a-validation-suite",level:2},{value:"Creating the test scenario",id:"creating-the-test-scenario",level:3},{value:"Run the Validation Suite on new automated runs",id:"run-the-validation-suite-on-new-automated-runs",level:3},{value:"Next Steps",id:"next-steps",level:2}],d={toc:u},c="wrapper";function m(e){let{components:t,...s}=e;return(0,o.kt)(c,(0,n.Z)({},d,s,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"writing-your-first-automated-test"},"Writing Your First Automated Test"),(0,o.kt)("p",null,"In this tutorial, we will get a simple automated test working in Unity using Regression Games. We will show you:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"How to integrate the RG Unity SDK into your game"),(0,o.kt)("li",{parentName:"ul"},"Record a ",(0,o.kt)("a",{parentName:"li",href:"/gameplay-sessions/gameplay-sessions-getting-started"},"Gameplay Session")," as an automated test"),(0,o.kt)("li",{parentName:"ul"},"Create a ",(0,o.kt)("a",{parentName:"li",href:"/validations/validations-getting-started"},"Validation Suite")," and run that against future test runs")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of results from a run",src:a(7909).Z,width:"3218",height:"1892"})),(0,o.kt)("h2",{id:"optional-download-a-sample-game"},"(Optional) Download a sample game"),(0,o.kt)("p",null,"Feel free to follow this tutorial within your own game, but we recommend starting with a sample game if you do not have\na game available. Our team often uses BossRoom, a simple multiplayer game created by Unity. However, you can start\nwith any game of your choosing!"),(0,o.kt)("p",null,"Download the BossRoom sample from the ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Unity-Technologies/com.unity.multiplayer.samples.coop"},"official GitHub repository.")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Note that there are some limitations of the package that may not work with your game. For instance, our framework\nworks best with games that use standard UI canvas elements and game objects. Learn\nmore about these limitations in our ",(0,o.kt)("a",{parentName:"p",href:"/gameplay-sessions/gameplay-sessions-getting-started"},"Gameplay Session recording docs"),".")),(0,o.kt)("p",null,"Open it within Unity version 2022.3 (visit the ",(0,o.kt)("a",{parentName:"p",href:"https://unity.com/releases/editor/whats-new/2022.3.27"},"Unity archive")," if\nyou can't find that version from Unity Hub). Once the project is loaded, open the ",(0,o.kt)("strong",{parentName:"p"},"MainMenu")," scene within\n",(0,o.kt)("strong",{parentName:"p"},"Assets")," > ",(0,o.kt)("strong",{parentName:"p"},"Scenes")," > ",(0,o.kt)("strong",{parentName:"p"},"MainMenu"),"."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the playground scene",src:a(834).Z,width:"2692",height:"1676"})),(0,o.kt)("h2",{id:"import-the-regression-games-unity-bots-package"},"Import the Regression Games Unity Bots package"),(0,o.kt)("p",null,"You can find ",(0,o.kt)("a",{parentName:"p",href:"https://github.com/Regression-Games/RGUnityBots"},"our package on GitHub"),". Import the package into your Unity project by opening\nthe ",(0,o.kt)("strong",{parentName:"p"},"Package Manager")," window (",(0,o.kt)("strong",{parentName:"p"},"Window")," > ",(0,o.kt)("strong",{parentName:"p"},"Package Manager"),") and click ",(0,o.kt)("strong",{parentName:"p"},"Add package from git URL"),". Then, paste the following URL:"),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.27\n")),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("ul",{parentName:"admonition"},(0,o.kt)("li",{parentName:"ul"},"This package utilizes TextMeshPro. If you are prompted by Unity to add TextMeshPro assets to your project, please add them."),(0,o.kt)("li",{parentName:"ul"},"This package installs a dependency of Newtonsoft Json (",(0,o.kt)("a",{parentName:"li",href:"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"},"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"),") for serializing/deserializing Json message payloads."),(0,o.kt)("li",{parentName:"ul"},"If you get a note about Unity's new input system, click ",(0,o.kt)("strong",{parentName:"li"},"Yes")," and allow the editor to restart.")),(0,o.kt)("p",{parentName:"admonition"},"If your game utilizes Unity's ECS, we now have an extension package available to support it."),(0,o.kt)("pre",{parentName:"admonition"},(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots/tree/main/src/gg.regression.unity.bots.ecs#v0.0.27\n")),(0,o.kt)("p",{parentName:"admonition"},"Install this package in addition to / after installing the core RGUnityBots package.")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Gif of the package imported into the project",src:a(1274).Z,width:"1084",height:"568"})),(0,o.kt)("p",null,"After importing the package, you will be greeted by a login screen. Create an account at\n",(0,o.kt)("a",{parentName:"p",href:"https://play.regression.gg"},"https://play.regression.gg")," and login to Unity with your account credentials. If you need to login again in the future,\nyou can enter your login info by visiting the ",(0,o.kt)("strong",{parentName:"p"},"Regression Games")," > ",(0,o.kt)("strong",{parentName:"p"},"Getting Started")," menu."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the package imported into the project",src:a(4589).Z,width:"3456",height:"2160"})),(0,o.kt)("h2",{id:"restart-unity-and-your-ide"},"Restart Unity and your IDE"),(0,o.kt)("p",null,"After installing the Regression Games Unity Bots package and its dependencies into Unity, please restart Unity\nand your code editor (e.g. Rider or Visual Studio). Without this step, Unity and your code editor may not properly\nresolve the new packages even after Unity recompiles the scripts."),(0,o.kt)("h2",{id:"record-a-gameplay-session"},"Record a gameplay session"),(0,o.kt)("p",null,"The first step in automating a test is to record a ",(0,o.kt)("a",{parentName:"p",href:"/gameplay-sessions/gameplay-sessions-getting-started"},"gameplay session"),".\nThis feature allows you to record real gameplay and play it back later as an automated test. Regression Games does\noffer other utilities for dynamic bots, but to get started with a simple example, we will record a click-through that\nverifies the functionality of the UI in BossRoom."),(0,o.kt)("h3",{id:"add-the-rgoverlaycanvas"},"Add the RGOverlayCanvas"),(0,o.kt)("p",null,"The RGOverlayCanvasV2 prefab provides an overlay that allows you to begin recording gameplay sessions."),(0,o.kt)(i.ZP,{mdxType:"OverlayPartial"}),(0,o.kt)("admonition",{type:"info"},(0,o.kt)("p",{parentName:"admonition"},"Your scene must have an EventSystem to make interaction with the overlay possible. You can add one by\nright-clicking in your scene's Hierarchy and selecting ",(0,o.kt)("strong",{parentName:"p"},"GameObject")," > ",(0,o.kt)("strong",{parentName:"p"},"UI")," > ",(0,o.kt)("strong",{parentName:"p"},"Event System"),".\nIf you are using the sample scene we provide, this is already included.")),(0,o.kt)("h3",{id:"record-a-gameplay-session-as-an-automated-test"},"Record a gameplay session as an automated test"),(0,o.kt)("p",null,"Once the overlay has been added to your scene(s), it's time to start a gameplay session recording! Our goal is to\n",(0,o.kt)("strong",{parentName:"p"},"record gameplay that can later be used as an automated test"),". More specifically, we will test the following\nsimple scenario (feel free to come up with your own if you are not using Boss Room):"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The game loads into the main menu"),(0,o.kt)("li",{parentName:"ul"},"We use the mouse to click the Volume Settings button"),(0,o.kt)("li",{parentName:"ul"},"We verify that the Volume Settings panel is displayed"),(0,o.kt)("li",{parentName:"ul"},"Finally, we close the volume settings panel")),(0,o.kt)("p",null,"These actions are ",(0,o.kt)("strong",{parentName:"p"},"recorded")," and can be ",(0,o.kt)("strong",{parentName:"p"},"played back")," later as an automated test. As the test is run, data from the\ngame is collected, which will then be used within validations."),(0,o.kt)("p",null,"As shown in the short video below, follow these steps:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"Click the play button in the editor to start the game."),(0,o.kt)("li",{parentName:"ol"},"Click the red record button in the bottom right to start recording."),(0,o.kt)("li",{parentName:"ol"},"Click the Volume Settings button near the top right of the main menu."),(0,o.kt)("li",{parentName:"ol"},"Click the close button on the Volume Settings panel."),(0,o.kt)("li",{parentName:"ol"},"Click the rec recording button in the bottom right to stop recording."),(0,o.kt)("li",{parentName:"ol"},"When finished recording, click the hamburger menu next to the record button to open up a dialog for loading your\nrecording. You can find the recordings within ",(0,o.kt)("a",{parentName:"li",href:"/gameplay-sessions/gameplay-sessions-reference#folder-and-file-structure"},"the session directory"),".\nSelect the ",(0,o.kt)("inlineCode",{parentName:"li"},"bot_segments.zip")," file and click ",(0,o.kt)("strong",{parentName:"li"},"Load Replay"),"."),(0,o.kt)("li",{parentName:"ol"},"Click the play button under the Regression Games logo to see your recording play back!")),(0,o.kt)("div",{style:{position:"relative",paddingBottom:"50.40485829959515%",height:0}},(0,o.kt)("iframe",{src:"https://www.loom.com/embed/1a88ffcad1ff49d6940473d5637e35ed?sid=336eaf3b-208c-4ea3-a0b3-c6ad3d2d2cee",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})),(0,o.kt)("h2",{id:"create-a-validation-suite"},"Create a Validation Suite"),(0,o.kt)("p",null,"With your first gameplay session saved, we can now write a functional test that validates the behaviour of this\nscenario! Visit ",(0,o.kt)("a",{parentName:"p",href:"https://play.regression.gg/validations"},"https://play.regression.gg/validations")," to begin creating a new\n",(0,o.kt)("a",{parentName:"p",href:"/validations/validations-getting-started"},"validation suite")," using this session."),(0,o.kt)("h3",{id:"creating-the-test-scenario"},"Creating the test scenario"),(0,o.kt)("p",null,"Click ",(0,o.kt)("strong",{parentName:"p"},"Create Suite"),", enter a name for yor validation suite, and select the gameplay session you just recorded (if\nyou don't see it, try refreshing the page). You may notice that there are two or more sessions; these include both\nthe original test session and the sessions created through the automated playback, so make sure to select the one\nlowest in the list, which is the first one created. Click ",(0,o.kt)("strong",{parentName:"p"},"Create Suite")," in the bottom right."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the validation suite creation",src:a(8735).Z,width:"1772",height:"1098"})),(0,o.kt)("p",null,"Once the suite is created, you'll be able to select it within the Validation Suites Dashboard. Select your suite, and\nclick ",(0,o.kt)("strong",{parentName:"p"},"Create Scenario")," in the bottom right to start creating your first functional test."),(0,o.kt)("p",null,"The editor you see here is the ",(0,o.kt)("inlineCode",{parentName:"p"},"Scenario Editor"),". It features a screenshot scrubber to see your game in action, as well\nas a state panel to see in-depth information scraped from your game, including not only position information, but also\nMonobehaviour properties and fields, as well as keyboard and mouse inputs. For example, for a user interface, you can\nsee information such as image sources and text values."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot the scenario builder",src:a(8735).Z,width:"1772",height:"1098"})),(0,o.kt)("p",null,"Enter a name for your scenario (we used ",(0,o.kt)("inlineCode",{parentName:"p"},"Verify that the volume mixer opens"),"), and hover over the pane on the left to\nsee a list of options for validation. For this scenario, we will verify that:"),(0,o.kt)("ol",null,(0,o.kt)("li",{parentName:"ol"},"The scene loads properly"),(0,o.kt)("li",{parentName:"ol"},"The volume settings panel appears")),(0,o.kt)("p",null,"This tools allows a wide variety of test scenarios, including mouse and key press detection, state assertions, and\nstoring values for comparison (learn more in the ",(0,o.kt)("a",{parentName:"p",href:"/validations/validations-scenario-builder-reference"},"documentation for validations"),").\nFor now, we will keep it simple, and the two steps listed above. See the screenshot above and the video below to see\nhow to add these steps (the search feature can be helpful for finding relevant elements in your scene)."),(0,o.kt)("div",{style:{position:"relative",paddingBottom:"50.40485829959515%",height:0}},(0,o.kt)("iframe",{src:"https://www.loom.com/embed/3575d3ef72ae4ebc87dc4eab668d3284?sid=336eaf3b-208c-4ea3-a0b3-c6ad3d2d2cee",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})),(0,o.kt)("p",null,"Once you are done creating these steps, click ",(0,o.kt)("strong",{parentName:"p"},"Create Scenario")," to save it. Back on the Validation Suite page, you\ncan click the options menu next to the scenario you just created to run it, by selecting the ",(0,o.kt)("strong",{parentName:"p"},"Run Scenario")," option.\nThis will immediately run this scenario on the original gameplay session and provide you with the results."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of results from a scenario",src:a(7603).Z,width:"1530",height:"726"})),(0,o.kt)("h3",{id:"run-the-validation-suite-on-new-automated-runs"},"Run the Validation Suite on new automated runs"),(0,o.kt)("p",null,"Now that this validation suite exists, we can run it on the other runs conducted by the automated test! In the top\nright of the Validation Suite, click the ",(0,o.kt)("strong",{parentName:"p"},"Run Suite")," button, and select a more recent gameplay session to validate.\nOnce the test is run, you can click the result within the list of runs to see a detailed view of the passed and failed\nscenarios."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the validation suite runs",src:a(8837).Z,width:"2146",height:"1404"})),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of results from a run",src:a(7909).Z,width:"3218",height:"1892"})),(0,o.kt)("h2",{id:"next-steps"},"Next Steps"),(0,o.kt)("p",null,"We now have a repeatable automated gameplay session that can be verified using the validation tool! If you got stuck\nduring this tutorial, or want to brainstorm how to get the most of this tool, please\n",(0,o.kt)("a",{parentName:"p",href:"https://discord.com/invite/925SYVse2H"},"join our active Discord community."),". We are excited to make the best automation\ntools for game QA, and would love your feedback!"))}m.isMDXComponent=!0},4375:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/add-overlay-to-scene-d2369f9c6ecb17be282b7e6d175c0d32.gif"},834:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/bossroom-e2d90f0cd24bd29720d5f957f472c2e2.png"},8735:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/create-validation-suite-1e06e261be14acf7e407379829a9cba9.png"},1274:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/installing-sdk-935e0d98a5c03fa57b5bd51d752b4c20.gif"},8837:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/many-runs-a80de3b5750d354032f573092a032b17.png"},7909:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/run-details-cf545d899ae285e3f19cdeae414e0092.png"},7603:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/run-scenario-66214adfa78107a7f74a7a0b566e41e9.png"},4589:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/welcome_3-bbd5b9fb049a87d0719c924bf62625ce.png"}}]); \ No newline at end of file diff --git a/assets/js/1db64337.2675c864.js b/assets/js/1db64337.b2a8d27d.js similarity index 98% rename from assets/js/1db64337.2675c864.js rename to assets/js/1db64337.b2a8d27d.js index a8f7483c..56df4179 100644 --- a/assets/js/1db64337.2675c864.js +++ b/assets/js/1db64337.b2a8d27d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[1372],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),m=r,d=p["".concat(l,".").concat(m)]||p[m]||g[m]||o;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const o={sidebar_label:"Overview"},i="Regression Games for Unity",s={unversionedId:"overview",id:"overview",title:"Regression Games for Unity",description:"Regression Games is developing a platform where studios can build and deploy bots for a variety of use cases in minutes. We are designing for scale (deploy thousands of bots), ease of use (e.g. generative AI to build bots), ease of integration (minimal impact on game development time), and feature richness (e.g. A/B bot test for engagement).",source:"@site/docs/overview.md",sourceDirName:".",slug:"/overview",permalink:"/overview",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Overview"}},l={},u=[{value:"Current Stage of the Product",id:"current-stage-of-the-product",level:2},{value:"Availability Assurances",id:"availability-assurances",level:2},{value:"Implemented Features",id:"implemented-features",level:2},{value:"Importing the Regression Games Unity Bots package",id:"importing-the-regression-games-unity-bots-package",level:2}],c={toc:u},p="wrapper";function g(e){let{components:t,...o}=e;return(0,r.kt)(p,(0,a.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"regression-games-for-unity"},"Regression Games for Unity"),(0,r.kt)("p",null,"Regression Games is developing a platform where studios can ",(0,r.kt)("strong",{parentName:"p"},"build and deploy bots for a variety of use cases in minutes.")," We are designing for scale (deploy thousands of bots), ease of use (e.g. generative AI to build bots), ease of integration (minimal impact on game development time), and feature richness (e.g. A/B bot test for engagement)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"vision",src:n(543).Z,width:"2000",height:"700"})),(0,r.kt)("h2",{id:"current-stage-of-the-product"},"Current Stage of the Product"),(0,r.kt)("p",null,"This product is currently a ",(0,r.kt)("strong",{parentName:"p"},"release preview"),". We are actively talking with studios and game developers to discover the best features and use cases to tackle, and we're making changes frequently."),(0,r.kt)("p",null,"The team has focused on the foundation of supporting use cases and initial infrastructure to get bots to connect to Unity. The bulk\nof our value will come from the interfaces to build bots, the scale of our infrastructure, the speed of integration, and the products\nbuilt around these bots."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"timeline feature",src:n(9737).Z,width:"2636",height:"2058"})),(0,r.kt)("h2",{id:"availability-assurances"},"Availability Assurances"),(0,r.kt)("p",null,"The Regression Games team offers the following assurances for our initial testing with developers. Additionally, we have a dedicated Discord server for support, and can also create a Slack Connect channel, giving you direct access to our entire team. For access to\nthese channels, send an e-mail to ",(0,r.kt)("a",{parentName:"p",href:"mailto:aaron@regression.gg"},"aaron@regression.gg"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A single account can run at least 10 bots concurrently"),(0,r.kt)("li",{parentName:"ul"},"The time from requesting a bot to be started to the time it connects to Unity will take less than 10 seconds if the bot is relying on dependencies that are common to most bots. This does not cover bots that may have lots of library dependencies, which may take longer.")),(0,r.kt)("h2",{id:"implemented-features"},"Implemented Features"),(0,r.kt)("p",null,"The table below details and links to documentation for the features implemented on our platform."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Feature")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Documentation")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Unity C# SDK"),(0,r.kt)("td",{parentName:"tr",align:null},"A C# SDK for implementing bots locally in Unity."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"creating-bots/csharp/adaptive-bots"},"Link"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Bot Code Generation"),(0,r.kt)("td",{parentName:"tr",align:null},"Create bots with low-code tools such as behavior trees powered by GPT."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"creating-bots/csharp/agent-builder"},"Link"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Platform and Language Agnostic"),(0,r.kt)("td",{parentName:"tr",align:null},"Our protocol permits bots to eventually be written in multiple engines and languages."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"Docs coming soon"))))),(0,r.kt)("h2",{id:"importing-the-regression-games-unity-bots-package"},"Importing the Regression Games Unity Bots package"),(0,r.kt)("p",null,"Our package is available via GitHub ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Regression-Games/RGUnityBots"},"here"),". Import the repository by\nclicking ",(0,r.kt)("strong",{parentName:"p"},"Add package from git URL")," in the ",(0,r.kt)("strong",{parentName:"p"},"Package Manager")," window (this window can be opened\nin the ",(0,r.kt)("strong",{parentName:"p"},"Window > Package Manager")," menu) and pasting in the following URL."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.27\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Note that this package utilizes TextMeshPro. If you are prompted by Unity to add TextMeshPro assets to your project, please add them."),(0,r.kt)("li",{parentName:"ul"},"Note that this package installs a dependency of Newtonsoft Json (",(0,r.kt)("a",{parentName:"li",href:"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"},"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"),") for serializing/deserializing Json message payloads."),(0,r.kt)("li",{parentName:"ul"},"If your game utilizes Unity's ECS, we now have an extension package available to support it. Install this package after installing the core RGUnityBots package:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots/tree/main/src/gg.regression.unity.bots.ecs#v0.0.27\n\n![Screenshot of the package imported into the project](tutorials/img/building-your-first-bot/tutorial-1-package.png)\n\nFor a full walkthrough on getting started, see the [Building Your First Bot](tutorials/building-your-first-bot) tutorial.\n")))}g.isMDXComponent=!0},543:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vision-b3e04de61e7311b6c82aea1140042c36.png"},9737:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/timeline-6aa7e114768fc3f9b776ae9af1d4cfa9.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[1372],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),u=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=u(e.components);return a.createElement(l.Provider,{value:t},e.children)},p="mdxType",g={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),m=r,d=p["".concat(l,".").concat(m)]||p[m]||g[m]||o;return n?a.createElement(d,i(i({ref:t},c),{},{components:n})):a.createElement(d,i({ref:t},c))}));function d(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=m;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[p]="string"==typeof e?e:r,i[1]=s;for(var u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>g,frontMatter:()=>o,metadata:()=>s,toc:()=>u});var a=n(7462),r=(n(7294),n(3905));const o={sidebar_label:"Overview"},i="Regression Games for Unity",s={unversionedId:"overview",id:"overview",title:"Regression Games for Unity",description:"Regression Games is developing a platform where studios can build and deploy bots for a variety of use cases in minutes. We are designing for scale (deploy thousands of bots), ease of use (e.g. generative AI to build bots), ease of integration (minimal impact on game development time), and feature richness (e.g. A/B bot test for engagement).",source:"@site/docs/overview.md",sourceDirName:".",slug:"/overview",permalink:"/overview",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Overview"}},l={},u=[{value:"Current Stage of the Product",id:"current-stage-of-the-product",level:2},{value:"Availability Assurances",id:"availability-assurances",level:2},{value:"Implemented Features",id:"implemented-features",level:2},{value:"Importing the Regression Games Unity Bots package",id:"importing-the-regression-games-unity-bots-package",level:2}],c={toc:u},p="wrapper";function g(e){let{components:t,...o}=e;return(0,r.kt)(p,(0,a.Z)({},c,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"regression-games-for-unity"},"Regression Games for Unity"),(0,r.kt)("p",null,"Regression Games is developing a platform where studios can ",(0,r.kt)("strong",{parentName:"p"},"build and deploy bots for a variety of use cases in minutes.")," We are designing for scale (deploy thousands of bots), ease of use (e.g. generative AI to build bots), ease of integration (minimal impact on game development time), and feature richness (e.g. A/B bot test for engagement)."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"vision",src:n(543).Z,width:"2000",height:"700"})),(0,r.kt)("h2",{id:"current-stage-of-the-product"},"Current Stage of the Product"),(0,r.kt)("p",null,"This product is currently a ",(0,r.kt)("strong",{parentName:"p"},"release preview"),". We are actively talking with studios and game developers to discover the best features and use cases to tackle, and we're making changes frequently."),(0,r.kt)("p",null,"The team has focused on the foundation of supporting use cases and initial infrastructure to get bots to connect to Unity. The bulk\nof our value will come from the interfaces to build bots, the scale of our infrastructure, the speed of integration, and the products\nbuilt around these bots."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"timeline feature",src:n(9737).Z,width:"2636",height:"2058"})),(0,r.kt)("h2",{id:"availability-assurances"},"Availability Assurances"),(0,r.kt)("p",null,"The Regression Games team offers the following assurances for our initial testing with developers. Additionally, we have a dedicated Discord server for support, and can also create a Slack Connect channel, giving you direct access to our entire team. For access to\nthese channels, send an e-mail to ",(0,r.kt)("a",{parentName:"p",href:"mailto:aaron@regression.gg"},"aaron@regression.gg"),"."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"A single account can run at least 10 bots concurrently"),(0,r.kt)("li",{parentName:"ul"},"The time from requesting a bot to be started to the time it connects to Unity will take less than 10 seconds if the bot is relying on dependencies that are common to most bots. This does not cover bots that may have lots of library dependencies, which may take longer.")),(0,r.kt)("h2",{id:"implemented-features"},"Implemented Features"),(0,r.kt)("p",null,"The table below details and links to documentation for the features implemented on our platform."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Feature")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Description")),(0,r.kt)("th",{parentName:"tr",align:null},(0,r.kt)("strong",{parentName:"th"},"Documentation")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Unity C# SDK"),(0,r.kt)("td",{parentName:"tr",align:null},"A C# SDK for implementing bots locally in Unity."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"creating-bots/csharp/adaptive-bots"},"Link"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Bot Code Generation"),(0,r.kt)("td",{parentName:"tr",align:null},"Create bots with low-code tools such as behavior trees powered by GPT."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("a",{parentName:"td",href:"creating-bots/csharp/agent-builder"},"Link"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:null},"Platform and Language Agnostic"),(0,r.kt)("td",{parentName:"tr",align:null},"Our protocol permits bots to eventually be written in multiple engines and languages."),(0,r.kt)("td",{parentName:"tr",align:null},(0,r.kt)("em",{parentName:"td"},"Docs coming soon"))))),(0,r.kt)("h2",{id:"importing-the-regression-games-unity-bots-package"},"Importing the Regression Games Unity Bots package"),(0,r.kt)("p",null,"Our package is available via GitHub ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Regression-Games/RGUnityBots"},"here"),". Import the repository by\nclicking ",(0,r.kt)("strong",{parentName:"p"},"Add package from git URL")," in the ",(0,r.kt)("strong",{parentName:"p"},"Package Manager")," window (this window can be opened\nin the ",(0,r.kt)("strong",{parentName:"p"},"Window > Package Manager")," menu) and pasting in the following URL."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.28\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Note that this package utilizes TextMeshPro. If you are prompted by Unity to add TextMeshPro assets to your project, please add them."),(0,r.kt)("li",{parentName:"ul"},"Note that this package installs a dependency of Newtonsoft Json (",(0,r.kt)("a",{parentName:"li",href:"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"},"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"),") for serializing/deserializing Json message payloads."),(0,r.kt)("li",{parentName:"ul"},"If your game utilizes Unity's ECS, we now have an extension package available to support it. Install this package after installing the core RGUnityBots package:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots/tree/main/src/gg.regression.unity.bots.ecs#v0.0.28\n\n![Screenshot of the package imported into the project](tutorials/img/building-your-first-bot/tutorial-1-package.png)\n\nFor a full walkthrough on getting started, see the [Building Your First Bot](tutorials/building-your-first-bot) tutorial.\n")))}g.isMDXComponent=!0},543:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/vision-b3e04de61e7311b6c82aea1140042c36.png"},9737:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/timeline-6aa7e114768fc3f9b776ae9af1d4cfa9.png"}}]); \ No newline at end of file diff --git a/assets/js/1df93b7f.b6548682.js b/assets/js/1df93b7f.224599d5.js similarity index 99% rename from assets/js/1df93b7f.b6548682.js rename to assets/js/1df93b7f.224599d5.js index fd1db6fb..bf4dc69a 100644 --- a/assets/js/1df93b7f.b6548682.js +++ b/assets/js/1df93b7f.224599d5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[3237],{8391:(A,e,t)=>{t.r(e),t.d(e,{default:()=>g});var a=t(7294),s=t(6010),c=t(9960),l=t(7961),E=t(7462);const n={features:"features_t9lD",featureSvg:"featureSvg_GfXr"},B=[{title:"A Plethora of Features",image:t(3768).Z,description:a.createElement(a.Fragment,null,"Regression Games is building the best platform for game test automation with replay features, validation libraries, CI/CD integration, and more.")},{title:"Ease of Integration",image:t(4661).Z,description:a.createElement(a.Fragment,null,"Ease of integration is one of our top priorities, and it shows. As soon as you add the SDK, data and deep state info is collected, without custom code needed.")},{title:"Bot Versatility",image:t(7390).Z,description:a.createElement(a.Fragment,null,"Regression Games interfaces are built for a variety of teams, even those who may not have code access. Our intuitive functional testing builder allows anyone to make tests.")}];function r(A){let{title:e,image:t,description:c}=A;return a.createElement("div",{className:(0,s.Z)("col col--4")},a.createElement("div",{className:"text--center"},a.createElement("img",{className:n.featureSvg,src:t})),a.createElement("div",{className:"text--center padding-horiz--md"},a.createElement("h3",null,e),a.createElement("p",null,c)))}function i(){return a.createElement("section",{className:n.features},a.createElement("div",{className:"container"},a.createElement("div",{className:"row"},B.map(((A,e)=>a.createElement(r,(0,E.Z)({key:e},A)))))))}const o="heroBanner_qdFl",Q="buttons_AeoN",m=()=>a.createElement("header",{className:(0,s.Z)("hero hero--secondary",o)},a.createElement("div",{className:"container",style:{textAlign:"left"}},a.createElement("div",{className:"row"},a.createElement("div",{className:"col margin-vert--lg margin-right--md"},a.createElement("h1",{className:"hero__title"},"Make better games through automated testing"),a.createElement("p",{className:"hero__subtitle"},"Regression Games helps game developers go from zero to one with automated game testing"),a.createElement("div",{className:Q,style:{justifyContent:"left"}},a.createElement(c.Z,{className:"button button--primary button--outline button--lg",to:"tutorials/building-your-first-bot"},"Get Started")),a.createElement("div",{style:{marginTop:"16px"}},"Get started immediately by adding the package to Unity:",a.createElement("div",{style:{marginTop:"16px",fontSize:12}},a.createElement("pre",{style:{display:"inline"}},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.27")))),a.createElement("div",{className:"col"},a.createElement("img",{src:t(329).Z,alt:"Regression Games",style:{borderRadius:"12px"}}),a.createElement("div",{style:{color:"gray",paddingRight:"24px",fontStyle:"italic"}},"Demo of our recording and validation features. Automatically extract game state and begin writing functional tests in minutes."))))),g=()=>a.createElement(l.Z,{title:"Regression Games Docs",description:"Build bots for games"},a.createElement(m,null),a.createElement("main",null,a.createElement(i,null)),a.createElement("div",{className:"container text--center"},a.createElement("div",{style:{marginBottom:"64px",marginTop:"32px",fontSize:"1.5em",color:"grey",fontWeight:"bold"}},"BACKED BY TIER 1 INVESTORS"),a.createElement("div",{className:"row"},a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://nea.com/",target:"_blank"},a.createElement("img",{style:{height:"60px"},src:t(8926).Z})))),a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://a16z.com/",target:"_blank"},a.createElement("img",{style:{height:"100px",marginTop:"-20px"},src:t(2074).Z})))),a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://roosh.vc/",target:"_blank"},a.createElement("img",{style:{height:"150px",marginTop:"-40px"},src:t(5377).Z})))),a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://bbq.capital/",target:"_blank"},a.createElement("img",{style:{height:"80px",marginTop:"-00px"},src:t(6796).Z})))))))},2074:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/a16z-137749dc988bf598433d91265cf02959.jpeg"},7390:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/ai (2)-19c3966e89df8c194ecd3e781a68cfca.png"},4661:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/ai (3)-a8825fb481555ca2707f39c89be6dedb.png"},3768:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/ai_1-e765bdc2cfecce91cbd44170e21a6e1c.png"},6796:(A,e,t)=>{t.d(e,{Z:()=>a});const a="data:image/jpeg;base64,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zzzzyj73333jzzzzzzy1z333zTzzzzzzetX/AN9e888887+2rUi9888887OMMMMdO888887288888U888888528888o8888888s/es+t88888888888888888888888888888//EACYRAQABAwMCBgMAAAAAAAAAAAERADFhICFBUYEQMHGhwdFAkbH/2gAIAQMBAT8Q/ChAGWKSY9l90ZBGEf55UxApe4+3q7et6lLWWfAmpHIw0c3z9j16mb+tARJHXMmM8Lhg5nHFIjDpcWz8j5O/kHOAr9+vepOOJ8lz+Z0LyAP37eROVwu57duiBQ/ywHflwG7gpNKU4TwiWkZtDCLM0AiiCIu60vCwwMLHhegieDVuZejsW7nHSaGjeDjomRhMlRcWdmxhIB5Gm8lL1k+Q3yhQgYYARE2Q7IFx5Wp9qjfStxLodyLGACaIugy9IN3ezNu+phHqUlyKyqytZWsqkkLSANTgOKAhZ1Ko8a5XBQCR0hHJ5C8ugclK4pdn9UZAmpB+c//EACkRAQABAQYFBAMBAAAAAAAAAAERACAhMUFhwTBRgZGhcdHh8BBAsfH/2gAIAQIBAT8Q/SKlA1qJjyFCyCaM8KY3rn7Pepll1/EmEdKcL4+r/vehAJhbkUicYxjT1pEYbKLJruNzrwDpMcxj81Lw1Dcy/mthB8keAAsDFzjH40rCiE09KNhjDS7U8zR8McHJ/JQDakiyjd6HmKxPlP31pY7gLY3elRCZbs9/C1IryTd6viKlhAXk4JmevegwmGXlBr4tNIZI7b0q42S7CkU5Ad/8tYBSRTgby0LDLefa2Qy/mnRwlnQxPXgBxJ/e9Jbw9Sfaht+9I3avmR5t/wAVdUuUT2vK59sXn+9//8QAKhABAAECBAUDBAMAAAAAAAAAAREAITAxQVFhcYHB8BCRoSBAYOGx0fH/2gAIAQEAAT8Q/FgBbaX8sqJl82yaNk4HuqFUYzhTrKkRRITR+zu5dwbHhd+aERj9NodD6WA40EHovSZzu5Dlp8GnKEQiQjjgqASuhRdHsFuMavDT+MAaBFgW4f7UgBmxYwqXDZZp5j/MNxncQX7jb94x4gR+QsSZnz0oWySuRODhit8wMjQ79cactWbrnHcvVoa2vucNHWhEkuYIEEqJwLfBfb7ByGNeQODmfxwoiWNeF5OvlsDMObySKRlZGHFzvSvl6ijJZppQ8TscNXJqMkSbLnHct9ZBMgz3cWcCOnGh5vUBI9v29IQJ63sVOFNpxNTzalbJK4R51LnkRQeZk+Z0KVyeJzNPoNRAStO5m3ucSIk+37dfSEE9eNTzb0lgjp2x6RWj2/bpUsE9e2KJPLUp1CIlCTqUOapXI9fQZ+EcyzvPTFjBHTjQ839YdA6Y/b49ZwptOJqebVARH6s9EkqWY4q5bJ8b1GAW0lznp196MTdI2lLPZXqYd3NJgiypsa8l7V592rz7tXn3avHu1efdq8+7V592rz7tXn3avPu1Oebn/XXkvamkYpALWAcVhzxVw3hWcD/UxcoUJAJV5BQ8oEZhRw02LEVxHmXDQeKNYMJyB4kBv0XdiAPYvCFxHRp3Uw4EK0NizSYasRKUjBNoXoAMkUvAxBBKDwJ7xoZy0bZKOq0B46hmiRVxMNOTGBLqtEgOiFIWEqQN4OCEnBxVTgVk0J7xGQL2ESKOKZhsdJcthK0XDfwIsypDcVs8cZg7SngJNHUydajccrK3SF5NdQEnJ2b7oqvQKBL1TS4RzAPdrMFquloroUT/AMjnMhlyjO5TWvlX0oSq5xnYGKP5gBdlOSO8MtqW2rZkN7oip/WX+IQWg3AbraSqVVW6v5V//9k="},329:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/demo-932c14cb4e546042c07e5799665cc0d8.gif"},8926:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/nea-3a1bcf8f2def3c2af15a50c315f2f176.jpg"},5377:(A,e,t)=>{t.d(e,{Z:()=>a});const a="data:image/jpeg;base64,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"}}]); \ No newline at end of file +"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[3237],{8391:(A,e,t)=>{t.r(e),t.d(e,{default:()=>g});var a=t(7294),s=t(6010),c=t(9960),l=t(7961),E=t(7462);const n={features:"features_t9lD",featureSvg:"featureSvg_GfXr"},B=[{title:"A Plethora of Features",image:t(3768).Z,description:a.createElement(a.Fragment,null,"Regression Games is building the best platform for game test automation with replay features, validation libraries, CI/CD integration, and more.")},{title:"Ease of Integration",image:t(4661).Z,description:a.createElement(a.Fragment,null,"Ease of integration is one of our top priorities, and it shows. As soon as you add the SDK, data and deep state info is collected, without custom code needed.")},{title:"Bot Versatility",image:t(7390).Z,description:a.createElement(a.Fragment,null,"Regression Games interfaces are built for a variety of teams, even those who may not have code access. Our intuitive functional testing builder allows anyone to make tests.")}];function r(A){let{title:e,image:t,description:c}=A;return a.createElement("div",{className:(0,s.Z)("col col--4")},a.createElement("div",{className:"text--center"},a.createElement("img",{className:n.featureSvg,src:t})),a.createElement("div",{className:"text--center padding-horiz--md"},a.createElement("h3",null,e),a.createElement("p",null,c)))}function i(){return a.createElement("section",{className:n.features},a.createElement("div",{className:"container"},a.createElement("div",{className:"row"},B.map(((A,e)=>a.createElement(r,(0,E.Z)({key:e},A)))))))}const o="heroBanner_qdFl",Q="buttons_AeoN",m=()=>a.createElement("header",{className:(0,s.Z)("hero hero--secondary",o)},a.createElement("div",{className:"container",style:{textAlign:"left"}},a.createElement("div",{className:"row"},a.createElement("div",{className:"col margin-vert--lg margin-right--md"},a.createElement("h1",{className:"hero__title"},"Make better games through automated testing"),a.createElement("p",{className:"hero__subtitle"},"Regression Games helps game developers go from zero to one with automated game testing"),a.createElement("div",{className:Q,style:{justifyContent:"left"}},a.createElement(c.Z,{className:"button button--primary button--outline button--lg",to:"tutorials/building-your-first-bot"},"Get Started")),a.createElement("div",{style:{marginTop:"16px"}},"Get started immediately by adding the package to Unity:",a.createElement("div",{style:{marginTop:"16px",fontSize:12}},a.createElement("pre",{style:{display:"inline"}},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.28")))),a.createElement("div",{className:"col"},a.createElement("img",{src:t(329).Z,alt:"Regression Games",style:{borderRadius:"12px"}}),a.createElement("div",{style:{color:"gray",paddingRight:"24px",fontStyle:"italic"}},"Demo of our recording and validation features. Automatically extract game state and begin writing functional tests in minutes."))))),g=()=>a.createElement(l.Z,{title:"Regression Games Docs",description:"Build bots for games"},a.createElement(m,null),a.createElement("main",null,a.createElement(i,null)),a.createElement("div",{className:"container text--center"},a.createElement("div",{style:{marginBottom:"64px",marginTop:"32px",fontSize:"1.5em",color:"grey",fontWeight:"bold"}},"BACKED BY TIER 1 INVESTORS"),a.createElement("div",{className:"row"},a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://nea.com/",target:"_blank"},a.createElement("img",{style:{height:"60px"},src:t(8926).Z})))),a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://a16z.com/",target:"_blank"},a.createElement("img",{style:{height:"100px",marginTop:"-20px"},src:t(2074).Z})))),a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://roosh.vc/",target:"_blank"},a.createElement("img",{style:{height:"150px",marginTop:"-40px"},src:t(5377).Z})))),a.createElement("div",{className:(0,s.Z)("col col--3")},a.createElement("div",{className:"text--center"},a.createElement("a",{href:"https://bbq.capital/",target:"_blank"},a.createElement("img",{style:{height:"80px",marginTop:"-00px"},src:t(6796).Z})))))))},2074:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/a16z-137749dc988bf598433d91265cf02959.jpeg"},7390:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/ai (2)-19c3966e89df8c194ecd3e781a68cfca.png"},4661:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/ai (3)-a8825fb481555ca2707f39c89be6dedb.png"},3768:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/ai_1-e765bdc2cfecce91cbd44170e21a6e1c.png"},6796:(A,e,t)=>{t.d(e,{Z:()=>a});const a="data:image/jpeg;base64,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zzzzyj73333jzzzzzzy1z333zTzzzzzzetX/AN9e888887+2rUi9888887OMMMMdO888887288888U888888528888o8888888s/es+t88888888888888888888888888888//EACYRAQABAwMCBgMAAAAAAAAAAAERADFhICFBUYEQMHGhwdFAkbH/2gAIAQMBAT8Q/ChAGWKSY9l90ZBGEf55UxApe4+3q7et6lLWWfAmpHIw0c3z9j16mb+tARJHXMmM8Lhg5nHFIjDpcWz8j5O/kHOAr9+vepOOJ8lz+Z0LyAP37eROVwu57duiBQ/ywHflwG7gpNKU4TwiWkZtDCLM0AiiCIu60vCwwMLHhegieDVuZejsW7nHSaGjeDjomRhMlRcWdmxhIB5Gm8lL1k+Q3yhQgYYARE2Q7IFx5Wp9qjfStxLodyLGACaIugy9IN3ezNu+phHqUlyKyqytZWsqkkLSANTgOKAhZ1Ko8a5XBQCR0hHJ5C8ugclK4pdn9UZAmpB+c//EACkRAQABAQYFBAMBAAAAAAAAAAERACAhMUFhwTBRgZGhcdHh8BBAsfH/2gAIAQIBAT8Q/SKlA1qJjyFCyCaM8KY3rn7Pepll1/EmEdKcL4+r/vehAJhbkUicYxjT1pEYbKLJruNzrwDpMcxj81Lw1Dcy/mthB8keAAsDFzjH40rCiE09KNhjDS7U8zR8McHJ/JQDakiyjd6HmKxPlP31pY7gLY3elRCZbs9/C1IryTd6viKlhAXk4JmevegwmGXlBr4tNIZI7b0q42S7CkU5Ad/8tYBSRTgby0LDLefa2Qy/mnRwlnQxPXgBxJ/e9Jbw9Sfaht+9I3avmR5t/wAVdUuUT2vK59sXn+9//8QAKhABAAECBAUDBAMAAAAAAAAAAREAITAxQVFhcYHB8BCRoSBAYOGx0fH/2gAIAQEAAT8Q/FgBbaX8sqJl82yaNk4HuqFUYzhTrKkRRITR+zu5dwbHhd+aERj9NodD6WA40EHovSZzu5Dlp8GnKEQiQjjgqASuhRdHsFuMavDT+MAaBFgW4f7UgBmxYwqXDZZp5j/MNxncQX7jb94x4gR+QsSZnz0oWySuRODhit8wMjQ79cactWbrnHcvVoa2vucNHWhEkuYIEEqJwLfBfb7ByGNeQODmfxwoiWNeF5OvlsDMObySKRlZGHFzvSvl6ijJZppQ8TscNXJqMkSbLnHct9ZBMgz3cWcCOnGh5vUBI9v29IQJ63sVOFNpxNTzalbJK4R51LnkRQeZk+Z0KVyeJzNPoNRAStO5m3ucSIk+37dfSEE9eNTzb0lgjp2x6RWj2/bpUsE9e2KJPLUp1CIlCTqUOapXI9fQZ+EcyzvPTFjBHTjQ839YdA6Y/b49ZwptOJqebVARH6s9EkqWY4q5bJ8b1GAW0lznp196MTdI2lLPZXqYd3NJgiypsa8l7V592rz7tXn3avHu1efdq8+7V592rz7tXn3avPu1Oebn/XXkvamkYpALWAcVhzxVw3hWcD/UxcoUJAJV5BQ8oEZhRw02LEVxHmXDQeKNYMJyB4kBv0XdiAPYvCFxHRp3Uw4EK0NizSYasRKUjBNoXoAMkUvAxBBKDwJ7xoZy0bZKOq0B46hmiRVxMNOTGBLqtEgOiFIWEqQN4OCEnBxVTgVk0J7xGQL2ESKOKZhsdJcthK0XDfwIsypDcVs8cZg7SngJNHUydajccrK3SF5NdQEnJ2b7oqvQKBL1TS4RzAPdrMFquloroUT/AMjnMhlyjO5TWvlX0oSq5xnYGKP5gBdlOSO8MtqW2rZkN7oip/WX+IQWg3AbraSqVVW6v5V//9k="},329:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/demo-932c14cb4e546042c07e5799665cc0d8.gif"},8926:(A,e,t)=>{t.d(e,{Z:()=>a});const a=t.p+"assets/images/nea-3a1bcf8f2def3c2af15a50c315f2f176.jpg"},5377:(A,e,t)=>{t.d(e,{Z:()=>a});const a="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wgARCADIAMgDASIAAhEBAxEB/8QAHAABAAICAwEAAAAAAAAAAAAAAAYHBAUBAggD/8QAGwEBAAIDAQEAAAAAAAAAAAAAAAQFAgMGAQf/2gAMAwEAAhADEAAAAfVIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwUArO0OK+0fPa1vq8N3rCoYxK7PmsDYTat8dl7VjBNb7jJ+9h63PTv45T2LGsp2hvMO2sPPjummVN97/wA87ez5nLsvy96R0TpSOg4BxyPGm9s+Zch9c887idPMtJi3lXs+i6QSZ7DVJhsS9WQfZH0WvyO/mday24YLjlUS0EK7piWW/ibokbkE03Fzxvk30THJzFs9mL3hwAAANTgu0O3ffr8XnGdhcnH1xO2Oz7SGLSnfCDfCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8QAKRAAAgICAgEDAwQDAAAAAAAABAUCAwAGARcUBxEVEBIWEzA1cDI2QP/aAAgBAQABBQL+/OwGGdgMM7AYYv8AUGfNxzUZcER6hE8z7AYYJ6hXfqCGVHDNt8gPb2CwyPqCd7odkHeQfbpFaR2CwzsBhi3dzjGD/cDFTZCfY0U473Ixa0TGzYrPrHj3k+CSJbPKCy6UJ2P7LoDanrAjMD8KU5uGvDJ4qGdo2v64rg3a/hSnGWlrogoiZCOGdU6GPlhZ5YOa5YnvYbl/sandJql/YlmND+WZ+r/wH1h/nsEZwdxkt9l5qcK7dqZE5rm28JhOwxs2XZfncRorjNdSNOUzHsMbD9+rvD1sGZ7nZGy4037lmfcsyPHPN24e/wCQodPCaKev12OwYLWmr/wH149PK+OXWtCu866rzrqvILqvjiPT4Wc+uq8E0ASmyuuNUG2nBM7euq8j6d0+6tOMnpN0SBhnXVeddV4n08RVc30yDZgpX8Kl+NNJgzPWBfGg/s/IRjZ8pdKwlv4Zfn2TjBrZ4V5/6JYzWdsgGFx3AzOwqX/AyVyNIMXzuPmv8glcstDFksnyq8G68gBN8dYtX2gZYtvvt/un/8QAPBEAAAQEAQcJAw0AAAAAAAAAAQIDBAAFESExBhITQWGBwRQVIlFxkaGx0WBy8BAWICMyQlNUYqLS4fH/2gAIAQMBAT8B9gl2EsQUIjybOMauGzftjmSXrAJBb5u3/BGEJZLpa05W9DPqNA77esNlJDMFQbEREBNu8hhtIGrQ66zvpETw7q8YI+yeUMBNAN9n9wlk2zI/HOuSlQD41Bxjmpj+U8v5QnL2Skz0At80AII0HrqF7CMOsm34rqCin0ajS4YVtriey5FlL0TFJQ9gHuv4/KrlKxK5TMUaloIDYbYUhScylUolMsag+9DSbS5ZpyF+HRKNhvhqwvCDnJ5iflCNRMGH2uNoa5RIqqLJvS/VqeFqeQaoKOTJDAcBG3vQE7ZO34rriJSlChca7cI58lX4xv3R842JnwHrQhSiFaDcREvpDqePRcKCisObUadlbROZq3fMEUiHqcKVx6r+P0kwa0CusO6gcRvFGujAfvb+v04RRqIiOq/XuhUGlDaLdj+rb2dfCHIJAIaL4+N3Z7Df/8QANBEAAAUBBQMICwAAAAAAAAAAAAECAwQRBRITITEUQZEVYHGhwdHh8BAgIiNCUVJTYbHx/9oACAECAQE/AeYTciU4k14lCIbbIRmTlQuTIku4TGQdTPjpxVL0DloOuk2hnI1fwGxaCSrieeAVaTxsFTX5ja3/ALv77gqQ+mLfxKnXsDVpME2m+rMQJK3pCyNVS3cfSizXzbUR5HkEwpaTqSC6g7EkIdx2NT1C27RfThr0PoDtnLQlCmD9pIPlNRU7hsLzTFxvMz18mNhlfQXUOTnyYMt5mXaGoLJNpvozoIUVxiQtRlRO7j6yjdzHvb34FXdOjxCDeqV7zp4hq98XMb//xAA/EAABAgMDBwkECAcAAAAAAAABAgMABBESEzEhIjIzNJPRFEFRYXGBksHhBSBCkRBDUnByo7GyIzBAY4Kh8P/aAAgBAQAGPwL7/NTLeFXGNTLeFXGNTLeFXGAmcYQGz8bVcndHKnV/wvhp8XZBuJZpKP7lSY1Mt4VcYHKpZBR0tZCPnCH2V22lCoMKakmg/Z+sWc3ujUy3hVxjOYlyOoEecEJF0+nSaPlCpaWbDzqNJStEHojUy3hVxjUy3hVxiWYW0wEuOBJoDXHth6WabZUhFKFYNcAemGJl0JStdahOGJH0PyzbTBQ2chUDXDtiXmHAAtxNSE4e4BFylp1+Y503lAntjYTvjBLaLtH2a1j2XKu1F3LhVD1nhSDMzQUslRSEg0pGoVvDDDstaSlZKSkmse1WUnJm06qmhhth0kN0KlUjUK3hh5TKVtOJSVBVomJRxJ+sAPYchiZQ7phw1jYPzjGwfnGGQthyWmAoFs3tUkxNf4/tENSolUuBuudbpz1jYk7z0h2ZKLBcNbMSX4PP3E9sTt5pXpPdzf6jKiar1LTwgOqlJiYUMA4sUiS9pJSQ080B+Hn84Mu6wXU2rSSkxsjvzEMoQ1dNt5c45SY9ouBJtOUuh02TUwiYsW6ZFJ6o2R35iHWmZZSVrSU1WcgiWSkZqFBaj0AQ82/JOXzSi3fNuAE07o1c3vE8I1c3vE8IF1Wtc3piZrjRH7BDEy648HF1qEqFMSOiNbM+IcImJZsqKGzktY4RJfg8/cB5ard+sBblW3hkvEecbcrd+sbcrd+sNyboDzSWw2bQxpBLMy40n7JFqNuVu/WAp95cwB8OiIShCQlCcgA5oLotS7pxKMD3Rtyt36xnTqyOpFIu5dFK6SjiqH3+WKTerK6WMK98bcrd+sbcrd+sB4qVMPJ0SrAd0OzRmi2V0zbFeakNSoXeBuudSnPX6HpkzZbvDWzYrDMsFW7sUtUx/lTaXBd8nAUTXFNMf1+UMNiXQlxxm+IcdpZ6sIl2XWqBxNVOJVUIy0/UxMlplKiw5YNpdK5oPR1xLTC2EpS+psJCXK6XdBZsVoyp6teg4RJ3rKWxNJtIsOWuauXIICwy2lokjW52Q0wsxVDALVsoNHM9OWlSn1/oW1oWEJIsPA/EioNP+6YRMBtl0BuxYe7ccIDjwRYLCmVNjrI4RMtOO3qnFkhfVQAV+USssFgOy92QrmJTSHH3ihCiyWUpQa489Yl1tXaSGg08ANKnOICbqXOcqro0spr0Q0XCzabcCuUpFHCK4eX31f/EACkQAQABAwIFBAIDAQAAAAAAAAERACExUWEQQXGBoZHB8PEgsTBw4UD/2gAIAQEAAT8h/vtx+FGjRS2UMJ3yWaiDkCr2eDVNabal4ScKJgXt1ewTPigjQR96fhKFknYZ6zwImOqxL1lSLhSmbarmU5uIf2Qy8SNFStvHDC1Lg2o7uUGtWQpylnOLpwG0wTqxvG6oCmAQXcTxcNTdhYq1L5GI5SjxXzr2qfrYx+9PQGiy3sFLYWSQdOdfJfeuYaI4EiNIJEZ/9WVrRWFAxXyX3qEacpITceVPqGzc0g9Gj6S+ud8963fz2rc/PanUrVGsg2Irxa+b8ApSsI3r79QBhEDMWDPavmbuLhrxlHc+Zamf0VAYy9lVXAyxLrAE96FfPDzYj28Kl+UGEnIzwCMpqcxFQDjrMQ6460OYytYlZvrwCJTYLcIm1OkeRZU/53o6u7EiLyp78adMtE5Cc02713DI1ptjtkstJWnAOVJgmOBvHWvmbvwxsmcKPQPhmTQc6+g0+g0iXRMEBO2KdouTh0bV9Bo2SJtE6xfzQcEh4BoUi68x5dXV0ivoNCHU4K9ZaS83Llt2nymCluTFPoNPoNLv4BgupqrE11EIGU7U73MbkrDvwZpBAYWDM7UKibtDLT+IjfMkp5eYKE2wBG4MHLeuYcWHATYkQJtmlGJA8RJIWyPNOTDcYMu24nFD4vSD9s0cSiZBpmC2k3qZ5mmmSXY1qNrcrNWKxbdD/wAMeitaVeidHTkv3llDC7Sla00iMi1i0UA61WfVTmoTMNEza+zFTsRGJKVINC0UI+CkkVt6Z6jtRzQUQjF/ZGaw3EQMrQgkuvG391f/2gAMAwEAAgADAAAAEPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPLRSqQCAWSzXSPOISUUzwJwmbC/PPPPCszytvPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP/xAAkEQEBAAICAQMEAwAAAAAAAAABESExAEFRYXGBECBg8JGh0f/aAAgBAwEBPxD8BOb+CAWEVVAGGV45Ex2BPaq+5PPFbrIZJRBQVClcaPW+dopsC7VHHtx51THki2SoAmBRxJyIKgqIXHTf4zwHOCld2NduCZ6DZn9jyD0IARjAgcKb4DO9X2aNGJvgyXUm1vazTr6tHsgClaiFGNmdc7Yok/2F5RQZLYL6BBmom88GrT0WyYwqPbx9QlJmIlmchnIazOGQFUx1+OVRfRKVqfWdNIHfP2v88pTo2iCACwN0M/Fsm/F2aJTE3xjD1YM2KoDl19y1lUorlA7O7bBDycRhIClhXNI9YOZKM14nMAmXTGNVe1+b1x7kuMkd1h6a5rDCoeYBtBXvGVzfZHY7/Bf/xAAmEQEAAgIBAwMEAwAAAAAAAAABESEAMUFRYXEQocEgYNHwgbHx/9oACAECAQE/EPsLQaZl6zEQM6wYeIv5DD7VBfMCyw6WKxOFNrn2TKmlb3lgTrU+Ix5Exe8M1Jww4iTsL8V6EgGQSTglTIRgQtSadxfHXE0QqO0I9vUabEEl0zqYbN4Gmjz+cm+QUrcXukd44hNn+LykQc82snG1p4wIYQ5RyHTKIiKjs65+9+eRSCxElActc8YEBVPmL98lDkljVjmdfUFBod1Ys9HRBrrktHKYakr5e3WajAQsscDv+vbnADOLnXho/odJoVMSf8wex+Xs/Y3/xAAlEAEBAAICAgICAgMBAAAAAAABEQAhMUEQUWFxgaFwkSAwQPD/2gAIAQEAAT8Q/ntRPo/wwYMAKpAAvaJOwR9XjGOqoWCl7DZ1KqAuQo7CyPalPrf2+MEmTDO9gH0v2ziwyCdIHhERHhHGZQOAc6CfoHqkfCBvuNtD4Uv6cBDsmumobkFgilNi2Z8ydgQS72A622eEGA1H94ZKWWOqOGPtoG5UXL64mCstBGZBHB5Xd8DsTyCihOVwGUn80ENEs12vn9bC4AV9LhqHWbBdltIgLNqUuE3FyWa1B3Ba1/Ob2geGJp7IjxEwPnTySqwqV7kDwCGpSOQCDZ2Ir1Ji452Reo/CfjNmSVl1D1VK+r34hDbDVpgSipHv1kqzpcb+QmDMrfNLfsBEexHAwqvvwLg3amLKyJQAaPFFBxsEFCOOvHJrz140M+UPMyUF7cd5+x8n62f+p7MKa5vdqnxU/Ezofq2XcvDABzLy4Voeknxm09HioqGqofng3joK6ARKUb2+N9XXEHA6IAD7tyCUseWg7rX4OBmuaSQEMDHjqeJ0J1diyjZQdGt4O8LmhOvVQHyMWsaEa6ADWoU4Hy1a2S+K20iS1OO8BFiK+DsfvAKairMhXB7d3wzSmXwCigHK4DP2PkSie8uzlHNHHG5lPUQQnXCe55ECNGogAEi7aJGjw6xWE0J/Gin3X58CDo0B+L2UfQwA2SopADQBj/DEpnKiV2quWvgQ7kHbQ+FL+nN27ITOH46wACsCuK3KlEuyLLLPIgQ5VPgTpfyVnJHeGCgozvw278d4YICCXvxk1568JGsGJk03tx3kbrlnY3ZnPv8A1a7gqEyNE25vfLeEbmNR3MYm6DTkH0e8oxtIsQoFh3AXLg23pQ6X0wR+sB0uIxYt3sxQpcL01ad77anGMVKol1yTcsNDscVRvQx7SNtzq89ZoJilRhBLVKgY8f8ACIUjhS1Dhu/hTs3QGhQeI4OcbTw/LceQHA7MJWpKX+ckNHLvvFQURVgDTZnst6mI6X8oWQWiDQHbdVr4pg1BTnX3NjDX0F71OaBjXWQOcL20kABLRXmT+af/2Q=="}}]); \ No newline at end of file diff --git a/assets/js/735d0569.85fea1fa.js b/assets/js/735d0569.85fea1fa.js new file mode 100644 index 00000000..469c4b78 --- /dev/null +++ b/assets/js/735d0569.85fea1fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[7445],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>c});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=u(a),k=r,c=d["".concat(s,".").concat(k)]||d[k]||m[k]||l;return a?n.createElement(c,i(i({ref:t},p),{},{components:a})):n.createElement(c,i({ref:t},p))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var n=a(7462),r=(a(7294),a(3905));const l={sidebar_label:"Changelog"},i="Changelog",o={unversionedId:"changelog",id:"changelog",title:"Changelog",description:"Release 0.0.28",source:"@site/docs/changelog.mdx",sourceDirName:".",slug:"/changelog",permalink:"/changelog",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Changelog"}},s={},u=[{value:"Release 0.0.28",id:"release-0028",level:2},{value:"Release 0.0.27",id:"release-0027",level:2},{value:"Release 0.0.26",id:"release-0026",level:2},{value:"Release 0.0.25",id:"release-0025",level:2},{value:"Release 0.0.24",id:"release-0024",level:2},{value:"Release 0.0.23",id:"release-0023",level:2},{value:"Release 0.0.22",id:"release-0022",level:2},{value:"Release 0.0.21",id:"release-0021",level:2},{value:"Release 0.0.20",id:"release-0020",level:2},{value:"Release 0.0.19",id:"release-0019",level:2},{value:"Release 0.0.18",id:"release-0018",level:2},{value:"Release 0.0.17",id:"release-0017",level:2},{value:"Release 0.0.16",id:"release-0016",level:2},{value:"Release 0.0.15",id:"release-0015",level:2},{value:"Release 0.0.14",id:"release-0014",level:2},{value:"Release 0.0.13",id:"release-0013",level:2},{value:"Release 0.0.12",id:"release-0012",level:2},{value:"Release 0.0.11",id:"release-0011",level:2}],p={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"changelog"},"Changelog"),(0,r.kt)("h2",{id:"release-0028"},"Release 0.0.28"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 23, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Bot Sequences can now be created, edited, and deleted directly from the in-game overlay"),(0,r.kt)("li",{parentName:"ul"},"Bot segments that rely on image sources can now load images from paths vs just raw data"),(0,r.kt)("li",{parentName:"ul"},"Direct login is no longer supported for the SDK; API keys are now required"),(0,r.kt)("li",{parentName:"ul"},"Bot Sequences are now reloaded automatically from disk when played"),(0,r.kt)("li",{parentName:"ul"},"Object detection bot segments can now define a confidence threshold (text queries only)")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improved language and explanations within the website"),(0,r.kt)("li",{parentName:"ul"},"Properly handle failing behaviour segments that dont load or timeout"),(0,r.kt)("li",{parentName:"ul"},"Use of computer-vision capabilities now requires authentication by setting an API key in the SDK settings"),(0,r.kt)("li",{parentName:"ul"},"Sprite rendering within the SDK has been improved"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where the overlay would throw a null exception when opening for the first time"),(0,r.kt)("li",{parentName:"ul"},"Fixed issues causing the game to freeze for a few seconds when starting"),(0,r.kt)("li",{parentName:"ul"},"Data for the last segment of a recording is now properly saved")),(0,r.kt)("h2",{id:"release-0027"},"Release 0.0.27"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 9, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Validations can now be run against state contained within the root properties of a Game Object."),(0,r.kt)("li",{parentName:"ul"},"Game logs are now recorded and uploaded as part of a bot sequence run or recording (no UI available yet)."),(0,r.kt)("li",{parentName:"ul"},"Performance of data capture during gameplay recording has been improved, especially for ECS-based games."),(0,r.kt)("li",{parentName:"ul"},"Bug fix: Screenshots are now properly captured at the end of a frame.")),(0,r.kt)("h2",{id:"release-0026"},"Release 0.0.26"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"}," August 26, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Interleaved playback of recorded mouse and keyboard events has been improved"),(0,r.kt)("li",{parentName:"ul"},"Improved navigation layout on our website"),(0,r.kt)("li",{parentName:"ul"},"Bug fix: Scenario builder no longer shows duplicate step options"),(0,r.kt)("li",{parentName:"ul"},"Bug fix: Improvements to the display of the Validation Demo walkthrough"),(0,r.kt)("li",{parentName:"ul"},"Many experimental features added for an improved overlay experience, bot logic sequencing, and computer vision approaches... stay tuned!")),(0,r.kt)("h2",{id:"release-0025"},"Release 0.0.25"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"August 12, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Performance rules can be created to flag when a playthrough crosses certain FPS thresholds"),(0,r.kt)("li",{parentName:"ul"},"Performance information is collected more frequently during gameplay recording"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"New Bot"),' - An action analysis tool adds support for a "monkey bot" that can randomly interact with a game in an efficient manner'),(0,r.kt)("li",{parentName:"ul"},"Unity ECS data collection is now supported - validate state information from both ECS and GameObjects"),(0,r.kt)("li",{parentName:"ul"},"Improvements to various SDK error messages"),(0,r.kt)("li",{parentName:"ul"},"Better support for lower resolution screens")),(0,r.kt)("h2",{id:"release-0024"},"Release 0.0.24"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"This release deployment was skipped and kept internal")),(0,r.kt)("h2",{id:"release-0023"},"Release 0.0.23"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"July 1, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Try out our validation tool without an account or game! Visit ",(0,r.kt)("a",{parentName:"li",href:"http://play.regression.gg"},"play.regression.gg")," to learn more"),(0,r.kt)("li",{parentName:"ul"},"A tutorial is now available for our validation tool, built directly into the website"),(0,r.kt)("li",{parentName:"ul"},"The progress of a validation run is now displayed"),(0,r.kt)("li",{parentName:"ul"},"Scenarios can now be run from the demo scenario builder page")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Scenario validations now properly start from the start of a recording (the ordering of scenarios no longer matters)"),(0,r.kt)("li",{parentName:"ul"},"The validation results now shows the proper gameplay recording within the screenshot scrubber"),(0,r.kt)("li",{parentName:"ul"},"Improved performance of input recording within the SDK"),(0,r.kt)("li",{parentName:"ul"},"Long-running validation runs no longer timeout")),(0,r.kt)("h2",{id:"release-0022"},"Release 0.0.22"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"June 18, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Unity SDK now supports recording games using the legacy input system and Unity UI."),(0,r.kt)("li",{parentName:"ul"},"New data collection format for improved state display within the scenario builder and validation results page."),(0,r.kt)("li",{parentName:"ul"},"New Bot Segment data format for stitching together various bot types, such as monkey testing bots combined with recordings."),(0,r.kt)("li",{parentName:"ul"},"Bounding boxes show entity locations within the gameplay session web UI for improved debugging.")),(0,r.kt)("h2",{id:"release-0021"},"Release 0.0.21"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"June 6, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New SDK Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Recordings can now be used programmatically in Unity Test Runner."),(0,r.kt)("li",{parentName:"ul"},"Inputs handled via ",(0,r.kt)("inlineCode",{parentName:"li"},"Input.GetKey()")," can now be captured and used in replays."),(0,r.kt)("li",{parentName:"ul"},"An animation rigging package is now available within the Unity SDK for data capturing.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"SDK Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improvements to error messages for recording playback.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Website Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Prevent breakage when storing null or undefined in a Store Step."),(0,r.kt)("li",{parentName:"ul"},"Adjusted height for the recording thumbnail in suite details.")),(0,r.kt)("h2",{id:"release-0020"},"Release 0.0.20"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"May 23rd, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Memory and CPU information is now captured by gameplay session recording."),(0,r.kt)("li",{parentName:"ul"},"The in-game overlay has an improved layout."),(0,r.kt)("li",{parentName:"ul"},"Gameplay session recordings can now be looped for repeated testing.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Quickscope ",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Null count values are now allowed for scenario steps that have an optional count."),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where duplicate scenario names were allowed in a suite."),(0,r.kt)("li",{parentName:"ul"},"Scenarios now maintain their creation order."),(0,r.kt)("li",{parentName:"ul"},"Improved loading of screenshots for a gameplay session.")))),(0,r.kt)("h2",{id:"release-0019"},"Release 0.0.19"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"May 8th, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("strong",{parentName:"li"},"Quickscope"),", a new collection of features made for easy smoke test automation!",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"New features within the SDK for recording a gameplay session and playing it back as an automated test"),(0,r.kt)("li",{parentName:"ul"},"A UI for designing functional validation tests from data automatically scraped from your game.")))),(0,r.kt)("p",null,"Learn more about this release in our ",(0,r.kt)("a",{parentName:"p",href:"https://www.regression.gg/post/quickscope-launch?ref=docs.regression.gg"},"blog post!"),"."),(0,r.kt)("h2",{id:"release-0018"},"Release 0.0.18"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"April 8th, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The new UI/UX is now available to all users."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Be on the lookout for a large release at the beginning of May!"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where Agent Builder would use incorrect paths for certain operation systems."),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where certain redirects were not working on the website.")),(0,r.kt)("h2",{id:"release-0017"},"Release 0.0.17"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"February 29, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Introducing an ",(0,r.kt)("a",{parentName:"li",href:"/automated-testing/overview"},"automated UI testing framework for Unity")),(0,r.kt)("li",{parentName:"ul"},"An entirely new way of ","[representing states]"," requiring less custom integration"),(0,r.kt)("li",{parentName:"ul"},"[Rolling Out]"," New UI design - send us a message for access!")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The SDK is still only usable in the editor, but will no longer interfere with creating production builds. Future support for running the SDK in production builds will be coming at a later date."),(0,r.kt)("li",{parentName:"ul"},"Various UI improvements, such as screen size scaling and link fixes")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Other Notes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improved scalability of the bot instance history dashboard")),(0,r.kt)("h2",{id:"release-0016"},"Release 0.0.16"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"December 19, 2023")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Our new ",(0,r.kt)("a",{parentName:"li",href:"/quickstart"},"quickstart guide")," allows you to have your first bot running in minutes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"[RGState]")," is now allowed on class properties"),(0,r.kt)("li",{parentName:"ul"},"Support for raw key press actions using the new Unity Input System, which works great for certain types of bots"),(0,r.kt)("li",{parentName:"ul"},"Code generation time has been reduced, and is now automatic"),(0,r.kt)("li",{parentName:"ul"},"Default tick rate for bots is now faster"),(0,r.kt)("li",{parentName:"ul"},"Logs from local bots are now uploaded and saved for debugging"),(0,r.kt)("li",{parentName:"ul"},"Local bots can now be saved onto your Regression Games account"),(0,r.kt)("li",{parentName:"ul"},"The current tick number can now be accessed by local bots")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed bug where the username and password would not change within the SDK settings"),(0,r.kt)("li",{parentName:"ul"},"Bot loading reliability has been improved"),(0,r.kt)("li",{parentName:"ul"},"Better save settings around login passwords"),(0,r.kt)("li",{parentName:"ul"},"Stack traces from bots are now clickable and more usable within the Unity console"),(0,r.kt)("li",{parentName:"ul"},"Improved / reduced OOM issues with bot replay data")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Other Notes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Our SSL certs have been updated - make sure to update your SDK to use these new settings")),(0,r.kt)("h2",{id:"release-0015"},"Release 0.0.15"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"November 21, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview, and it's ",(0,r.kt)("strong",{parentName:"p"},"our biggest release yet!")," Our product is in beta and we would love for developers to\ntry it out and provide feedback! Contact us at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New welcome screen added to the SDK, with docs and ",(0,r.kt)("strong",{parentName:"li"},"sample scene/bot")," options"),(0,r.kt)("li",{parentName:"ul"},"Introducing C# bots that run ",(0,r.kt)("strong",{parentName:"li"},"directly in Unity")," (reference materials ",(0,r.kt)("a",{parentName:"li",href:"creating-bots/csharp/adaptive-bots"},"here"),")"),(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("a",{parentName:"li",href:"pre-made-bots"},(0,r.kt)("strong",{parentName:"a"},"Bot Marketplace"))," (Beta), which provides ready-to-go bots and integration instructions for those bots"),(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("strong",{parentName:"li"},"Validation Dashboard")," (Beta), which provides an interface to view validation runs for a bot, complete with screenshots, state information, and historical records of previous runs"),(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("a",{parentName:"li",href:"creating-bots/csharp/agent-builder"},(0,r.kt)("strong",{parentName:"a"},"Agent Builder"))," (Beta), which provides a fast, low-code way to develop bots"),(0,r.kt)("li",{parentName:"ul"},"Improved debug utilities like RGGizmos to see what your bot is thinking"),(0,r.kt)("li",{parentName:"ul"},"Bots can now be directly synced into your Unity projects"),(0,r.kt)("li",{parentName:"ul"},"New tutorials and guides for getting started")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"General Improvements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New homepage dashboard for game developers, showing the latest runs, bots, and guides"),(0,r.kt)("li",{parentName:"ul"},"Agent Builder now supports and uses zip file bots by default"),(0,r.kt)("li",{parentName:"ul"},"New RGState, RGAction, and RGEntity features for integrating the SDK into your game"),(0,r.kt)("li",{parentName:"ul"},"Site has been updated to remove most tournament information and instead focuses on bots for studios")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed an issue where nullable types were not properly generated for RGActions"),(0,r.kt)("li",{parentName:"ul"},"Fixed a code generation bug in Firefox"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where local unity bots could not utilize action formats properly")),(0,r.kt)("h2",{id:"release-0014"},"Release 0.0.14"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"October 10, 2023")," "),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Platform Improvements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Added better support for choosing between various languages and bot-building tools when creating bots")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed bug with updating bots that are managed via a zip file"),(0,r.kt)("li",{parentName:"ul"},"Fixed bug where logs for bots would display duplicated lines"),(0,r.kt)("li",{parentName:"ul"},"Fixed issue with default settings for the Getting Started sample")),(0,r.kt)("h2",{id:"release-0013"},"Release 0.0.13"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 25, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New RGState attribute in our Unity SDK can be used to seamlessly communicate state information to your bots"),(0,r.kt)("li",{parentName:"ul"},"Agent validation results are now sent to the Unity SDK and properly cause QA tests to fail if a validation has failed"),(0,r.kt)("li",{parentName:"ul"},"The connection status of bots are now shown within the Unity SDK Overlay")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Platform Improvements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Logs in the Unity SDK have been sanitized to omit sensitive information"),(0,r.kt)("li",{parentName:"ul"},"New AIEngine service is available to make instant bots more stable and scalable"),(0,r.kt)("li",{parentName:"ul"},"The start time of current and historical bot runs is now visible within the Running Bots dashboard")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Users no longer need a GitHub account to create and use Zip bots"),(0,r.kt)("li",{parentName:"ul"},"Fixed an issue where match logs would be retrieved from an incorrect starting index"),(0,r.kt)("li",{parentName:"ul"},"Fixed a client bug where documentation would not open from the Running Bots dashboard"),(0,r.kt)("li",{parentName:"ul"},"Fixed an issue where Zip bots would not properly start or reload")),(0,r.kt)("h2",{id:"release-0012"},"Release 0.0.12"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 11, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Platform Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New ","[RGAction attribute]"," within RG Unity SDK to make actions easier to define"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"tutorials/github-actions"},"GitHub Actions and Unity Test Runner Support")," - New samples and guides for running bots\nin GitHub Actions (and other CI/CD systems via ",(0,r.kt)("a",{parentName:"li",href:"https://game.ci"},"GameCI"),")"),(0,r.kt)("li",{parentName:"ul"},"UI improvements to Behavior Tree Beta"),(0,r.kt)("li",{parentName:"ul"},"Updated defaults for RG Unity SDK to be more user-friendly"),(0,r.kt)("li",{parentName:"ul"},"The RG Unity SDK now includes its own font assets for better interoperability"),(0,r.kt)("li",{parentName:"ul"},"Links to download Zip bots from dashboard are now available")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed issue where the website would freeze in some match loading scenarios"),(0,r.kt)("li",{parentName:"ul"},"Fixed broken links in documentation"),(0,r.kt)("li",{parentName:"ul"},"Fixed issue where Agent Builder code generation would flicker"),(0,r.kt)("li",{parentName:"ul"},"Fixed bug where Unity actions would sometimes be sent to the wrong bots"),(0,r.kt)("li",{parentName:"ul"},"Fixed bug where instant bots would not start when the user did not have a linked GitHub account")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Security fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed bug where lobby APIs would reveal email addresses")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Coming Soon")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Continued improvements and additions to the Unity attribute system"),(0,r.kt)("li",{parentName:"ul"},"Additional samples and guides for various use cases"),(0,r.kt)("li",{parentName:"ul"},"New features for the Agent Builder tool")),(0,r.kt)("h2",{id:"release-0011"},"Release 0.0.11"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"August 28, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Platform Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"404"},"Agent Builder")," Beta - Our GPT-enabled agent builder product is live for select players, now with improved validation tools. If you","'","d like to try it out, let us know!"),(0,r.kt)("li",{parentName:"ul"},"Our documentation site is now live! This docs site includes API/SDK references, tutorials, guides, and FAQs for both players and developers."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"authenticating-with-api-keys"},"API Keys")," - developers and players can now create API keys to interact with RG services"),(0,r.kt)("li",{parentName:"ul"},"New onboarding flow for players and game developers"),(0,r.kt)("li",{parentName:"ul"},"The ID of a bot can now be seen and copied within the Bot Manager"),(0,r.kt)("li",{parentName:"ul"},"Zip Bots - Bots uploaded via zip can now be downloaded"),(0,r.kt)("li",{parentName:"ul"},"The home page has been redesigned to provide players more information about getting started.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Unity SDK Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"An early preview of our ",(0,r.kt)("a",{parentName:"li",href:"overview"},"Unity SDK")," for building AI agents is now live! Our docs site has a getting started guide - message us for access."),(0,r.kt)("li",{parentName:"ul"},"Developers can now create Unity bots from the Bot Manager"),(0,r.kt)("li",{parentName:"ul"},"Logs for bots can now be downloaded - available via API or through the ",(0,r.kt)("a",{parentName:"li",href:"session-insights/in-editor-replay"},"Bot History dashboard")),(0,r.kt)("li",{parentName:"ul"},"Character configuration for Unity bots is more flexible and customizable"),(0,r.kt)("li",{parentName:"ul"},"Validation results for QA testing bots are now saved to Unity Replay files, allowing for viewing the validation directly within Unity"),(0,r.kt)("li",{parentName:"ul"},"Default settings for the SDK have been adjusted for increased ease of use"),(0,r.kt)("li",{parentName:"ul"},"Added a \u201cStop All\u201d button for stopping bots from within the Unity game")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed issue where choosing a bot repository via commit would throw an error"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where bot logs would not show the correct number of lines before clearing"),(0,r.kt)("li",{parentName:"ul"},"Fixed issues where Unity bots would not teardown properly"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where login and registration would sometimes fail"),(0,r.kt)("li",{parentName:"ul"},"Feedback button has been moved to a better spot on the screen to avoid hiding other components"),(0,r.kt)("li",{parentName:"ul"},"Fixed issue with SSL certs on certain systems")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Migration Notes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"For Unity developers: the namespace for various classes in the Unity SDK have been updated. Please make sure to add the following import declaration\nin your files that use classes from Regression Games.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-csharp"},"using RegressionGames;\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Coming Soon")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New attribute-based system for Unity SDK integration. New attributes will permit defining bot actions and state from existing functions and variables within your code."),(0,r.kt)("li",{parentName:"ul"},"CI/CD support - Instructions and examples will be added for running a Quality Assurance Bots in GitHub Actions.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/735d0569.d2da1b08.js b/assets/js/735d0569.d2da1b08.js deleted file mode 100644 index ad5d8ec4..00000000 --- a/assets/js/735d0569.d2da1b08.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[7445],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>c});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",m={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},k=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,l=e.originalType,s=e.parentName,p=o(e,["components","mdxType","originalType","parentName"]),d=u(a),k=r,c=d["".concat(s,".").concat(k)]||d[k]||m[k]||l;return a?n.createElement(c,i(i({ref:t},p),{},{components:a})):n.createElement(c,i({ref:t},p))}));function c(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var l=a.length,i=new Array(l);i[0]=k;var o={};for(var s in t)hasOwnProperty.call(t,s)&&(o[s]=t[s]);o.originalType=e,o[d]="string"==typeof e?e:r,i[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>l,metadata:()=>o,toc:()=>u});var n=a(7462),r=(a(7294),a(3905));const l={sidebar_label:"Changelog"},i="Changelog",o={unversionedId:"changelog",id:"changelog",title:"Changelog",description:"Release 0.0.27",source:"@site/docs/changelog.mdx",sourceDirName:".",slug:"/changelog",permalink:"/changelog",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Changelog"}},s={},u=[{value:"Release 0.0.27",id:"release-0027",level:2},{value:"Release 0.0.26",id:"release-0026",level:2},{value:"Release 0.0.25",id:"release-0025",level:2},{value:"Release 0.0.24",id:"release-0024",level:2},{value:"Release 0.0.23",id:"release-0023",level:2},{value:"Release 0.0.22",id:"release-0022",level:2},{value:"Release 0.0.21",id:"release-0021",level:2},{value:"Release 0.0.20",id:"release-0020",level:2},{value:"Release 0.0.19",id:"release-0019",level:2},{value:"Release 0.0.18",id:"release-0018",level:2},{value:"Release 0.0.17",id:"release-0017",level:2},{value:"Release 0.0.16",id:"release-0016",level:2},{value:"Release 0.0.15",id:"release-0015",level:2},{value:"Release 0.0.14",id:"release-0014",level:2},{value:"Release 0.0.13",id:"release-0013",level:2},{value:"Release 0.0.12",id:"release-0012",level:2},{value:"Release 0.0.11",id:"release-0011",level:2}],p={toc:u},d="wrapper";function m(e){let{components:t,...a}=e;return(0,r.kt)(d,(0,n.Z)({},p,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"changelog"},"Changelog"),(0,r.kt)("h2",{id:"release-0027"},"Release 0.0.27"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 9, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Validations can now be run against state contained within the root properties of a Game Object."),(0,r.kt)("li",{parentName:"ul"},"Game logs are now recorded and uploaded as part of a bot sequence run or recording (no UI available yet)."),(0,r.kt)("li",{parentName:"ul"},"Performance of data capture during gameplay recording has been improved, especially for ECS-based games."),(0,r.kt)("li",{parentName:"ul"},"Bug fix: Screenshots are now properly captured at the end of a frame.")),(0,r.kt)("h2",{id:"release-0026"},"Release 0.0.26"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"}," August 26, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Interleaved playback of recorded mouse and keyboard events has been improved"),(0,r.kt)("li",{parentName:"ul"},"Improved navigation layout on our website"),(0,r.kt)("li",{parentName:"ul"},"Bug fix: Scenario builder no longer shows duplicate step options"),(0,r.kt)("li",{parentName:"ul"},"Bug fix: Improvements to the display of the Validation Demo walkthrough"),(0,r.kt)("li",{parentName:"ul"},"Many experimental features added for an improved overlay experience, bot logic sequencing, and computer vision approaches... stay tuned!")),(0,r.kt)("h2",{id:"release-0025"},"Release 0.0.25"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"August 12, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Performance rules can be created to flag when a playthrough crosses certain FPS thresholds"),(0,r.kt)("li",{parentName:"ul"},"Performance information is collected more frequently during gameplay recording"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"New Bot"),' - An action analysis tool adds support for a "monkey bot" that can randomly interact with a game in an efficient manner'),(0,r.kt)("li",{parentName:"ul"},"Unity ECS data collection is now supported - validate state information from both ECS and GameObjects"),(0,r.kt)("li",{parentName:"ul"},"Improvements to various SDK error messages"),(0,r.kt)("li",{parentName:"ul"},"Better support for lower resolution screens")),(0,r.kt)("h2",{id:"release-0024"},"Release 0.0.24"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"This release deployment was skipped and kept internal")),(0,r.kt)("h2",{id:"release-0023"},"Release 0.0.23"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"July 1, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Try out our validation tool without an account or game! Visit ",(0,r.kt)("a",{parentName:"li",href:"http://play.regression.gg"},"play.regression.gg")," to learn more"),(0,r.kt)("li",{parentName:"ul"},"A tutorial is now available for our validation tool, built directly into the website"),(0,r.kt)("li",{parentName:"ul"},"The progress of a validation run is now displayed"),(0,r.kt)("li",{parentName:"ul"},"Scenarios can now be run from the demo scenario builder page")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Scenario validations now properly start from the start of a recording (the ordering of scenarios no longer matters)"),(0,r.kt)("li",{parentName:"ul"},"The validation results now shows the proper gameplay recording within the screenshot scrubber"),(0,r.kt)("li",{parentName:"ul"},"Improved performance of input recording within the SDK"),(0,r.kt)("li",{parentName:"ul"},"Long-running validation runs no longer timeout")),(0,r.kt)("h2",{id:"release-0022"},"Release 0.0.22"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"June 18, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The Unity SDK now supports recording games using the legacy input system and Unity UI."),(0,r.kt)("li",{parentName:"ul"},"New data collection format for improved state display within the scenario builder and validation results page."),(0,r.kt)("li",{parentName:"ul"},"New Bot Segment data format for stitching together various bot types, such as monkey testing bots combined with recordings."),(0,r.kt)("li",{parentName:"ul"},"Bounding boxes show entity locations within the gameplay session web UI for improved debugging.")),(0,r.kt)("h2",{id:"release-0021"},"Release 0.0.21"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"June 6, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New SDK Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Recordings can now be used programmatically in Unity Test Runner."),(0,r.kt)("li",{parentName:"ul"},"Inputs handled via ",(0,r.kt)("inlineCode",{parentName:"li"},"Input.GetKey()")," can now be captured and used in replays."),(0,r.kt)("li",{parentName:"ul"},"An animation rigging package is now available within the Unity SDK for data capturing.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"SDK Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improvements to error messages for recording playback.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Website Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Prevent breakage when storing null or undefined in a Store Step."),(0,r.kt)("li",{parentName:"ul"},"Adjusted height for the recording thumbnail in suite details.")),(0,r.kt)("h2",{id:"release-0020"},"Release 0.0.20"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"May 23rd, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Memory and CPU information is now captured by gameplay session recording."),(0,r.kt)("li",{parentName:"ul"},"The in-game overlay has an improved layout."),(0,r.kt)("li",{parentName:"ul"},"Gameplay session recordings can now be looped for repeated testing.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Quickscope ",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Null count values are now allowed for scenario steps that have an optional count."),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where duplicate scenario names were allowed in a suite."),(0,r.kt)("li",{parentName:"ul"},"Scenarios now maintain their creation order."),(0,r.kt)("li",{parentName:"ul"},"Improved loading of screenshots for a gameplay session.")))),(0,r.kt)("h2",{id:"release-0019"},"Release 0.0.19"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"May 8th, 2024")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("strong",{parentName:"li"},"Quickscope"),", a new collection of features made for easy smoke test automation!",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"New features within the SDK for recording a gameplay session and playing it back as an automated test"),(0,r.kt)("li",{parentName:"ul"},"A UI for designing functional validation tests from data automatically scraped from your game.")))),(0,r.kt)("p",null,"Learn more about this release in our ",(0,r.kt)("a",{parentName:"p",href:"https://www.regression.gg/post/quickscope-launch?ref=docs.regression.gg"},"blog post!"),"."),(0,r.kt)("h2",{id:"release-0018"},"Release 0.0.18"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"April 8th, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The new UI/UX is now available to all users."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("em",{parentName:"li"},"Be on the lookout for a large release at the beginning of May!"))),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where Agent Builder would use incorrect paths for certain operation systems."),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where certain redirects were not working on the website.")),(0,r.kt)("h2",{id:"release-0017"},"Release 0.0.17"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"February 29, 2024")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Introducing an ",(0,r.kt)("a",{parentName:"li",href:"/automated-testing/overview"},"automated UI testing framework for Unity")),(0,r.kt)("li",{parentName:"ul"},"An entirely new way of ","[representing states]"," requiring less custom integration"),(0,r.kt)("li",{parentName:"ul"},"[Rolling Out]"," New UI design - send us a message for access!")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The SDK is still only usable in the editor, but will no longer interfere with creating production builds. Future support for running the SDK in production builds will be coming at a later date."),(0,r.kt)("li",{parentName:"ul"},"Various UI improvements, such as screen size scaling and link fixes")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Other Notes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Improved scalability of the bot instance history dashboard")),(0,r.kt)("h2",{id:"release-0016"},"Release 0.0.16"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"December 19, 2023")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Our new ",(0,r.kt)("a",{parentName:"li",href:"/quickstart"},"quickstart guide")," allows you to have your first bot running in minutes"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"[RGState]")," is now allowed on class properties"),(0,r.kt)("li",{parentName:"ul"},"Support for raw key press actions using the new Unity Input System, which works great for certain types of bots"),(0,r.kt)("li",{parentName:"ul"},"Code generation time has been reduced, and is now automatic"),(0,r.kt)("li",{parentName:"ul"},"Default tick rate for bots is now faster"),(0,r.kt)("li",{parentName:"ul"},"Logs from local bots are now uploaded and saved for debugging"),(0,r.kt)("li",{parentName:"ul"},"Local bots can now be saved onto your Regression Games account"),(0,r.kt)("li",{parentName:"ul"},"The current tick number can now be accessed by local bots")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed bug where the username and password would not change within the SDK settings"),(0,r.kt)("li",{parentName:"ul"},"Bot loading reliability has been improved"),(0,r.kt)("li",{parentName:"ul"},"Better save settings around login passwords"),(0,r.kt)("li",{parentName:"ul"},"Stack traces from bots are now clickable and more usable within the Unity console"),(0,r.kt)("li",{parentName:"ul"},"Improved / reduced OOM issues with bot replay data")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Other Notes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Our SSL certs have been updated - make sure to update your SDK to use these new settings")),(0,r.kt)("h2",{id:"release-0015"},"Release 0.0.15"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"November 21, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview, and it's ",(0,r.kt)("strong",{parentName:"p"},"our biggest release yet!")," Our product is in beta and we would love for developers to\ntry it out and provide feedback! Contact us at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New welcome screen added to the SDK, with docs and ",(0,r.kt)("strong",{parentName:"li"},"sample scene/bot")," options"),(0,r.kt)("li",{parentName:"ul"},"Introducing C# bots that run ",(0,r.kt)("strong",{parentName:"li"},"directly in Unity")," (reference materials ",(0,r.kt)("a",{parentName:"li",href:"creating-bots/csharp/adaptive-bots"},"here"),")"),(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("a",{parentName:"li",href:"pre-made-bots"},(0,r.kt)("strong",{parentName:"a"},"Bot Marketplace"))," (Beta), which provides ready-to-go bots and integration instructions for those bots"),(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("strong",{parentName:"li"},"Validation Dashboard")," (Beta), which provides an interface to view validation runs for a bot, complete with screenshots, state information, and historical records of previous runs"),(0,r.kt)("li",{parentName:"ul"},"Introducing ",(0,r.kt)("a",{parentName:"li",href:"creating-bots/csharp/agent-builder"},(0,r.kt)("strong",{parentName:"a"},"Agent Builder"))," (Beta), which provides a fast, low-code way to develop bots"),(0,r.kt)("li",{parentName:"ul"},"Improved debug utilities like RGGizmos to see what your bot is thinking"),(0,r.kt)("li",{parentName:"ul"},"Bots can now be directly synced into your Unity projects"),(0,r.kt)("li",{parentName:"ul"},"New tutorials and guides for getting started")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"General Improvements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New homepage dashboard for game developers, showing the latest runs, bots, and guides"),(0,r.kt)("li",{parentName:"ul"},"Agent Builder now supports and uses zip file bots by default"),(0,r.kt)("li",{parentName:"ul"},"New RGState, RGAction, and RGEntity features for integrating the SDK into your game"),(0,r.kt)("li",{parentName:"ul"},"Site has been updated to remove most tournament information and instead focuses on bots for studios")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed an issue where nullable types were not properly generated for RGActions"),(0,r.kt)("li",{parentName:"ul"},"Fixed a code generation bug in Firefox"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where local unity bots could not utilize action formats properly")),(0,r.kt)("h2",{id:"release-0014"},"Release 0.0.14"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"October 10, 2023")," "),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Platform Improvements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Added better support for choosing between various languages and bot-building tools when creating bots")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed bug with updating bots that are managed via a zip file"),(0,r.kt)("li",{parentName:"ul"},"Fixed bug where logs for bots would display duplicated lines"),(0,r.kt)("li",{parentName:"ul"},"Fixed issue with default settings for the Getting Started sample")),(0,r.kt)("h2",{id:"release-0013"},"Release 0.0.13"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 25, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New RGState attribute in our Unity SDK can be used to seamlessly communicate state information to your bots"),(0,r.kt)("li",{parentName:"ul"},"Agent validation results are now sent to the Unity SDK and properly cause QA tests to fail if a validation has failed"),(0,r.kt)("li",{parentName:"ul"},"The connection status of bots are now shown within the Unity SDK Overlay")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Platform Improvements")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Logs in the Unity SDK have been sanitized to omit sensitive information"),(0,r.kt)("li",{parentName:"ul"},"New AIEngine service is available to make instant bots more stable and scalable"),(0,r.kt)("li",{parentName:"ul"},"The start time of current and historical bot runs is now visible within the Running Bots dashboard")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Users no longer need a GitHub account to create and use Zip bots"),(0,r.kt)("li",{parentName:"ul"},"Fixed an issue where match logs would be retrieved from an incorrect starting index"),(0,r.kt)("li",{parentName:"ul"},"Fixed a client bug where documentation would not open from the Running Bots dashboard"),(0,r.kt)("li",{parentName:"ul"},"Fixed an issue where Zip bots would not properly start or reload")),(0,r.kt)("h2",{id:"release-0012"},"Release 0.0.12"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"September 11, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Platform Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New ","[RGAction attribute]"," within RG Unity SDK to make actions easier to define"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"tutorials/github-actions"},"GitHub Actions and Unity Test Runner Support")," - New samples and guides for running bots\nin GitHub Actions (and other CI/CD systems via ",(0,r.kt)("a",{parentName:"li",href:"https://game.ci"},"GameCI"),")"),(0,r.kt)("li",{parentName:"ul"},"UI improvements to Behavior Tree Beta"),(0,r.kt)("li",{parentName:"ul"},"Updated defaults for RG Unity SDK to be more user-friendly"),(0,r.kt)("li",{parentName:"ul"},"The RG Unity SDK now includes its own font assets for better interoperability"),(0,r.kt)("li",{parentName:"ul"},"Links to download Zip bots from dashboard are now available")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed issue where the website would freeze in some match loading scenarios"),(0,r.kt)("li",{parentName:"ul"},"Fixed broken links in documentation"),(0,r.kt)("li",{parentName:"ul"},"Fixed issue where Agent Builder code generation would flicker"),(0,r.kt)("li",{parentName:"ul"},"Fixed bug where Unity actions would sometimes be sent to the wrong bots"),(0,r.kt)("li",{parentName:"ul"},"Fixed bug where instant bots would not start when the user did not have a linked GitHub account")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Security fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed bug where lobby APIs would reveal email addresses")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Coming Soon")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Continued improvements and additions to the Unity attribute system"),(0,r.kt)("li",{parentName:"ul"},"Additional samples and guides for various use cases"),(0,r.kt)("li",{parentName:"ul"},"New features for the Agent Builder tool")),(0,r.kt)("h2",{id:"release-0011"},"Release 0.0.11"),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"August 28, 2023")),(0,r.kt)("admonition",{type:"info"},(0,r.kt)("p",{parentName:"admonition"},"This version is a release preview. Our product is in beta and we would love for developers to try it out and provide feedback! Contact\nus at ",(0,r.kt)("a",{parentName:"p",href:"mailto:info@regression.gg"},"info@regression.gg")," for dedicated support and access.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"New Platform Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"404"},"Agent Builder")," Beta - Our GPT-enabled agent builder product is live for select players, now with improved validation tools. If you","'","d like to try it out, let us know!"),(0,r.kt)("li",{parentName:"ul"},"Our documentation site is now live! This docs site includes API/SDK references, tutorials, guides, and FAQs for both players and developers."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"authenticating-with-api-keys"},"API Keys")," - developers and players can now create API keys to interact with RG services"),(0,r.kt)("li",{parentName:"ul"},"New onboarding flow for players and game developers"),(0,r.kt)("li",{parentName:"ul"},"The ID of a bot can now be seen and copied within the Bot Manager"),(0,r.kt)("li",{parentName:"ul"},"Zip Bots - Bots uploaded via zip can now be downloaded"),(0,r.kt)("li",{parentName:"ul"},"The home page has been redesigned to provide players more information about getting started.")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Unity SDK Features")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"An early preview of our ",(0,r.kt)("a",{parentName:"li",href:"overview"},"Unity SDK")," for building AI agents is now live! Our docs site has a getting started guide - message us for access."),(0,r.kt)("li",{parentName:"ul"},"Developers can now create Unity bots from the Bot Manager"),(0,r.kt)("li",{parentName:"ul"},"Logs for bots can now be downloaded - available via API or through the ",(0,r.kt)("a",{parentName:"li",href:"session-insights/in-editor-replay"},"Bot History dashboard")),(0,r.kt)("li",{parentName:"ul"},"Character configuration for Unity bots is more flexible and customizable"),(0,r.kt)("li",{parentName:"ul"},"Validation results for QA testing bots are now saved to Unity Replay files, allowing for viewing the validation directly within Unity"),(0,r.kt)("li",{parentName:"ul"},"Default settings for the SDK have been adjusted for increased ease of use"),(0,r.kt)("li",{parentName:"ul"},"Added a \u201cStop All\u201d button for stopping bots from within the Unity game")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Bug Fixes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fixed issue where choosing a bot repository via commit would throw an error"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where bot logs would not show the correct number of lines before clearing"),(0,r.kt)("li",{parentName:"ul"},"Fixed issues where Unity bots would not teardown properly"),(0,r.kt)("li",{parentName:"ul"},"Fixed a bug where login and registration would sometimes fail"),(0,r.kt)("li",{parentName:"ul"},"Feedback button has been moved to a better spot on the screen to avoid hiding other components"),(0,r.kt)("li",{parentName:"ul"},"Fixed issue with SSL certs on certain systems")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Migration Notes")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"For Unity developers: the namespace for various classes in the Unity SDK have been updated. Please make sure to add the following import declaration\nin your files that use classes from Regression Games.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-csharp"},"using RegressionGames;\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Coming Soon")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"New attribute-based system for Unity SDK integration. New attributes will permit defining bot actions and state from existing functions and variables within your code."),(0,r.kt)("li",{parentName:"ul"},"CI/CD support - Instructions and examples will be added for running a Quality Assurance Bots in GitHub Actions.")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/74876495.4b1a4773.js b/assets/js/74876495.7da9c602.js similarity index 59% rename from assets/js/74876495.4b1a4773.js rename to assets/js/74876495.7da9c602.js index be087ce5..022d6eaf 100644 --- a/assets/js/74876495.4b1a4773.js +++ b/assets/js/74876495.7da9c602.js @@ -1 +1 @@ -"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[5049],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>h});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),m=o,h=u["".concat(l,".").concat(m)]||u[m]||d[m]||r;return n?a.createElement(h,s(s({ref:t},c),{},{components:n})):a.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=m;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const r={sidebar_label:"Quickstart"},s="Quickstart - Sample Scene and Bot",i={unversionedId:"quickstart",id:"quickstart",title:"Quickstart - Sample Scene and Bot",description:"_Time to complete: 10 minutes_",source:"@site/docs/quickstart.mdx",sourceDirName:".",slug:"/quickstart",permalink:"/quickstart",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Quickstart"}},l={},p=[{value:"Step 1: Create or open a 3D URP scene",id:"step-1-create-or-open-a-3d-urp-scene",level:2},{value:"Step 2: Import the Regression Games Unity Bots SDK",id:"step-2-import-the-regression-games-unity-bots-sdk",level:2},{value:"Step 3: Login (optional) and load the scene",id:"step-3-login-optional-and-load-the-scene",level:2},{value:"Step 4: Run the bot!",id:"step-4-run-the-bot",level:2},{value:"Next steps",id:"next-steps",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"quickstart---sample-scene-and-bot"},"Quickstart - Sample Scene and Bot"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Time to complete: 10 minutes"))),(0,o.kt)("p",null,"This quick walk-through will show you an example scene and bot using the Regression Games Unity SDK. Within a few minutes,\nyou will have your first bot running in Unity!"),(0,o.kt)("h2",{id:"step-1-create-or-open-a-3d-urp-scene"},"Step 1: Create or open a 3D URP scene"),(0,o.kt)("p",null,"To try out the sample scene, you will need to open or create a project that uses Unity's Universal Render Pipeline (URP).\nWithin your Unity Hub, search for a template called ",(0,o.kt)("strong",{parentName:"p"},"3D (URP)"),", download it if you haven't already, and create a new\nproject from that template."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Create a new project from the 3D URP template",src:n(1741).Z,width:"2024",height:"1180"})),(0,o.kt)("h2",{id:"step-2-import-the-regression-games-unity-bots-sdk"},"Step 2: Import the Regression Games Unity Bots SDK"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/Regression-Games/RGUnityBots"},"Our package is available via GitHub"),". Import the repository by\nclicking ",(0,o.kt)("strong",{parentName:"p"},"Add package from git URL")," in the ",(0,o.kt)("strong",{parentName:"p"},"Package Manager")," window (this window can be opened\nin the ",(0,o.kt)("strong",{parentName:"p"},"Window > Package Manager")," menu) and pasting in the following URL."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.27\n")),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Note that this package uses the new Unity Input System, and will likely ask you to restart the editor - ",(0,o.kt)("strong",{parentName:"li"},"please select yes to restart"),"."),(0,o.kt)("li",{parentName:"ul"},"Note that this package utilizes TextMeshPro. If you are prompted by Unity to add TextMeshPro assets to your project, please add them."),(0,o.kt)("li",{parentName:"ul"},"Note that this package installs a dependency of ",(0,o.kt)("a",{parentName:"li",href:"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"},"Newtonsoft Json")," for serializing/deserializing Json message payloads."),(0,o.kt)("li",{parentName:"ul"},"If your game utilizes Unity's ECS, we now have an extension package available to support it. Install this package after installing the core RGUnityBots package:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots/tree/main/src/gg.regression.unity.bots.ecs#v0.0.27\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the package imported into the project",src:n(2839).Z,width:"2608",height:"736"})),(0,o.kt)("h2",{id:"step-3-login-optional-and-load-the-scene"},"Step 3: Login (optional) and load the scene"),(0,o.kt)("p",null,"Once the package is imported, a welcome pane will open with the ability to login to Regression Games. Create\nan account to sync your bot and get access to other ",(0,o.kt)("a",{parentName:"p",href:"pre-made-bots"},"ready-to-go bots")," and our\n",(0,o.kt)("a",{parentName:"p",href:"creating-bots/csharp/agent-builder"},"Agent Builder tool"),", or skip the login (you can access this later from the\n",(0,o.kt)("strong",{parentName:"p"},"Regression Games")," > ",(0,o.kt)("strong",{parentName:"p"},"Getting Started")," menu)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the welcome pane",src:n(3136).Z,width:"1568",height:"1480"})),(0,o.kt)("p",null,"Once you click continue, you will see a screen that links to documentation and has an option to load a sample scene. Click\nthat button, which will import the sample scene into a new folder within your Assets directory. Once imported, the scene\nwill automatically open!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the welcome pane",src:n(3342).Z,width:"1564",height:"1576"})),(0,o.kt)("h2",{id:"step-4-run-the-bot"},"Step 4: Run the bot!"),(0,o.kt)("p",null,'Once the scene is open, run the scene by clicking play. Once running, click the Regression Games logo in the bottom right,\nand click "Start Bot" button to start the ',(0,o.kt)("inlineCode",{parentName:"p"},"QuickstartBot")," that is provided with the scene."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the welcome pane",src:n(4292).Z,width:"1978",height:"1004"})),(0,o.kt)("p",null,"You should see the bot move around the platform and attack the enemy!"),(0,o.kt)("div",{style:{position:"relative",paddingBottom:"50.40485829959515%",height:0}},(0,o.kt)("iframe",{src:"https://www.loom.com/embed/c4a31389df6742ba9320bf7dc0e91739?sid=336eaf3b-208c-4ea3-a0b3-c6ad3d2d2cee",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})),(0,o.kt)("h2",{id:"next-steps"},"Next steps"),(0,o.kt)("p",null,"Now that you see a bot in action, you can start building your own! In the next tutorial, you will learn more about the\nintegration patterns and approaches to building bots in Unity using the Regression Games Unity Bots SDK."))}d.isMDXComponent=!0},4292:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/overlay-0040d4f292eaacfba15a56c49870009b.png"},3136:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/signin-78e5d0b29f4546a2b1961355c05ef6b9.png"},1741:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/urp-e326136087f444fbfb2da78da73a623d.png"},3342:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/welcome-a15de99713e35e0ec54740015a688a5f.png"},2839:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tutorial-1-package-0d2bfbaccdb409a6013aa1de51012636.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[5049],{3905:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var a=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},u="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},h=a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,m=u["".concat(l,".").concat(h)]||u[h]||d[h]||r;return n?a.createElement(m,s(s({ref:t},c),{},{components:n})):a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,s=new Array(r);s[0]=h;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i[u]="string"==typeof e?e:o,s[1]=i;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>p});var a=n(7462),o=(n(7294),n(3905));const r={sidebar_label:"Quickstart"},s="Quickstart - Sample Scene and Bot",i={unversionedId:"quickstart",id:"quickstart",title:"Quickstart - Sample Scene and Bot",description:"_Time to complete: 10 minutes_",source:"@site/docs/quickstart.mdx",sourceDirName:".",slug:"/quickstart",permalink:"/quickstart",draft:!1,tags:[],version:"current",frontMatter:{sidebar_label:"Quickstart"}},l={},p=[{value:"Step 1: Create or open a 3D URP scene",id:"step-1-create-or-open-a-3d-urp-scene",level:2},{value:"Step 2: Import the Regression Games Unity Bots SDK",id:"step-2-import-the-regression-games-unity-bots-sdk",level:2},{value:"Step 3: Login (optional) and load the scene",id:"step-3-login-optional-and-load-the-scene",level:2},{value:"Step 4: Run the bot!",id:"step-4-run-the-bot",level:2},{value:"Next steps",id:"next-steps",level:2}],c={toc:p},u="wrapper";function d(e){let{components:t,...r}=e;return(0,o.kt)(u,(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"quickstart---sample-scene-and-bot"},"Quickstart - Sample Scene and Bot"),(0,o.kt)("p",null,(0,o.kt)("strong",{parentName:"p"},(0,o.kt)("em",{parentName:"strong"},"Time to complete: 10 minutes"))),(0,o.kt)("p",null,"This quick walk-through will show you an example scene and bot using the Regression Games Unity SDK. Within a few minutes,\nyou will have your first bot running in Unity!"),(0,o.kt)("h2",{id:"step-1-create-or-open-a-3d-urp-scene"},"Step 1: Create or open a 3D URP scene"),(0,o.kt)("p",null,"To try out the sample scene, you will need to open or create a project that uses Unity's Universal Render Pipeline (URP).\nWithin your Unity Hub, search for a template called ",(0,o.kt)("strong",{parentName:"p"},"3D (URP)"),", download it if you haven't already, and create a new\nproject from that template."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Create a new project from the 3D URP template",src:n(1741).Z,width:"2024",height:"1180"})),(0,o.kt)("h2",{id:"step-2-import-the-regression-games-unity-bots-sdk"},"Step 2: Import the Regression Games Unity Bots SDK"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://github.com/Regression-Games/RGUnityBots"},"Our package is available via GitHub"),". Import the repository by\nclicking ",(0,o.kt)("strong",{parentName:"p"},"Add package from git URL")," in the ",(0,o.kt)("strong",{parentName:"p"},"Package Manager")," window (this window can be opened\nin the ",(0,o.kt)("strong",{parentName:"p"},"Window > Package Manager")," menu) and pasting in the following URL."),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots#v0.0.28\n")),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Note that this package uses the new Unity Input System, and will likely ask you to restart the editor - ",(0,o.kt)("strong",{parentName:"li"},"please select yes to restart"),"."),(0,o.kt)("li",{parentName:"ul"},"Note that this package utilizes TextMeshPro. If you are prompted by Unity to add TextMeshPro assets to your project, please add them."),(0,o.kt)("li",{parentName:"ul"},"Note that this package installs a dependency of ",(0,o.kt)("a",{parentName:"li",href:"https://docs.unity3d.com/Packages/com.unity.nuget.newtonsoft-json@3.1/manual/index.html"},"Newtonsoft Json")," for serializing/deserializing Json message payloads."),(0,o.kt)("li",{parentName:"ul"},"If your game utilizes Unity's ECS, we now have an extension package available to support it. Install this package after installing the core RGUnityBots package:")),(0,o.kt)("pre",null,(0,o.kt)("code",{parentName:"pre"},"https://github.com/Regression-Games/RGUnityBots.git?path=src/gg.regression.unity.bots.ecs#v0.0.28\n")),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the package imported into the project",src:n(2839).Z,width:"2608",height:"736"})),(0,o.kt)("h2",{id:"step-3-login-optional-and-load-the-scene"},"Step 3: Login (optional) and load the scene"),(0,o.kt)("p",null,"Once the package is imported, a welcome pane will open with the ability to login to Regression Games. Create\nan account to sync your bot and get access to other ",(0,o.kt)("a",{parentName:"p",href:"pre-made-bots"},"ready-to-go bots")," and our\n",(0,o.kt)("a",{parentName:"p",href:"creating-bots/csharp/agent-builder"},"Agent Builder tool"),", or skip the login (you can access this later from the\n",(0,o.kt)("strong",{parentName:"p"},"Regression Games")," > ",(0,o.kt)("strong",{parentName:"p"},"Getting Started")," menu)."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the welcome pane",src:n(3136).Z,width:"1568",height:"1480"})),(0,o.kt)("p",null,"Once you click continue, you will see a screen that links to documentation and has an option to load a sample scene. Click\nthat button, which will import the sample scene into a new folder within your Assets directory. Once imported, the scene\nwill automatically open!"),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the welcome pane",src:n(3342).Z,width:"1564",height:"1576"})),(0,o.kt)("h2",{id:"step-4-run-the-bot"},"Step 4: Run the bot!"),(0,o.kt)("p",null,'Once the scene is open, run the scene by clicking play. Once running, click the Regression Games logo in the bottom right,\nand click "Start Bot" button to start the ',(0,o.kt)("inlineCode",{parentName:"p"},"QuickstartBot")," that is provided with the scene."),(0,o.kt)("p",null,(0,o.kt)("img",{alt:"Screenshot of the welcome pane",src:n(4292).Z,width:"1978",height:"1004"})),(0,o.kt)("p",null,"You should see the bot move around the platform and attack the enemy!"),(0,o.kt)("div",{style:{position:"relative",paddingBottom:"50.40485829959515%",height:0}},(0,o.kt)("iframe",{src:"https://www.loom.com/embed/c4a31389df6742ba9320bf7dc0e91739?sid=336eaf3b-208c-4ea3-a0b3-c6ad3d2d2cee",frameborder:"0",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:!0,style:{position:"absolute",top:0,left:0,width:"100%",height:"100%"}})),(0,o.kt)("h2",{id:"next-steps"},"Next steps"),(0,o.kt)("p",null,"Now that you see a bot in action, you can start building your own! In the next tutorial, you will learn more about the\nintegration patterns and approaches to building bots in Unity using the Regression Games Unity Bots SDK."))}d.isMDXComponent=!0},4292:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/overlay-0040d4f292eaacfba15a56c49870009b.png"},3136:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/signin-78e5d0b29f4546a2b1961355c05ef6b9.png"},1741:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/urp-e326136087f444fbfb2da78da73a623d.png"},3342:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/welcome-a15de99713e35e0ec54740015a688a5f.png"},2839:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/tutorial-1-package-0d2bfbaccdb409a6013aa1de51012636.png"}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.f0c270bf.js b/assets/js/935f2afb.609ede5f.js similarity index 99% rename from assets/js/935f2afb.f0c270bf.js rename to assets/js/935f2afb.609ede5f.js index bf4af6b4..f28a0a10 100644 --- a/assets/js/935f2afb.f0c270bf.js +++ b/assets/js/935f2afb.609ede5f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"unitySidebar":[{"type":"link","label":"Writing Your First Automated Test","href":"/tutorials/building-your-first-bot","docId":"tutorials/building-your-first-bot"},{"type":"category","label":"Gameplay Sessions","items":[{"type":"link","label":"Getting Started with Gameplay Sessions","href":"/gameplay-sessions/gameplay-sessions-getting-started","docId":"gameplay-sessions/gameplay-sessions-getting-started"},{"type":"link","label":"Using Gameplay Sessions","href":"/gameplay-sessions/gameplay-sessions-usage","docId":"gameplay-sessions/gameplay-sessions-usage"},{"type":"link","label":"Gameplay Sessions Technical Reference","href":"/gameplay-sessions/gameplay-sessions-reference","docId":"gameplay-sessions/gameplay-sessions-reference"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Validations","items":[{"type":"link","label":"Getting Started with Validations","href":"/validations/validations-getting-started","docId":"validations/validations-getting-started"},{"type":"link","label":"Scenario Builder Reference","href":"/validations/validations-scenario-builder-reference","docId":"validations/validations-scenario-builder-reference"},{"type":"link","label":"Rules Reference","href":"/validations/validations-rules-reference","docId":"validations/validations-rules-reference"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Authenticating with API Keys","href":"/authenticating-with-api-keys","docId":"authenticating-with-api-keys"},{"type":"category","label":"Generic Bots","items":[{"type":"link","label":"Monkey Bot","href":"/generic-bots/monkey-bot","docId":"generic-bots/monkey-bot"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Custom Bots","items":[{"type":"link","label":"Adaptive Bots","href":"/creating-bots/csharp/adaptive-bots","docId":"creating-bots/csharp/adaptive-bots"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Computer Vision","items":[{"type":"link","label":"Overview","href":"/computer-vision/","docId":"computer-vision/computer-vision"},{"type":"link","label":"CVImage Docs","href":"/computer-vision/image-match","docId":"computer-vision/image-match"},{"type":"link","label":"CVText Docs","href":"/computer-vision/text-match","docId":"computer-vision/text-match"},{"type":"link","label":"Object Detection Docs","href":"/computer-vision/object-detection","docId":"computer-vision/object-detection"}],"collapsed":true,"collapsible":true}],"automatedTesting":[{"type":"link","label":"Overview","href":"/automated-testing/overview","docId":"automated-testing/overview"},{"type":"link","label":"Getting Started","href":"/automated-testing/getting-started","docId":"automated-testing/getting-started"},{"type":"link","label":"GPT Assistant Bot","href":"/automated-testing/gpt-assistant-bot","docId":"automated-testing/gpt-assistant-bot"},{"type":"link","label":"Custom Bots and Discoverers","href":"/automated-testing/creating-custom-components","docId":"automated-testing/creating-custom-components"}]},"docs":{"404":{"id":"404","title":"Page Not Found","description":"This page no longer exists. It may have moved, or its content is no longer supported by Regression Games."},"authenticating-with-api-keys":{"id":"authenticating-with-api-keys","title":"Authenticating with API Keys","description":"The Regression Games platform provides the ability to generate API keys, which can be used","sidebar":"unitySidebar"},"automated-testing/creating-custom-components":{"id":"automated-testing/creating-custom-components","title":"Custom Bots and Discoverers","description":"If the built-in Bot and Discoverer components aren\'t sufficient for your testing needs, you can also create your own with just a few steps and some code.","sidebar":"automatedTesting"},"automated-testing/getting-started":{"id":"automated-testing/getting-started","title":"Getting Started with Automated UI Testing","description":"The Automated UI Testing package is currently a preview and we\'re looking for your feedback!","sidebar":"automatedTesting"},"automated-testing/gpt-assistant-bot":{"id":"automated-testing/gpt-assistant-bot","title":"Using the GPT Assistant Bot","description":"In addition to the completely random \\"Monkey\\" Bot, the RegressionGames Automated UI Testing package includes a \\"GPT Assistant\\" Bot that uses OpenAI\'s GPT-4 Large Language Model to drive a bot in your game.","sidebar":"automatedTesting"},"automated-testing/overview":{"id":"automated-testing/overview","title":"Automated UI Testing for Unity","description":"The Automated UI Testing package is currently a preview and we\'re looking for your feedback!","sidebar":"automatedTesting"},"changelog":{"id":"changelog","title":"Changelog","description":"Release 0.0.27"},"computer-vision/computer-vision":{"id":"computer-vision/computer-vision","title":"Computer Vision","description":"Our Computer Vision module provides powerful tools to interact with and validate visual elements in your application or game. This functionality is crucial for automated testing, user interface verification, and interactive simulations.","sidebar":"unitySidebar"},"computer-vision/image-match":{"id":"computer-vision/image-match","title":"CVImage Docs","description":"","sidebar":"unitySidebar"},"computer-vision/object-detection":{"id":"computer-vision/object-detection","title":"Object Detection Docs","description":"","sidebar":"unitySidebar"},"computer-vision/text-match":{"id":"computer-vision/text-match","title":"CVText Docs","description":"","sidebar":"unitySidebar"},"creating-bots/csharp/adaptive-bots":{"id":"creating-bots/csharp/adaptive-bots","title":"Defining Bots that Adapt to the Game State","description":"Defining a Unity Bot in C# is as simple as creating a MonoBehaviour that implements the IRGBot interface.","sidebar":"unitySidebar"},"creating-bots/csharp/agent-builder":{"id":"creating-bots/csharp/agent-builder","title":"Creating AIs Using the Agent Builder","description":"Regression Games\' Agent Builder is an easy-to-use visual editor for constructing AI behavior trees."},"gameplay-sessions/gameplay-sessions-getting-started":{"id":"gameplay-sessions/gameplay-sessions-getting-started","title":"Gameplay Sessions","description":"A Gameplay Session is a recorded snippet of gameplay from your game.","sidebar":"unitySidebar"},"gameplay-sessions/gameplay-sessions-reference":{"id":"gameplay-sessions/gameplay-sessions-reference","title":"Gameplay Sessions Technical Reference","description":"Although developers on Regression Games will often interact with the Gameplay Sessions through the web interface or","sidebar":"unitySidebar"},"gameplay-sessions/gameplay-sessions-usage":{"id":"gameplay-sessions/gameplay-sessions-usage","title":"Using Gameplay Sessions","description":"Preparing the Overlay","sidebar":"unitySidebar"},"generic-bots/monkey-bot":{"id":"generic-bots/monkey-bot","title":"Monkey Bot","description":"Monkey Bot Image","sidebar":"unitySidebar"},"overview":{"id":"overview","title":"Regression Games for Unity","description":"Regression Games is developing a platform where studios can build and deploy bots for a variety of use cases in minutes. We are designing for scale (deploy thousands of bots), ease of use (e.g. generative AI to build bots), ease of integration (minimal impact on game development time), and feature richness (e.g. A/B bot test for engagement)."},"pre-made-bots":{"id":"pre-made-bots","title":"Bot Marketplace","description":"The Bot Marketplace is your one-stop-shop for ready-to-go bots. The Regression Games SDK allows you to build bots for"},"quickstart":{"id":"quickstart","title":"Quickstart - Sample Scene and Bot","description":"_Time to complete: 10 minutes_"},"session-insights/client-dashboard":{"id":"session-insights/client-dashboard","title":"Viewing Validations","description":"Validations are used to assert the state of your bots at a point in time. You can think of them as tests that can be run to"},"session-insights/in-editor-replay":{"id":"session-insights/in-editor-replay","title":"Replaying Bot Behaviors in the Unity Editor","description":"Bots running on Regression Games save all states observed, all actions sent, and all validations performed for each game tick. This data can be loaded in the Unity editor for visualization and playback in the scene. This feature, combined with our validation framework, allows you to find and debug specific errors within your game."},"tutorials/building-your-first-bot":{"id":"tutorials/building-your-first-bot","title":"Writing Your First Automated Test","description":"In this tutorial, we will get a simple automated test working in Unity using Regression Games. We will show you:","sidebar":"unitySidebar"},"tutorials/github-actions":{"id":"tutorials/github-actions","title":"Testing with GitHub Actions","description":"This tutorial will walk you through the following steps to create a QA Bot for your Unity project using"},"validations/validations-getting-started":{"id":"validations/validations-getting-started","title":"Validations","description":"Screenshot of a scenario","sidebar":"unitySidebar"},"validations/validations-rules-reference":{"id":"validations/validations-rules-reference","title":"Rules Reference","description":"Rules can be asserted when running a Validation Suite against a gameplay recording, to ensure that the recording meets specific criteria. We provide a set of rule types that can be used to construct assertions based on various performance metrics. For each tick in the gameplay recording, all Rules are evaluated. If a Rule is violated the Validation Run will display a warning for that Rule.","sidebar":"unitySidebar"},"validations/validations-scenario-builder-reference":{"id":"validations/validations-scenario-builder-reference","title":"Scenario Builder Reference","description":"Scenarios are composed of one or more steps that can be asserted throughout a gameplay recording. Steps are asserted in the order they appear in the Scenario, and if any step fails, the Scenario will fail.","sidebar":"unitySidebar"}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"unitySidebar":[{"type":"link","label":"Writing Your First Automated Test","href":"/tutorials/building-your-first-bot","docId":"tutorials/building-your-first-bot"},{"type":"category","label":"Gameplay Sessions","items":[{"type":"link","label":"Getting Started with Gameplay Sessions","href":"/gameplay-sessions/gameplay-sessions-getting-started","docId":"gameplay-sessions/gameplay-sessions-getting-started"},{"type":"link","label":"Using Gameplay Sessions","href":"/gameplay-sessions/gameplay-sessions-usage","docId":"gameplay-sessions/gameplay-sessions-usage"},{"type":"link","label":"Gameplay Sessions Technical Reference","href":"/gameplay-sessions/gameplay-sessions-reference","docId":"gameplay-sessions/gameplay-sessions-reference"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Validations","items":[{"type":"link","label":"Getting Started with Validations","href":"/validations/validations-getting-started","docId":"validations/validations-getting-started"},{"type":"link","label":"Scenario Builder Reference","href":"/validations/validations-scenario-builder-reference","docId":"validations/validations-scenario-builder-reference"},{"type":"link","label":"Rules Reference","href":"/validations/validations-rules-reference","docId":"validations/validations-rules-reference"}],"collapsed":true,"collapsible":true},{"type":"link","label":"Authenticating with API Keys","href":"/authenticating-with-api-keys","docId":"authenticating-with-api-keys"},{"type":"category","label":"Generic Bots","items":[{"type":"link","label":"Monkey Bot","href":"/generic-bots/monkey-bot","docId":"generic-bots/monkey-bot"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Custom Bots","items":[{"type":"link","label":"Adaptive Bots","href":"/creating-bots/csharp/adaptive-bots","docId":"creating-bots/csharp/adaptive-bots"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Computer Vision","items":[{"type":"link","label":"Overview","href":"/computer-vision/","docId":"computer-vision/computer-vision"},{"type":"link","label":"CVImage Docs","href":"/computer-vision/image-match","docId":"computer-vision/image-match"},{"type":"link","label":"CVText Docs","href":"/computer-vision/text-match","docId":"computer-vision/text-match"},{"type":"link","label":"Object Detection Docs","href":"/computer-vision/object-detection","docId":"computer-vision/object-detection"}],"collapsed":true,"collapsible":true}],"automatedTesting":[{"type":"link","label":"Overview","href":"/automated-testing/overview","docId":"automated-testing/overview"},{"type":"link","label":"Getting Started","href":"/automated-testing/getting-started","docId":"automated-testing/getting-started"},{"type":"link","label":"GPT Assistant Bot","href":"/automated-testing/gpt-assistant-bot","docId":"automated-testing/gpt-assistant-bot"},{"type":"link","label":"Custom Bots and Discoverers","href":"/automated-testing/creating-custom-components","docId":"automated-testing/creating-custom-components"}]},"docs":{"404":{"id":"404","title":"Page Not Found","description":"This page no longer exists. It may have moved, or its content is no longer supported by Regression Games."},"authenticating-with-api-keys":{"id":"authenticating-with-api-keys","title":"Authenticating with API Keys","description":"The Regression Games platform provides the ability to generate API keys, which can be used","sidebar":"unitySidebar"},"automated-testing/creating-custom-components":{"id":"automated-testing/creating-custom-components","title":"Custom Bots and Discoverers","description":"If the built-in Bot and Discoverer components aren\'t sufficient for your testing needs, you can also create your own with just a few steps and some code.","sidebar":"automatedTesting"},"automated-testing/getting-started":{"id":"automated-testing/getting-started","title":"Getting Started with Automated UI Testing","description":"The Automated UI Testing package is currently a preview and we\'re looking for your feedback!","sidebar":"automatedTesting"},"automated-testing/gpt-assistant-bot":{"id":"automated-testing/gpt-assistant-bot","title":"Using the GPT Assistant Bot","description":"In addition to the completely random \\"Monkey\\" Bot, the RegressionGames Automated UI Testing package includes a \\"GPT Assistant\\" Bot that uses OpenAI\'s GPT-4 Large Language Model to drive a bot in your game.","sidebar":"automatedTesting"},"automated-testing/overview":{"id":"automated-testing/overview","title":"Automated UI Testing for Unity","description":"The Automated UI Testing package is currently a preview and we\'re looking for your feedback!","sidebar":"automatedTesting"},"changelog":{"id":"changelog","title":"Changelog","description":"Release 0.0.28"},"computer-vision/computer-vision":{"id":"computer-vision/computer-vision","title":"Computer Vision","description":"Our Computer Vision module provides powerful tools to interact with and validate visual elements in your application or game. This functionality is crucial for automated testing, user interface verification, and interactive simulations.","sidebar":"unitySidebar"},"computer-vision/image-match":{"id":"computer-vision/image-match","title":"CVImage Docs","description":"","sidebar":"unitySidebar"},"computer-vision/object-detection":{"id":"computer-vision/object-detection","title":"Object Detection Docs","description":"","sidebar":"unitySidebar"},"computer-vision/text-match":{"id":"computer-vision/text-match","title":"CVText Docs","description":"","sidebar":"unitySidebar"},"creating-bots/csharp/adaptive-bots":{"id":"creating-bots/csharp/adaptive-bots","title":"Defining Bots that Adapt to the Game State","description":"Defining a Unity Bot in C# is as simple as creating a MonoBehaviour that implements the IRGBot interface.","sidebar":"unitySidebar"},"creating-bots/csharp/agent-builder":{"id":"creating-bots/csharp/agent-builder","title":"Creating AIs Using the Agent Builder","description":"Regression Games\' Agent Builder is an easy-to-use visual editor for constructing AI behavior trees."},"gameplay-sessions/gameplay-sessions-getting-started":{"id":"gameplay-sessions/gameplay-sessions-getting-started","title":"Gameplay Sessions","description":"A Gameplay Session is a recorded snippet of gameplay from your game.","sidebar":"unitySidebar"},"gameplay-sessions/gameplay-sessions-reference":{"id":"gameplay-sessions/gameplay-sessions-reference","title":"Gameplay Sessions Technical Reference","description":"Although developers on Regression Games will often interact with the Gameplay Sessions through the web interface or","sidebar":"unitySidebar"},"gameplay-sessions/gameplay-sessions-usage":{"id":"gameplay-sessions/gameplay-sessions-usage","title":"Using Gameplay Sessions","description":"Preparing the Overlay","sidebar":"unitySidebar"},"generic-bots/monkey-bot":{"id":"generic-bots/monkey-bot","title":"Monkey Bot","description":"Monkey Bot Image","sidebar":"unitySidebar"},"overview":{"id":"overview","title":"Regression Games for Unity","description":"Regression Games is developing a platform where studios can build and deploy bots for a variety of use cases in minutes. We are designing for scale (deploy thousands of bots), ease of use (e.g. generative AI to build bots), ease of integration (minimal impact on game development time), and feature richness (e.g. A/B bot test for engagement)."},"pre-made-bots":{"id":"pre-made-bots","title":"Bot Marketplace","description":"The Bot Marketplace is your one-stop-shop for ready-to-go bots. The Regression Games SDK allows you to build bots for"},"quickstart":{"id":"quickstart","title":"Quickstart - Sample Scene and Bot","description":"_Time to complete: 10 minutes_"},"session-insights/client-dashboard":{"id":"session-insights/client-dashboard","title":"Viewing Validations","description":"Validations are used to assert the state of your bots at a point in time. You can think of them as tests that can be run to"},"session-insights/in-editor-replay":{"id":"session-insights/in-editor-replay","title":"Replaying Bot Behaviors in the Unity Editor","description":"Bots running on Regression Games save all states observed, all actions sent, and all validations performed for each game tick. This data can be loaded in the Unity editor for visualization and playback in the scene. This feature, combined with our validation framework, allows you to find and debug specific errors within your game."},"tutorials/building-your-first-bot":{"id":"tutorials/building-your-first-bot","title":"Writing Your First Automated Test","description":"In this tutorial, we will get a simple automated test working in Unity using Regression Games. We will show you:","sidebar":"unitySidebar"},"tutorials/github-actions":{"id":"tutorials/github-actions","title":"Testing with GitHub Actions","description":"This tutorial will walk you through the following steps to create a QA Bot for your Unity project using"},"validations/validations-getting-started":{"id":"validations/validations-getting-started","title":"Validations","description":"Screenshot of a scenario","sidebar":"unitySidebar"},"validations/validations-rules-reference":{"id":"validations/validations-rules-reference","title":"Rules Reference","description":"Rules can be asserted when running a Validation Suite against a gameplay recording, to ensure that the recording meets specific criteria. We provide a set of rule types that can be used to construct assertions based on various performance metrics. For each tick in the gameplay recording, all Rules are evaluated. If a Rule is violated the Validation Run will display a warning for that Rule.","sidebar":"unitySidebar"},"validations/validations-scenario-builder-reference":{"id":"validations/validations-scenario-builder-reference","title":"Scenario Builder Reference","description":"Scenarios are composed of one or more steps that can be asserted throughout a gameplay recording. Steps are asserted in the order they appear in the Scenario, and if any step fails, the Scenario will fail.","sidebar":"unitySidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/main.95f684d1.js b/assets/js/main.7b9cd64a.js similarity index 99% rename from assets/js/main.95f684d1.js rename to assets/js/main.7b9cd64a.js index e174faff..9264d15f 100644 --- a/assets/js/main.95f684d1.js +++ b/assets/js/main.7b9cd64a.js @@ -1,2 +1,2 @@ -/*! For license information please see main.95f684d1.js.LICENSE.txt */ -(self.webpackChunkregression_docs=self.webpackChunkregression_docs||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"01a85c17":[()=>Promise.all([n.e(532),n.e(4013)]).then(n.bind(n,1223)),"@theme/BlogTagsListPage",1223],"031793e1":[()=>n.e(1633).then(n.t.bind(n,2511,19)),"~blog/default/blog-tags-facebook-038.json",2511],"04115efe":[()=>n.e(5792).then(n.bind(n,7360)),"@site/docs/tutorials/building-your-first-bot.mdx",7360],"096bfee4":[()=>n.e(7178).then(n.t.bind(n,5010,19)),"~blog/default/blog-tags-facebook-038-list.json",5010],"0a367c1a":[()=>n.e(8895).then(n.bind(n,5840)),"@site/docs/computer-vision/object-detection.mdx",5840],"0e5c35ea":[()=>n.e(3069).then(n.bind(n,359)),"@site/docs/computer-vision/text-match.mdx",359],"1359ca2f":[()=>n.e(7624).then(n.bind(n,2284)),"@site/docs/automated-testing/getting-started.mdx",2284],"13d931f8":[()=>n.e(1857).then(n.bind(n,526)),"@site/docs/generic-bots/monkey-bot.mdx",526],14407088:[()=>n.e(6163).then(n.t.bind(n,5745,19)),"/home/runner/work/RegressionDocs/RegressionDocs/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"148a37a4":[()=>n.e(7161).then(n.t.bind(n,4469,19)),"/home/runner/work/RegressionDocs/RegressionDocs/.docusaurus/docusaurus-plugin-content-blog/default/plugin-route-context-module-100.json",4469],17896441:[()=>Promise.all([n.e(532),n.e(1506),n.e(7918)]).then(n.bind(n,8945)),"@theme/DocItem",8945],"1970a410":[()=>n.e(6519).then(n.bind(n,9381)),"@site/docs/authenticating-with-api-keys.mdx",9381],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1db64337":[()=>n.e(1372).then(n.bind(n,6777)),"@site/docs/overview.md",6777],"1df93b7f":[()=>Promise.all([n.e(532),n.e(3237)]).then(n.bind(n,8391)),"@site/src/pages/index.tsx",8391],"1ee9a467":[()=>n.e(3197).then(n.bind(n,1053)),"@site/docs/computer-vision/image-match.mdx",1053],"1f391b9e":[()=>Promise.all([n.e(532),n.e(1506),n.e(3085)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"1fb3fb3e":[()=>n.e(2855).then(n.bind(n,7738)),"@site/docs/pre-made-bots.mdx",7738],"29cae6e4":[()=>n.e(6603).then(n.bind(n,7365)),"@site/docs/automated-testing/overview.md",7365],"2c33d6f6":[()=>n.e(1479).then(n.bind(n,2032)),"@site/docs/gameplay-sessions/gameplay-sessions-usage.mdx",2032],"2cd4476f":[()=>n.e(5065).then(n.bind(n,1517)),"@site/docs/validations/validations-getting-started.mdx",1517],"30a24c52":[()=>n.e(453).then(n.t.bind(n,8605,19)),"~blog/default/blog-tags-hello-039.json",8605],"393be207":[()=>n.e(7414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"39f90b1e":[()=>n.e(2808).then(n.bind(n,8030)),"@site/docs/session-insights/in-editor-replay.mdx",8030],"4c9e35b1":[()=>n.e(9035).then(n.t.bind(n,499,19)),"~blog/default/blog-tags-hola-ea2-list.json",499],"56604baf":[()=>n.e(6834).then(n.bind(n,3292)),"@site/docs/automated-testing/gpt-assistant-bot.mdx",3292],59362658:[()=>n.e(2267).then(n.bind(n,8642)),"@site/blog/2021-08-01-mdx-blog-post.mdx",8642],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"608ae6a4":[()=>n.e(6938).then(n.t.bind(n,4545,19)),"~blog/default/blog-tags-docusaurus-0e0-list.json",4545],66406991:[()=>n.e(110).then(n.t.bind(n,711,19)),"~blog/default/blog-tags-hello-039-list.json",711],"6806b5bc":[()=>n.e(5130).then(n.bind(n,7586)),"@site/docs/creating-bots/csharp/agent-builder.mdx",7586],"6875c492":[()=>Promise.all([n.e(532),n.e(1506),n.e(2529),n.e(8610)]).then(n.bind(n,1714)),"@theme/BlogTagsPostsPage",1714],"735d0569":[()=>n.e(7445).then(n.bind(n,997)),"@site/docs/changelog.mdx",997],"73664a40":[()=>n.e(3514).then(n.bind(n,1976)),"@site/blog/2019-05-29-long-blog-post.md",1976],74876495:[()=>n.e(5049).then(n.bind(n,4235)),"@site/docs/quickstart.mdx",4235],"7661071f":[()=>n.e(9642).then(n.bind(n,6911)),"@site/blog/2021-08-26-welcome/index.md?truncated=true",6911],"814f3328":[()=>n.e(2535).then(n.t.bind(n,5641,19)),"~blog/default/blog-post-list-prop-default.json",5641],"8717b14a":[()=>n.e(948).then(n.bind(n,3352)),"@site/blog/2019-05-29-long-blog-post.md?truncated=true",3352],"87bc41d4":[()=>n.e(7942).then(n.bind(n,6105)),"@site/docs/gameplay-sessions/gameplay-sessions-reference.mdx",6105],"8f2791df":[()=>n.e(7384).then(n.bind(n,5730)),"@site/docs/computer-vision/computer-vision.mdx",5730],"925b3f96":[()=>n.e(9003).then(n.bind(n,8856)),"@site/blog/2019-05-28-first-blog-post.md?truncated=true",8856],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9e4087bc":[()=>n.e(3608).then(n.bind(n,3169)),"@theme/BlogArchivePage",3169],a6aa9e1f:[()=>Promise.all([n.e(532),n.e(1506),n.e(2529),n.e(3089)]).then(n.bind(n,46)),"@theme/BlogListPage",46],a7023ddc:[()=>n.e(1713).then(n.t.bind(n,3457,19)),"~blog/default/blog-tags-tags-4c2.json",3457],a80da1cf:[()=>n.e(3205).then(n.t.bind(n,4863,19)),"~blog/default/blog-tags-docusaurus-0e0.json",4863],af45fd03:[()=>n.e(5508).then(n.bind(n,8558)),"@site/docs/automated-testing/creating-custom-components.mdx",8558],b1406738:[()=>n.e(4873).then(n.bind(n,3117)),"@site/docs/validations/validations-rules-reference.mdx",3117],b220c1b0:[()=>n.e(3413).then(n.bind(n,5787)),"@site/docs/gameplay-sessions/gameplay-sessions-getting-started.mdx",5787],b2b675dd:[()=>n.e(533).then(n.t.bind(n,8017,19)),"~blog/default/blog-c06.json",8017],b2f554cd:[()=>n.e(1477).then(n.t.bind(n,10,19)),"~blog/default/blog-archive-80c.json",10],ccc49370:[()=>Promise.all([n.e(532),n.e(1506),n.e(2529),n.e(6103)]).then(n.bind(n,5203)),"@theme/BlogPostPage",5203],d0d95016:[()=>n.e(1640).then(n.bind(n,1901)),"@site/docs/404.mdx",1901],d2b05863:[()=>Promise.all([n.e(532),n.e(4998)]).then(n.bind(n,180)),"@site/docs/creating-bots/csharp/adaptive-bots.mdx",180],d9f32620:[()=>n.e(1914).then(n.bind(n,2900)),"@site/blog/2021-08-26-welcome/index.md",2900],e16015ca:[()=>n.e(9700).then(n.t.bind(n,5688,19)),"~blog/default/blog-tags-hola-ea2.json",5688],e273c56f:[()=>n.e(2362).then(n.bind(n,1947)),"@site/blog/2019-05-28-first-blog-post.md",1947],eadec799:[()=>n.e(660).then(n.bind(n,8784)),"@site/docs/validations/validations-scenario-builder-reference.mdx",8784],ebe69912:[()=>n.e(8329).then(n.bind(n,138)),"@site/docs/tutorials/github-actions.md",138],efcba355:[()=>n.e(8922).then(n.t.bind(n,3769,19)),"/home/runner/work/RegressionDocs/RegressionDocs/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],f4f34a3a:[()=>n.e(8636).then(n.bind(n,5145)),"@site/blog/2021-08-01-mdx-blog-post.mdx?truncated=true",5145],f8739703:[()=>n.e(2216).then(n.bind(n,7473)),"@site/docs/session-insights/client-dashboard.mdx",7473]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("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%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("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"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],g=(0,c.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)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 a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/blog",component:f("/blog","ae5"),exact:!0},{path:"/blog/archive",component:f("/blog/archive","eb2"),exact:!0},{path:"/blog/first-blog-post",component:f("/blog/first-blog-post","c66"),exact:!0},{path:"/blog/long-blog-post",component:f("/blog/long-blog-post","c95"),exact:!0},{path:"/blog/mdx-blog-post",component:f("/blog/mdx-blog-post","e29"),exact:!0},{path:"/blog/tags",component:f("/blog/tags","612"),exact:!0},{path:"/blog/tags/docusaurus",component:f("/blog/tags/docusaurus","f84"),exact:!0},{path:"/blog/tags/facebook",component:f("/blog/tags/facebook","72b"),exact:!0},{path:"/blog/tags/hello",component:f("/blog/tags/hello","48d"),exact:!0},{path:"/blog/tags/hola",component:f("/blog/tags/hola","cc1"),exact:!0},{path:"/blog/welcome",component:f("/blog/welcome","bd6"),exact:!0},{path:"/markdown-page",component:f("/markdown-page","e06"),exact:!0},{path:"/",component:f("/","bb6"),exact:!0},{path:"/",component:f("/","da5"),routes:[{path:"/404",component:f("/404","b08"),exact:!0},{path:"/authenticating-with-api-keys",component:f("/authenticating-with-api-keys","483"),exact:!0,sidebar:"unitySidebar"},{path:"/automated-testing/creating-custom-components",component:f("/automated-testing/creating-custom-components","740"),exact:!0,sidebar:"automatedTesting"},{path:"/automated-testing/getting-started",component:f("/automated-testing/getting-started","c37"),exact:!0,sidebar:"automatedTesting"},{path:"/automated-testing/gpt-assistant-bot",component:f("/automated-testing/gpt-assistant-bot","dd7"),exact:!0,sidebar:"automatedTesting"},{path:"/automated-testing/overview",component:f("/automated-testing/overview","e56"),exact:!0,sidebar:"automatedTesting"},{path:"/changelog",component:f("/changelog","daf"),exact:!0},{path:"/computer-vision",component:f("/computer-vision","0f9"),exact:!0,sidebar:"unitySidebar"},{path:"/computer-vision/image-match",component:f("/computer-vision/image-match","df7"),exact:!0,sidebar:"unitySidebar"},{path:"/computer-vision/object-detection",component:f("/computer-vision/object-detection","3a3"),exact:!0,sidebar:"unitySidebar"},{path:"/computer-vision/text-match",component:f("/computer-vision/text-match","929"),exact:!0,sidebar:"unitySidebar"},{path:"/creating-bots/csharp/adaptive-bots",component:f("/creating-bots/csharp/adaptive-bots","9bd"),exact:!0,sidebar:"unitySidebar"},{path:"/creating-bots/csharp/agent-builder",component:f("/creating-bots/csharp/agent-builder","a00"),exact:!0},{path:"/gameplay-sessions/gameplay-sessions-getting-started",component:f("/gameplay-sessions/gameplay-sessions-getting-started","425"),exact:!0,sidebar:"unitySidebar"},{path:"/gameplay-sessions/gameplay-sessions-reference",component:f("/gameplay-sessions/gameplay-sessions-reference","fa6"),exact:!0,sidebar:"unitySidebar"},{path:"/gameplay-sessions/gameplay-sessions-usage",component:f("/gameplay-sessions/gameplay-sessions-usage","91a"),exact:!0,sidebar:"unitySidebar"},{path:"/generic-bots/monkey-bot",component:f("/generic-bots/monkey-bot","1c7"),exact:!0,sidebar:"unitySidebar"},{path:"/overview",component:f("/overview","224"),exact:!0},{path:"/pre-made-bots",component:f("/pre-made-bots","ae7"),exact:!0},{path:"/quickstart",component:f("/quickstart","dad"),exact:!0},{path:"/session-insights/client-dashboard",component:f("/session-insights/client-dashboard","f56"),exact:!0},{path:"/session-insights/in-editor-replay",component:f("/session-insights/in-editor-replay","2db"),exact:!0},{path:"/tutorials/building-your-first-bot",component:f("/tutorials/building-your-first-bot","13c"),exact:!0,sidebar:"unitySidebar"},{path:"/tutorials/github-actions",component:f("/tutorials/github-actions","4d2"),exact:!0},{path:"/validations/validations-getting-started",component:f("/validations/validations-getting-started","3a9"),exact:!0,sidebar:"unitySidebar"},{path:"/validations/validations-rules-reference",component:f("/validations/validations-rules-reference","5fe"),exact:!0,sidebar:"unitySidebar"},{path:"/validations/validations-scenario-builder-reference",component:f("/validations/validations-scenario-builder-reference","572"),exact:!0,sidebar:"unitySidebar"}]},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var u=n(723),c=n(6550),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),g=n(2263),h=n(4996),b=n(6668),v=n(1944),y=n(4711),w=n(9727),E=n(3320),k=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,c.TH)();return e+(0,h.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(k.Z,{tag:E.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var L=n(8934),A=n(8940);function N(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 O=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==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:a}),N("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function P(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 R extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?N("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=N("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(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 r.createElement(O,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=R,M="__docusaurus-base-url-issue-banner-container",D="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function $(e){return`\nwindow['${B}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${B}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\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(/{window[B]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,$(e))),r.createElement("div",{id:M}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(z,null):null}function j(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,g.Z)(),i=(0,h.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var Z=n(4763);function H(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(Z.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(j,null),r.createElement(_,null),r.createElement(U,null),r.createElement(I,{location:T(t)},e)))))}var V=n(6887);const G=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{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 W=n(9670);const q=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,X={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!q.has(e))(e))return!1;q.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(V).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,W.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),P(e))},Q=Object.freeze(X);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"tutorials/building-your-first-bot","docs":[{"id":"404","path":"/404"},{"id":"authenticating-with-api-keys","path":"/authenticating-with-api-keys","sidebar":"unitySidebar"},{"id":"automated-testing/creating-custom-components","path":"/automated-testing/creating-custom-components","sidebar":"automatedTesting"},{"id":"automated-testing/getting-started","path":"/automated-testing/getting-started","sidebar":"automatedTesting"},{"id":"automated-testing/gpt-assistant-bot","path":"/automated-testing/gpt-assistant-bot","sidebar":"automatedTesting"},{"id":"automated-testing/overview","path":"/automated-testing/overview","sidebar":"automatedTesting"},{"id":"changelog","path":"/changelog"},{"id":"computer-vision/computer-vision","path":"/computer-vision/","sidebar":"unitySidebar"},{"id":"computer-vision/image-match","path":"/computer-vision/image-match","sidebar":"unitySidebar"},{"id":"computer-vision/object-detection","path":"/computer-vision/object-detection","sidebar":"unitySidebar"},{"id":"computer-vision/text-match","path":"/computer-vision/text-match","sidebar":"unitySidebar"},{"id":"creating-bots/csharp/adaptive-bots","path":"/creating-bots/csharp/adaptive-bots","sidebar":"unitySidebar"},{"id":"creating-bots/csharp/agent-builder","path":"/creating-bots/csharp/agent-builder"},{"id":"gameplay-sessions/gameplay-sessions-getting-started","path":"/gameplay-sessions/gameplay-sessions-getting-started","sidebar":"unitySidebar"},{"id":"gameplay-sessions/gameplay-sessions-reference","path":"/gameplay-sessions/gameplay-sessions-reference","sidebar":"unitySidebar"},{"id":"gameplay-sessions/gameplay-sessions-usage","path":"/gameplay-sessions/gameplay-sessions-usage","sidebar":"unitySidebar"},{"id":"generic-bots/monkey-bot","path":"/generic-bots/monkey-bot","sidebar":"unitySidebar"},{"id":"overview","path":"/overview"},{"id":"pre-made-bots","path":"/pre-made-bots"},{"id":"quickstart","path":"/quickstart"},{"id":"session-insights/client-dashboard","path":"/session-insights/client-dashboard"},{"id":"session-insights/in-editor-replay","path":"/session-insights/in-editor-replay"},{"id":"tutorials/building-your-first-bot","path":"/tutorials/building-your-first-bot","sidebar":"unitySidebar"},{"id":"tutorials/github-actions","path":"/tutorials/github-actions"},{"id":"validations/validations-getting-started","path":"/validations/validations-getting-started","sidebar":"unitySidebar"},{"id":"validations/validations-rules-reference","path":"/validations/validations-rules-reference","sidebar":"unitySidebar"},{"id":"validations/validations-scenario-builder-reference","path":"/validations/validations-scenario-builder-reference","sidebar":"unitySidebar"}],"draftIds":[],"sidebars":{"unitySidebar":{"link":{"path":"/tutorials/building-your-first-bot","label":"tutorials/building-your-first-bot"}},"automatedTesting":{"link":{"path":"/automated-testing/overview","label":"automated-testing/overview"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.1","siteVersion":"0.0.27","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.1"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(7961);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,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??d)(e)}return e??null}}},412:(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}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...v}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:E}=(0,d.C)(),k=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const _=(0,s.Z)(x),C=x?.replace("pathname://","");let T=void 0!==C?(L=C,b&&(e=>e.startsWith("/"))(L)?E(L):L):void 0;var L;T&&_&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),N=n?o.OL:o.rU,O=u.Z.canUseIntersectionObserver,P=(0,a.useRef)(),R=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,a.useEffect)((()=>(!O&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{O&&P.current&&P.current.disconnect()})),[P,T,O,_]);const I=T?.startsWith("#")??!1,M=!T||!_||I;return M||h||k.collectLink(T),M?a.createElement("a",(0,r.Z)({ref:S,href:T},x&&!_&&{target:"_blank",rel:"noopener noreferrer"},v)):a.createElement(N,(0,r.Z)({},v,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{S.current=e,O&&e&&_&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),P.current.observe(e))},to:T},n&&{isActive:g,activeClassName:m}))}const p=a.forwardRef(f)},1875:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});const r=()=>null},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(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 o=n(7529);function i(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 o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(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})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);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 l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(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 l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(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:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6550),a=n(2263),o=n(9935);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 l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(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 f(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 p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),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(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(2549)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a={iconExternalLink:"iconExternalLink_nPIU"};function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a.iconExternalLink},r.createElement("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"}))}},7961:(e,t,n)=>{"use strict";n.d(t,{Z:()=>dt});var r=n(7294),a=n(6010),o=n(4763),i=n(1944),l=n(7462),s=n(6550),u=n(5999),c=n(5936);const d="__docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){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&&f(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,u.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:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var h=n(5281),b=n(9727);const v={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(g,{className:v.skipToContent})}var w=n(6668),E=n(9689);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S={closeButton:"closeButton_CVFx"};function x(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,u.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)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,E.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:T.announcementBarClose}))}var A=n(3163),N=n(2466);var O=n(902),P=n(3102);const R=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,O.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 r.createElement(R.Provider,{value:n},t)}function M(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function D(){const e=(0,r.useContext)(R);if(!e)throw new O.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:M(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=D();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var B=n(2949),$=n(2389);function z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 U(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("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 j={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function Z(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,$.Z)(),s=(0,u.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"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(j.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",j.toggleButton,!l&&j.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)(j.toggleIcon,j.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)(j.toggleIcon,j.darkToggleIcon)})))}const H=r.memo(Z),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}var W=n(1327);function q(){return r.createElement(W.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,A.e)();return r.createElement("button",{type:"button","aria-label":(0,u.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()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(q,null),r.createElement(G,{className:"margin-right--md"}),r.createElement(Y,null))}var X=n(9960),Q=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,Q.Z)(a),p=(0,Q.Z)(t),m=(0,Q.Z)(o,{forcePrependBaseUrl:!0}),g=i&&o&&!(0,J.Z)(o),h=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,g&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(X.Z,(0,l.Z)({href:c?m:o},d,h)):r.createElement(X.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,h))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.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)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,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(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(xe,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(xe,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("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 ge="iconLanguage_nlXk";var he=n(1875);const be={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,be.searchBox)},t)}var ye=n(143),we=n(3438);var Ee=n(373);const ke=e=>e.docs.find((t=>t.id===e.mainDocId));const Se={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;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":""}})),...a],h=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:ge}),h),items:g}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(he.Z,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,we.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,ye.Iw)(a),s=(0,we.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,we.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,ye.Iw)(n),m=(0,ye.gB)(n),{savePreferredVersionName:g}=(0,Ee.J)(n),h=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??ke(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>g(e.name)}})),...i],b=(0,we.lO)(n)[0],v=t&&h.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&h.length>1?void 0:ke(b).path;return h.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},c,{mobile:t,label:v,to:y,items:h,isActive:a?()=>!1:void 0}))}};function xe(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Se[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function _e(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(xe,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ce(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.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)"},"\u2190 Back to main menu"))}function Te(){const e=0===(0,w.L)().navbar.items.length,t=D();return r.createElement(r.Fragment,null,!e&&r.createElement(Ce,{onClick:()=>t.hide()}),t.content)}function Le(){const e=(0,A.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?r.createElement(F,{header:r.createElement(K,null),primaryMenu:r.createElement(_e,null),secondaryMenu:r.createElement(Te,null)}):null}const Ae={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ne(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Oe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:l,isNavbarVisible:s}=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,N.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?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 r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ae.navbarHideable,!s&&Ae.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Ne,{onClick:i.toggle}),r.createElement(Le,null))}var Pe=n(8780);const Re={errorBoundaryError:"errorBoundaryError_a6uf"};function Ie(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function Me(e){let{error:t}=e;const n=(0,Pe.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:Re.errorBoundaryError},n)}class De extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const Fe="right";function Be(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function $e(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.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"},r.createElement(Be,null))}const ze={colorModeToggle:"colorModeToggle_DEke"};function Ue(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(De,{key:t,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})},r.createElement(xe,e)))))}function je(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ze(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Fe)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(je,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement($e,null),r.createElement(q,null),r.createElement(Ue,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Ue,{items:a}),r.createElement(G,{className:ze.colorModeToggle}),!o&&r.createElement(ve,null,r.createElement(he.Z,null)))})}function He(){return r.createElement(Oe,null,r.createElement(Ze,null))}function Ve(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,Q.Z)(n),c=(0,Q.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(X.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function Ge(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(Ve,{item:t}))}function We(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ge,{key:t,item:e})))))}function qe(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(We,{key:t,column:e}))))}function Ye(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Ke(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(Ve,{item:t})}function Xe(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(Ke,{item:e}),t.length!==n+1&&r.createElement(Ye,null))))))}function Qe(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(qe,{columns:t}):r.createElement(Xe,{links:t})}var Je=n(941);const et={footerLogoLink:"footerLogoLink_BH7S"};function tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,Q.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(Je.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function nt(e){let{logo:t}=e;return t.href?r.createElement(X.Z,{href:t.href,className:et.footerLogoLink,target:t.target},r.createElement(tt,{logo:t})):r.createElement(tt,{logo:t})}function rt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function at(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function ot(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(at,{style:o,links:n&&n.length>0&&r.createElement(Qe,{links:n}),logo:a&&r.createElement(nt,{logo:a}),copyright:t&&r.createElement(rt,{copyright:t})})}const it=r.memo(ot),lt=(0,O.Qc)([B.S,E.pl,N.OC,Ee.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(A.M,null,r.createElement(I,null,t)))}]);function st(e){let{children:t}=e;return r.createElement(lt,null,t)}function ut(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(Ie,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(Me,{error:t})))))}const ct={mainWrapper:"mainWrapper_z2l0"};function dt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,b.t)(),r.createElement(st,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(L,null),r.createElement(He,null),r.createElement("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,ct.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(ut,e)},t)),!n&&r.createElement(it,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),u=n(941);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:u}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)(u?.href||"/"),g=n?"":t,h=u?.alt??g;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:h,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>h});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.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 ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),i?.(n))},className:l},r)}function g(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?g:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),u="theme",c=(0,i.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[a,o]=(0,r.useState)(p(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?d.dark:d.light:e),c.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!==u)return;const t=c.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(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||s.current?s.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===d.dark},setLightTheme(){i(d.light)},setDarkTheme(){i(d.dark)}})),[a,i])}();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>h});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(3438),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.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){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function h(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function b(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>d,e:()=>f});var r=n(7294),a=n(3102),o=n(7524),i=n(1980),l=n(6668),s=n(902);const u=r.createContext(void 0);function c(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[s,u]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(s)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:s})),[e,n,c,s])}function d(e){let{children:t}=e;const n=c();return r.createElement(u.Provider,{value:n},t)}function f(){const e=r.useContext(u);if(void 0===e)throw new s.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);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)}}),[])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(){return a.Z.canUseDOM?window.innerWidth>i?o.desktop:o.mobile:o.ssr}const s=!1;function u(){const[e,t]=(0,r.useState)((()=>s?"ssr":l()));return(0,r.useEffect)((()=>{function e(){t(l())}const n=s?window.setTimeout(e,1e3):void 0;return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(n)}}),[]),e}},5281:(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",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:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>g,cE:()=>d,hI:()=>E,lO:()=>v,oz:()=>y,s1:()=>b,vY:()=>w});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116),u=n(7392),c=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function h(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,c.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,c.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function b(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?h({sidebarItems:e.items,pathname:t}):null}function v(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=v(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 w(e,t){const n=v(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,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},1980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>l,_X:()=>s});var r=n(7294),a=n(6550),o=n(1688),i=n(902);function l(e){!function(e){const t=(0,a.k6)(),n=(0,i.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,o.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},7392:(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:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),u=n(2263);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=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,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{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 s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){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])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>p,OC:()=>s,RF:()=>d,o5:()=>f});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(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 r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();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 f(){const e=u(),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,r.useLayoutEffect)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:a}}function p(){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?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(2263);const r="default";function a(e,t){return`docs-${e}-${t}`}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>d,WA:()=>c});var r=n(7294),a=n(1688);const o="localStorage";function i(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 l(e){if(void 0===e&&(e=o),"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 u={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(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=l(t?.persistence);return null===n?u:{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),i({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),i({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 d(e,t){const n=(0,r.useRef)((()=>null===e?u:c(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,a.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6550);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),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])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(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)}},4143:(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]}},8780: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(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},6010:(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:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),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 l=n(8776);function s(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 f(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 p(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(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}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=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),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},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=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,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865: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,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(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),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(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&&p(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 l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=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:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(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)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,a){for(var o,i,l=function(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}(e),s=1;s{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=k.value.length,k=k.next){var x=k.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(v){if(!(_=o(E,S,e,b))||_.index>=e.length)break;var T=_.index,L=_.index+_[0].length,A=S;for(A+=k.value.length;T>=A;)A+=(k=k.next).value.length;if(S=A-=k.value.length,k.value instanceof a)continue;for(var N=k;N!==t.tail&&(Ad.reach&&(d.reach=I);var M=k.prev;if(P&&(M=s(t,M,P),S+=P.length),u(t,M,C),k=s(t,M,new a(f,h?r.tokenize(O,h):O,y,O)),R&&s(t,k,R),C>1){var D={cause:f+","+m,reach:I};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],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,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=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(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9016:()=>{!function(e){function t(e,t){return e.replace(/<<(\d+)>>/g,(function(e,n){return"(?:"+t[+n]+")"}))}function n(e,n,r){return RegExp(t(e,n),r||"")}function r(e,t){for(var n=0;n>/g,(function(){return"(?:"+e+")"}));return e.replace(/<>/g,"[^\\s\\S]")}var a="bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",o="class enum interface record struct",i="add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",l="abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield";function s(e){return"\\b(?:"+e.trim().replace(/ /g,"|")+")\\b"}var u=s(o),c=RegExp(s(a+" "+o+" "+i+" "+l)),d=s(o+" "+i+" "+l),f=s(a+" "+o+" "+l),p=r(/<(?:[^<>;=+\-*/%&|^]|<>)*>/.source,2),m=r(/\((?:[^()]|<>)*\)/.source,2),g=/@?\b[A-Za-z_]\w*\b/.source,h=t(/<<0>>(?:\s*<<1>>)?/.source,[g,p]),b=t(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source,[d,h]),v=/\[\s*(?:,\s*)*\]/.source,y=t(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source,[b,v]),w=t(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source,[p,m,v]),E=t(/\(<<0>>+(?:,<<0>>+)+\)/.source,[w]),k=t(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source,[E,b,v]),S={keyword:c,punctuation:/[<>()?,.:[\]]/},x=/'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source,_=/"(?:\\.|[^\\"\r\n])*"/.source,C=/@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;e.languages.csharp=e.languages.extend("clike",{string:[{pattern:n(/(^|[^$\\])<<0>>/.source,[C]),lookbehind:!0,greedy:!0},{pattern:n(/(^|[^@$\\])<<0>>/.source,[_]),lookbehind:!0,greedy:!0}],"class-name":[{pattern:n(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source,[b]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source,[g,k]),lookbehind:!0,inside:S},{pattern:n(/(\busing\s+)<<0>>(?=\s*=)/.source,[g]),lookbehind:!0},{pattern:n(/(\b<<0>>\s+)<<1>>/.source,[u,h]),lookbehind:!0,inside:S},{pattern:n(/(\bcatch\s*\(\s*)<<0>>/.source,[b]),lookbehind:!0,inside:S},{pattern:n(/(\bwhere\s+)<<0>>/.source,[g]),lookbehind:!0},{pattern:n(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source,[y]),lookbehind:!0,inside:S},{pattern:n(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source,[k,f,g]),inside:S}],keyword:c,number:/(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,operator:/>>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),e.languages.insertBefore("csharp","number",{range:{pattern:/\.\./,alias:"operator"}}),e.languages.insertBefore("csharp","punctuation",{"named-parameter":{pattern:n(/([(,]\s*)<<0>>(?=\s*:)/.source,[g]),lookbehind:!0,alias:"punctuation"}}),e.languages.insertBefore("csharp","class-name",{namespace:{pattern:n(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source,[g]),lookbehind:!0,inside:{punctuation:/\./}},"type-expression":{pattern:n(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source,[m]),lookbehind:!0,alias:"class-name",inside:S},"return-type":{pattern:n(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source,[k,b]),inside:S,alias:"class-name"},"constructor-invocation":{pattern:n(/(\bnew\s+)<<0>>(?=\s*[[({])/.source,[k]),lookbehind:!0,inside:S,alias:"class-name"},"generic-method":{pattern:n(/<<0>>\s*<<1>>(?=\s*\()/.source,[g,p]),inside:{function:n(/^<<0>>/.source,[g]),generic:{pattern:RegExp(p),alias:"class-name",inside:S}}},"type-list":{pattern:n(/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,[u,h,g,k,c.source,m,/\bnew\s*\(\s*\)/.source]),lookbehind:!0,inside:{"record-arguments":{pattern:n(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source,[h,m]),lookbehind:!0,greedy:!0,inside:e.languages.csharp},keyword:c,"class-name":{pattern:RegExp(k),greedy:!0,inside:S},punctuation:/[,()]/}},preprocessor:{pattern:/(^[\t ]*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}});var T=_+"|"+x,L=t(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source,[T]),A=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),N=/\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source,O=t(/<<0>>(?:\s*\(<<1>>*\))?/.source,[b,A]);e.languages.insertBefore("csharp","class-name",{attribute:{pattern:n(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source,[N,O]),lookbehind:!0,greedy:!0,inside:{target:{pattern:n(/^<<0>>(?=\s*:)/.source,[N]),alias:"keyword"},"attribute-arguments":{pattern:n(/\(<<0>>*\)/.source,[A]),inside:e.languages.csharp},"class-name":{pattern:RegExp(b),inside:{punctuation:/\./}},punctuation:/[:,]/}}});var P=/:[^}\r\n]+/.source,R=r(t(/[^"'/()]|<<0>>|\(<>*\)/.source,[L]),2),I=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[R,P]),M=r(t(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<>*\)/.source,[T]),2),D=t(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source,[M,P]);function F(t,r){return{interpolation:{pattern:n(/((?:^|[^{])(?:\{\{)*)<<0>>/.source,[t]),lookbehind:!0,inside:{"format-string":{pattern:n(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source,[r,P]),lookbehind:!0,inside:{punctuation:/^:/}},punctuation:/^\{|\}$/,expression:{pattern:/[\s\S]+/,alias:"language-csharp",inside:e.languages.csharp}}},string:/[\s\S]+/}}e.languages.insertBefore("csharp","string",{"interpolation-string":[{pattern:n(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source,[I]),lookbehind:!0,greedy:!0,inside:F(I,R)},{pattern:n(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source,[D]),lookbehind:!0,greedy:!0,inside:F(D,M)}],char:{pattern:RegExp(x),greedy:!0}}),e.languages.dotnet=e.languages.cs=e.languages.csharp}(Prism)},2549:(e,t,n)=>{var r={"./prism-csharp":9016};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=2549},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=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 l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint: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}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n