diff --git a/404.html b/404.html index 621523e1..a7ab5983 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page Not Found | Starknet Hardhat Plugin - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

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

- - + + \ No newline at end of file diff --git a/assets/js/0e384e19.429a820c.js b/assets/js/0e384e19.429a820c.js deleted file mode 100644 index 113013f4..00000000 --- a/assets/js/0e384e19.429a820c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[671],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});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 i(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 o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),c=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},p=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={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,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(n),m=r,h=d["".concat(s,".").concat(m)]||d[m]||u[m]||i;return n?a.createElement(h,o(o({ref:t},p),{},{components:n})):a.createElement(h,o({ref:t},p))}));function h(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var a=n(7462),r=(n(7294),n(3905));const i={},o="Starknet Hardhat Plugin",l={unversionedId:"intro",id:"intro",title:"Starknet Hardhat Plugin",description:"npm package",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/starknet-hardhat-plugin/docs/intro",draft:!1,editUrl:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/docs/docs/intro.md",tags:[],version:"current",frontMatter:{}},s={},c=[{value:"Contents",id:"contents",level:2},{value:"Install",id:"install",level:2},{value:"Requirements",id:"requirements",level:3},{value:"CLI commands",id:"cli-commands",level:2},{value:"starknet-compile-deprecated",id:"starknet-compile-deprecated",level:3},{value:"starknet-compile",id:"starknet-compile",level:3},{value:"starknet-verify",id:"starknet-verify",level:3},{value:"starknet-new-account",id:"starknet-new-account",level:3},{value:"starknet-deploy-account",id:"starknet-deploy-account",level:3},{value:"starknet-plugin-version",id:"starknet-plugin-version",level:3},{value:"migrate",id:"migrate",level:3},{value:"run",id:"run",level:3},{value:"amarna",id:"amarna",level:3},{value:"test",id:"test",level:3},{value:"API",id:"api",level:2},{value:"Testing",id:"testing",level:2},{value:"Important notes",id:"important-notes",level:3},{value:"Test examples",id:"test-examples",level:3},{value:"Setup",id:"setup",level:4},{value:"Deploy / load contract",id:"deploy--load-contract",level:4},{value:"Arrays",id:"arrays",level:4},{value:"Tuples",id:"tuples",level:4},{value:"Fee estimation",id:"fee-estimation",level:4},{value:"Delegate Proxy",id:"delegate-proxy",level:4},{value:"Transaction information and receipt with events",id:"transaction-information-and-receipt-with-events",level:4},{value:"Devnet examples",id:"devnet-examples",level:3},{value:"L1-L2 communication (Postman message exchange with Devnet)",id:"l1-l2-communication-postman-message-exchange-with-devnet",level:4},{value:"Mock message between L1 and L2",id:"mock-message-between-l1-and-l2",level:4},{value:"Restart",id:"restart",level:4},{value:"Dumping",id:"dumping",level:4},{value:"Loading",id:"loading",level:4},{value:"Advancing time",id:"advancing-time",level:4},{value:"Creating an empty block",id:"creating-an-empty-block",level:4},{value:"Mint tokens to an account",id:"mint-tokens-to-an-account",level:4},{value:"Debugging contracts",id:"debugging-contracts",level:2},{value:"Configure the plugin",id:"configure-the-plugin",level:2},{value:"Cairo version",id:"cairo-version",level:3},{value:"Existing virtual environment",id:"existing-virtual-environment",level:3},{value:"Custom Cairo 1 compilation",id:"custom-cairo-1-compilation",level:3},{value:"Request Timeout",id:"request-timeout",level:3},{value:"Paths",id:"paths",level:3},{value:"Runtime network",id:"runtime-network",level:3},{value:"Runtime network - Integrated Devnet",id:"runtime-network---integrated-devnet",level:3},{value:"Installing third-party libraries",id:"installing-third-party-libraries",level:3},{value:"With npm packages:",id:"with-npm-packages",level:4},{value:"With pip packages:",id:"with-pip-packages",level:4},{value:"With non-npm git repositories:",id:"with-non-npm-git-repositories",level:4},{value:"Using starknet.getContractFactory with third-party libraries",id:"using-starknetgetcontractfactory-with-third-party-libraries",level:3},{value:"Wallet - Starknet CLI",id:"wallet---starknet-cli",level:3},{value:"Recompilation",id:"recompilation",level:2},{value:"Account",id:"account",level:2},{value:"Create account",id:"create-account",level:3},{value:"Fund account",id:"fund-account",level:3},{value:"Get balance",id:"get-balance",level:3},{value:"Deploy account",id:"deploy-account",level:3},{value:"Reuse account",id:"reuse-account",level:3},{value:"Interact through account",id:"interact-through-account",level:3},{value:"Multicalls",id:"multicalls",level:3},{value:"Guardian",id:"guardian",level:3},{value:"More examples",id:"more-examples",level:2}],p={toc:c},d="wrapper";function u(e){let{components:t,...n}=e;return(0,r.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"starknet-hardhat-plugin"},"Starknet Hardhat Plugin"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin"},(0,r.kt)("img",{parentName:"a",src:"https://img.shields.io/npm/v/@shardlabs/starknet-hardhat-plugin?color=blue",alt:"npm package"}))),(0,r.kt)("p",null,"If you've used Hardhat \ud83d\udc77\u200d\u2640\ufe0f\ud83d\udc77\u200d\u2642\ufe0f and want to develop for Starknet ",(0,r.kt)("img",{src:"https://starkware.co/wp-content/uploads/2021/07/Group-177.svg",alt:"starknet",width:"18"}),", this plugin might come in hand. If you've never set up a Hardhat project, check out ",(0,r.kt)("a",{parentName:"p",href:"https://hardhat.org/tutorial/creating-a-new-hardhat-project.html"},"this guide"),"."),(0,r.kt)("h2",{id:"contents"},"Contents"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#install"},"Install")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#cli-commands"},"CLI commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#api"},"API")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#testing"},"Testing"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#important-notes"},"Important notes")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#test-examples"},"Examples")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#devnet-examples"},"Devnet examples")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#debugging-contracts"},"Debugging contracts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#configure-the-plugin"},"Configure the plugin")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#account"},"Account support")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#more-examples"},"More examples")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#contribute"},"Contribute"))),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"npm i @shardlabs/starknet-hardhat-plugin --save-dev\n")),(0,r.kt)("p",null,"For the latest unstable version, use"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"npm i @shardlabs/starknet-hardhat-plugin@alpha --save-dev\n")),(0,r.kt)("p",null,"Add the following line to the top of your ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," (or ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.js"),"):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import "@shardlabs/starknet-hardhat-plugin";\n// or\nrequire("@shardlabs/starknet-hardhat-plugin");\n')),(0,r.kt)("h3",{id:"requirements"},"Requirements"),(0,r.kt)("p",null,"This plugin was tested with:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Node.js v14.17.3"),(0,r.kt)("li",{parentName:"ul"},"npm/npx v7.19.1"),(0,r.kt)("li",{parentName:"ul"},"Docker v20.10.8 (optional):",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Since plugin version 0.3.4, Docker is no longer necessary if you opt for a Python environment (more info in ",(0,r.kt)("a",{parentName:"li",href:"#cairo-version"},"Config"),")."),(0,r.kt)("li",{parentName:"ul"},"If you opt for the containerized version, make sure you have a running Docker daemon."),(0,r.kt)("li",{parentName:"ul"},"If you're experiencing Docker access issues, check ",(0,r.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/52364905/after-executing-following-code-of-dockerode-npm-getting-error-connect-eacces-v"},"this"),"."))),(0,r.kt)("li",{parentName:"ul"},"Linux / macOS:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"On Windows, we recommend using ",(0,r.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"WSL 2")," with Docker instance installed on ",(0,r.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"WSL 2")," instead of using Docker Desktop on your windows. Example installation for Ubuntu can be found ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/engine/install/ubuntu/"},"here"),".")))),(0,r.kt)("h2",{id:"cli-commands"},"CLI commands"),(0,r.kt)("p",null,"This plugin defines the following Hardhat commands (also called tasks):"),(0,r.kt)("h3",{id:"starknet-compile-deprecated"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-compile-deprecated")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'$ npx hardhat starknet-compile-deprecated [PATH...] [--cairo-path "::..."] [--account-contract] [--disable-hint-validation]\n')),(0,r.kt)("p",null,"Compiles Starknet Cairo 0 contracts. If no paths are provided, all Starknet contracts in the default contracts directory are compiled. Paths can be files and directories."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"--cairo-path")," allows specifying the locations of imported files, if necessary. Separate them with a colon (:), e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"--cairo-path='path/to/lib1:path/to/lib2'")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"--account-contract")," allows compiling an account contract."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"--disable-hint-validation")," allows compiling a contract without hint validation (any python code is allowed in hints, ex: print ...)."),(0,r.kt)("h3",{id:"starknet-compile"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-compile")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-compile [PATH...] [--add-pythonic-hints] [--replace-ids] [--allowed-libfuncs-list-file] [--allowed-libfuncs-list-name] [--cairo1-bin-dir ]\n")),(0,r.kt)("p",null,"Compiles Starknet Cairo 1 contracts in the provided path. Paths can be files and directories. Currently, contracts importing other contracts are not supported (until this is supported, you may try to use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/software-mansion/scarb"},"Scarb")," and modifying its artifacts to be compatible with this plugin)."),(0,r.kt)("p",null,"By default, the dockerized Cairo 1 compiler is used. In ",(0,r.kt)("a",{parentName:"p",href:"#existing-virtual-environment"},"venv mode"),", you can use a custom compiler by providing the path of the directory of its binary executable to ",(0,r.kt)("inlineCode",{parentName:"p"},"--cairo1-bin-dir")," or to the ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo1BinDir")," option in your hardhat config file. Other CLI options are the same as in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/starkware-libs/cairo"},"native Cairo compiler"),"."),(0,r.kt)("h3",{id:"starknet-verify"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-verify")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-verify [--starknet-network ] [--path ] [ ...] [--address ] [--compiler-version ] [--license ] [--contract-name ] [--acount-contract]\n")),(0,r.kt)("p",null,"Queries ",(0,r.kt)("a",{parentName:"p",href:"https://voyager.online/"},"Voyager")," to ",(0,r.kt)("a",{parentName:"p",href:"https://voyager.online/verifyContract"},"verify the contract")," deployed at ",(0,r.kt)("inlineCode",{parentName:"p"},"")," using the source files at ",(0,r.kt)("inlineCode",{parentName:"p"},"")," and any number of ",(0,r.kt)("inlineCode",{parentName:"p"},""),"."),(0,r.kt)("p",null,"Like in the previous command, this plugin relies on ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network"),", but will default to 'alphaGoerli' network in case this parameter is not passed."),(0,r.kt)("p",null,"The verifier expects ",(0,r.kt)("inlineCode",{parentName:"p"},"")," to be passed on request. Supported compiler versions are listed ",(0,r.kt)("a",{parentName:"p",href:"https://voyager.online/verifyContract"},"here")," in the dropdown menu."),(0,r.kt)("p",null,"We pass ",(0,r.kt)("inlineCode",{parentName:"p"},"--acount-contract")," to tell the verifier that the contract is of type account."),(0,r.kt)("p",null,"For ",(0,r.kt)("inlineCode",{parentName:"p"},"")," the command takes ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/github/choosealicense.com/blob/a40ef42140d137770161addf4fefc715709d8ccd/no-permission.md"},(0,r.kt)("em",{parentName:"a"},"No License (None)"))," as default license scheme. ",(0,r.kt)("a",{parentName:"p",href:"https://goerli.voyager.online/cairo-licenses"},"Here")," is a list of available options."),(0,r.kt)("h3",{id:"starknet-new-account"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-new-account")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"ATTENTION!")," Use this only if you want to achieve compatibility with the wallet used in Starknet CLI. For all other uses, ",(0,r.kt)("a",{parentName:"p",href:"#account"},"these accounts")," should suffice."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-new-account [--starknet-network ] [--wallet ]\n")),(0,r.kt)("p",null,"Initializes a wallet ",(0,r.kt)("inlineCode",{parentName:"p"},'wallets["WALLET_NAME"]')," configured in the ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config")," file, which should then be followed by the command ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet-deploy-account"),". Uses the modified OZ implementation used by Starknet CLI."),(0,r.kt)("h3",{id:"starknet-deploy-account"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-deploy-account")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-deploy-account [--starknet-network ] [--wallet ]\n")),(0,r.kt)("p",null,"Deploys the wallet ",(0,r.kt)("inlineCode",{parentName:"p"},'wallets["WALLET_NAME"]')," configured in the ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config")," file. Uses the modified OZ implementation used by Starknet CLI. ",(0,r.kt)("em",{parentName:"p"},"Needs to be funded before deploying it.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-deploy-account --starknet-network myNetwork --wallet MyWallet\n")),(0,r.kt)("h3",{id:"starknet-plugin-version"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-plugin-version")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-plugin-version\n")),(0,r.kt)("p",null,"Prints the version of the plugin."),(0,r.kt)("h3",{id:"migrate"},(0,r.kt)("inlineCode",{parentName:"h3"},"migrate")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat migrate [PATH...] [--inplace]\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOT APPLICABLE TO CAIRO 1")),(0,r.kt)("p",null,"Converts old syntax to Cairo 0.10 syntax. The ",(0,r.kt)("inlineCode",{parentName:"p"},"--inplace")," flag will change the contract file in place."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat migrate --inplace contract/contract.cairo\n")),(0,r.kt)("h3",{id:"run"},(0,r.kt)("inlineCode",{parentName:"h3"},"run")),(0,r.kt)("p",null,"Using ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network")," with ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat run")," currently does not have effect. Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"network")," property of the ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," object in your hardhat config file."),(0,r.kt)("h3",{id:"amarna"},(0,r.kt)("inlineCode",{parentName:"h3"},"amarna")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"$ npx hardhat amarna\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/crytic/amarna"},"Amarna"),", the static-analyzer and linter for Cairo, in a Docker container. The output from amarna goes in ",(0,r.kt)("inlineCode",{parentName:"p"},"out.sarif")," file.\nUse flag ",(0,r.kt)("inlineCode",{parentName:"p"},"--script")," to run custom ",(0,r.kt)("inlineCode",{parentName:"p"},"./amarna.sh")," file to use Amarna with custom rules and args."),(0,r.kt)("p",null,"You need to have Docker installed and running to use ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat amarna"),"."),(0,r.kt)("h3",{id:"test"},(0,r.kt)("inlineCode",{parentName:"h3"},"test")),(0,r.kt)("p",null,"Introduces the ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network")," option to the existing ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat test")," task."),(0,r.kt)("h2",{id:"api"},"API"),(0,r.kt)("p",null,"Adding this plugin to your project expands Hardhat's runtime with a ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," object. It can be imported with:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\n// or\nconst starknet = require("hardhat").starknet;\n')),(0,r.kt)("p",null,"To see all the utilities introduced by the ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," object, check ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/types/starknet.ts"},"this")," out."),(0,r.kt)("h2",{id:"testing"},"Testing"),(0,r.kt)("p",null,"Relying on the above described API makes it easier to interact with your contracts and test them."),(0,r.kt)("p",null,"To test Starknet contracts with Mocha, use the regular Hardhat ",(0,r.kt)("inlineCode",{parentName:"p"},"test")," task which expects test files in your designated test directory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat test\n")),(0,r.kt)("p",null,"Read more about the network used in tests in the ",(0,r.kt)("a",{parentName:"p",href:"#runtime-network"},"Runtime network")," section.\nThese examples are inspired by the official ",(0,r.kt)("a",{parentName:"p",href:"https://www.cairo-lang.org/docs/hello_starknet/unit_tests.html"},"Starknet Python tutorial"),"."),(0,r.kt)("h3",{id:"important-notes"},"Important notes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"BigInt")," is used because ",(0,r.kt)("inlineCode",{parentName:"li"},"felt")," may be too big for javascript. Use it like ",(0,r.kt)("inlineCode",{parentName:"li"},'BigInt("10")')," or, since ES2020, like ",(0,r.kt)("inlineCode",{parentName:"li"},"10n"),"."),(0,r.kt)("li",{parentName:"ul"},"All function names, argument names and return value names should be referred to by the names specified in contract source files."),(0,r.kt)("li",{parentName:"ul"},"The argument of ",(0,r.kt)("inlineCode",{parentName:"li"},"getContractFactory")," is the ",(0,r.kt)("strong",{parentName:"li"},"name")," or the ",(0,r.kt)("strong",{parentName:"li"},"path")," of the source of the target contract:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"if providing a path, it should be relative to the project root or the contracts directory:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("contracts/subdir/MyContract.cairo")')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("subdir/MyContract.cairo")')))),(0,r.kt)("li",{parentName:"ul"},"the extension can be omitted:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("subdir/MyContract")')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("MyContract")')))))),(0,r.kt)("li",{parentName:"ul"},"Nested arrays are currently not supported (eg. ",(0,r.kt)("inlineCode",{parentName:"li"},"core::array::Array::>"),")")),(0,r.kt)("h3",{id:"test-examples"},"Test examples"),(0,r.kt)("h4",{id:"setup"},"Setup"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { expect } from "chai";\nimport { starknet } from "hardhat";\n// or\nconst expect = require("chai").expect;\nconst starknet = require("hardhat").starknet;\n\ndescribe("My Test", function () {\n this.timeout(...); // Recommended to use a big value if interacting with Alpha Goerli\n')),(0,r.kt)("h4",{id:"deploy--load-contract"},"Deploy / load contract"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},' /**\n * Assumes there is a file MyContract.cairo whose compilation artifacts have been generated.\n * The contract is assumed to have:\n * - constructor function constructor(initial_balance: felt)\n * - external function increase_balance(amount: felt) -> (res: felt)\n * - view function get_balance() -> (res: felt)\n */\n it("should load a previously deployed contract", async function () {\n const contractFactory = await starknet.getContractFactory("MyContract");\n const contract = contractFactory.getContractAt("0x123..."); // address of a previously deployed contract\n });\n\n it("should declare class and deploy", async function() {\n // not compatible with accounts deployed with Starknet CLI\n const account = await starknet.OpenZeppelinAccount.getAccountFromAddress(...);\n const contractFactory = await starknet.getContractFactory("MyContract");\n // will call declare version 2 if contract is cairo 1\n const txHash = await account.declare(contractFactory); // class declaration\n const classHash = await contractFactory.getClassHash();\n\n const constructorArgs = { initial_balance: 0 };\n const options = { maxFee: ... };\n // implicitly invokes UDC\n const contract = await account.deploy(contractFactory, constructorArgs, options);\n });\n')),(0,r.kt)("h4",{id:"arrays"},"Arrays"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'/**\n * The contract is assumed to have:\n * - view function sum_array(a_len: felt, a: felt*) -> (res: felt)\n */\nit("should work with arrays", async function () {\n const contract = ...;\n // you don\'t have to specify the array length separately\n const { res } = await contract.call("sum_array", { a: [1, 2, 3] });\n expect(res).to.deep.equal(BigInt(6));\n});\n')),(0,r.kt)("h4",{id:"tuples"},"Tuples"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'/**\n * The contract is assumed to have:\n * - view function sum_pair(pair: (felt, felt)) -> (res : felt)\n * - view func sum_named_pair(pair : (x : felt, y : felt) -> (res : felt)\n * - using PairAlias = (x : felt, y : felt)\n * - view func sum_type_alias(pair : PairAlias) -> (res : felt)\n */\nit("should work with tuples", async function () {\n const contract = ...;\n // notice how the pair tuple is passed as javascript array\n const { res } = await contract.call("sum_pair", { pair: [10, 20] });\n ... = await contract.call("sum_named_pair", { pair: { x: 10, y: 20 } });\n ... = await contract.call("sum_type_alias", { pair: { x: 10, y: 20 } });\n expect(res).to.deep.equal(BigInt(30));\n});\n')),(0,r.kt)("h4",{id:"fee-estimation"},"Fee estimation"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'it("should estimate fee", async function () {\n const account = await starknet.OpenZeppelinAccount.createAccount({\n salt: "0x42",\n privateKey: OZ_ACCOUNT_PRIVATE_KEY\n });\n\n const estimatedFee = await account.estimateDeployAccountFee();\n await account.deployAccount(); // computes max fee implicitly\n\n // Every fee estimation returns an object with gas information\n\n const contractFactory = await starknet.getContractFactory("contract");\n const declareFee = await account.estimateDeclareFee(contractFactory);\n await account.declare(contractFactory); // computes max fee implicitly\n\n const deployFee = await account.estimateDeployFee(contractFactory);\n const contract = await account.deploy(contractFactory); // computes max fee implicitly\n\n const invokeFee = await account.estimateFee(contract, "method", { arg1: 10n });\n await account.invoke(contract, "method", { arg1: 10n }); // computes max fee implicitly\n\n // computes message estimate fee\n const estimatedMessageFee = await l2contract.estimateMessageFee("deposit", {\n from_address: L1_CONTRACT_ADDRESS,\n amount: 123,\n user: 1\n });\n});\n')),(0,r.kt)("h4",{id:"delegate-proxy"},"Delegate Proxy"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'it("should forward to the implementation contract", async function () {\n const implementationFactory = await starknet.getContractFactory("contract");\n const account = ...;\n const txHash = await account.declare(implementationFactory);\n const implementationClassHash = await implementationFactory.getClassHash();\n\n const proxyFactory = await starknet.getContractFactory("delegate_proxy");\n await account.declare(proxyFactory);\n const proxy = await account.deploy(proxyFactory, {\n implementation_hash_: implementationClassHash\n });\n\n proxy.setImplementation(implementationFactory);\n const { res: initialProxyBalance } = await proxy.call("get_balance");\n});\n')),(0,r.kt)("h4",{id:"transaction-information-and-receipt-with-events"},"Transaction information and receipt with events"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'it("should return transaction data and transaction receipt", async function () {\n const contract: StarknetContract = ...;\n console.log("Deployment transaction hash:", contract.deployTxHash);\n\n const transaction = await starknet.getTransaction(contract.deployTxHash);\n console.log(transaction);\n\n const account = ...;\n const txHash = await account.invoke(contract, "increase_balance", { amount: 10 });\n\n const receipt = await starknet.getTransactionReceipt(txHash);\n const decodedEvents = contract.decodeEvents(receipt.events);\n\n const txTrace = await starknet.getTransactionTrace(txHash);\n // decodedEvents contains hex data array converted to a structured object\n // { name: "increase_balance_called", data: { current_balance: 0n, amount: 10n } }\n});\n')),(0,r.kt)("p",null,"For more usage examples, including tuple, array and struct support, as well as Starknet CLI wallet support, check ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/sample-test.ts"},"sample-test.ts")," of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example"},"starknet-hardhat-example"),"."),(0,r.kt)("h3",{id:"devnet-examples"},"Devnet examples"),(0,r.kt)("h4",{id:"l1-l2-communication-postman-message-exchange-with-devnet"},"L1-L2 communication (Postman message exchange with Devnet)"),(0,r.kt)("p",null,"Exchanging messages between L1 (",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/ganache"},"Ganache"),", ",(0,r.kt)("a",{parentName:"p",href:"https://hardhat.org/hardhat-network/#running-stand-alone-in-order-to-support-wallets-and-other-software"},"Hardhat node"),", Ethereum testnet) and L2 (only supported for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"starknet-devnet"),") can be done using this plugin:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ensure there is an available L1 network and that you know its RPC endpoint URL."),(0,r.kt)("li",{parentName:"ul"},"Load an L1 Messaging contract using ",(0,r.kt)("inlineCode",{parentName:"li"},"starknet.devnet.loadL1MessagingContract"),"."),(0,r.kt)("li",{parentName:"ul"},"Call ",(0,r.kt)("inlineCode",{parentName:"li"},"starknet.devnet.flush")," after you ",(0,r.kt)("inlineCode",{parentName:"li"},"invoke")," your contract and want to propagate your message."),(0,r.kt)("li",{parentName:"ul"},"When running a hardhat test or script which relies on ",(0,r.kt)("inlineCode",{parentName:"li"},'network["config"]'),", specify the name of an L1 network you defined in ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config"),". Use ",(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat test --network "),". Network ",(0,r.kt)("inlineCode",{parentName:"li"},"localhost")," is predefined in hardhat so ",(0,r.kt)("inlineCode",{parentName:"li"},"--network localhost")," should work if you're using e.g. ",(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat node")," as the L1 network."),(0,r.kt)("li",{parentName:"ul"},"Check ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/postman.test.ts#L98"},"this example")," for more info.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},' it("should exchange messages with Devnet", async function() {\n await starknet.devnet.loadL1MessagingContract(...);\n\n // Exact syntax may vary depending on your L1 contract interaction library\n const l1contract = ...;\n const l2contract = ...;\n\n // If the L1 function is expected to send a message to L2,\n // it needs to be paid for by providing some value to the transaction\n await l1contract.send(..., {\n value: 1000 // pay for L1->L2 message\n });\n await starknet.devnet.flush();\n\n const account = ...;\n await account.invoke(l2contract, ...);\n await starknet.devnet.flush();\n });\n')),(0,r.kt)("h4",{id:"mock-message-between-l1-and-l2"},"Mock message between L1 and L2"),(0,r.kt)("p",null,"To send mock messages between L1 and L2 the following two functions can be used. Detailed example can be found ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/postman.test.ts#170"},"here"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"starknet.devnet.sendMessageToL2(...); // Sends message to L2\nstarknet.devnet.consumeMessageFromL2(...); // Sends message from L2 to L1\n")),(0,r.kt)("h4",{id:"restart"},"Restart"),(0,r.kt)("p",null,"Devnet can be restarted by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.restart()"),". All of the deployed contracts, blocks and storage updates will be restarted to the empty state."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.restart();\n")),(0,r.kt)("h4",{id:"dumping"},"Dumping"),(0,r.kt)("p",null,"Use ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.dump()")," to maintain the Devnet instance from the plugin."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.dump(path); // path to dump file (eg. dump.pkl)\n")),(0,r.kt)("h4",{id:"loading"},"Loading"),(0,r.kt)("p",null,"Dumped Devnet instance can be loaded using ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.load()"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.load(path); // path for dump file (eg. dump.pkl)\n")),(0,r.kt)("h4",{id:"advancing-time"},"Advancing time"),(0,r.kt)("p",null,"The plugin comes with support for ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/advancing-time"},"Devnet's timestamp management"),".\nThe time offset for each generated block can be increased by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.increaseTime()"),". The time for the next block can be set by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.setTime()"),", with subsequent blocks keeping the set offset."),(0,r.kt)("p",null,"Warning: ",(0,r.kt)("em",{parentName:"p"},"block time can be set in the past and lead to unexpected behaviour!")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.setTime(1000); // time in seconds\nawait starknet.devnet.increaseTime(1000); // time in seconds\n")),(0,r.kt)("h4",{id:"creating-an-empty-block"},"Creating an empty block"),(0,r.kt)("p",null,"Devnet offers ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/blocks#create-an-empty-block"},"empty block creation"),". It can be useful to make available those changes that take effect with the next block."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const emptyBlock = await starknet.devnet.createBlock();\n")),(0,r.kt)("h4",{id:"mint-tokens-to-an-account"},"Mint tokens to an account"),(0,r.kt)("p",null,"Devnet allows ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/mint-token#mint-with-a-transaction"},"minting token"),". You can call ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.mint")," like this"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const lite_mode = true; // Optional, Default true\nawait starknet.devnet.mint(account_address, 2e12, lite_mode);\n")),(0,r.kt)("h2",{id:"debugging-contracts"},"Debugging contracts"),(0,r.kt)("p",null,"To debug Starknet contracts, you can use ",(0,r.kt)("inlineCode",{parentName:"p"},"print()")," in cairo hints in your contract, and the printed lines will appear in Devnet's log."),(0,r.kt)("p",null,"Compile with ",(0,r.kt)("inlineCode",{parentName:"p"},"--disable-hint-validation")," flag to allow hints."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"hardhat starknet-compile-deprecated --disable-hint-validation\n")),(0,r.kt)("p",null,"For example, when calling the following ",(0,r.kt)("inlineCode",{parentName:"p"},"increase_balance")," with input ",(0,r.kt)("inlineCode",{parentName:"p"},"25"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-cairo"},'@external\nfunc increase_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(\n amount: felt\n) {\n let (res) = balance.read();\n %{ print( "Adding balance..." ) %}\n %{ print( ids.res ) %}\n balance.write(res + amount);\n let (afterUpdate) = balance.read();\n %{ print( ids.afterUpdate ) %}\n return ();\n}\n')),(0,r.kt)("p",null,"Devnet logs look like this,"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"Adding balance...\n0\n25\n")),(0,r.kt)("p",null,"If you want to have your debug lines printed in the same terminal as your hardhat script/test, use ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet")," with ",(0,r.kt)("inlineCode",{parentName:"p"},"stdout")," set to ",(0,r.kt)("inlineCode",{parentName:"p"},'"STDOUT"')," as documented in ",(0,r.kt)("a",{parentName:"p",href:"#runtime-network---integrated-devnet"},"runtime network")," section."),(0,r.kt)("h2",{id:"configure-the-plugin"},"Configure the plugin"),(0,r.kt)("p",null,"Specify custom configuration by editing your project's ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," (or ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.js"),")."),(0,r.kt)("h3",{id:"cairo-version"},"Cairo version"),(0,r.kt)("p",null,"Use this configuration option to select the ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo-lang"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," version used by the underlying Docker container."),(0,r.kt)("p",null,"A Docker image tailored to the machine will be pulled. The ",(0,r.kt)("inlineCode",{parentName:"p"},"-arm")," suffix will be applied to the version name, if it's not applied on ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts"),", if the device's architecture is ",(0,r.kt)("inlineCode",{parentName:"p"},"arm64"),". (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},'dockerizedVersion: "0.8.1-arm"')," and ",(0,r.kt)("inlineCode",{parentName:"p"},'dockerizedVersion: "0.8.1"')," both will work)."),(0,r.kt)("p",null,"If you specify neither ",(0,r.kt)("inlineCode",{parentName:"p"},"dockerizedVersion")," nor ",(0,r.kt)("a",{parentName:"p",href:"#existing-virtual-environment"},"venv"),", the latest dockerized version is used."),(0,r.kt)("p",null,"A list of available dockerized versions can be found ",(0,r.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/shardlabs/cairo-cli/tags"},"here"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n dockerizedVersion: "0.8.1"\n }\n ...\n};\n')),(0,r.kt)("h3",{id:"existing-virtual-environment"},"Existing virtual environment"),(0,r.kt)("p",null,"If you want to use an existing Python virtual environment (pyenv, poetry, conda, miniconda), specify it by using ",(0,r.kt)("inlineCode",{parentName:"p"},'starknet["venv"]'),"."),(0,r.kt)("p",null,"To use the currently activated environment (or if you have the starknet commands globally installed), set ",(0,r.kt)("inlineCode",{parentName:"p"},"venv")," to ",(0,r.kt)("inlineCode",{parentName:"p"},'"active"'),"."),(0,r.kt)("p",null,"In any case, the specified environment is expected to contain the ",(0,r.kt)("inlineCode",{parentName:"p"},"python3")," command."),(0,r.kt)("p",null,"If you are on a Mac, you may experience Docker-related issues, so this may be the only way to run the plugin."),(0,r.kt)("p",null,"If you specify neither ",(0,r.kt)("a",{parentName:"p",href:"#cairo-version"},"dockerizedVersion")," nor ",(0,r.kt)("inlineCode",{parentName:"p"},"venv"),", the latest dockerized version is used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n starknet: {\n // venv: "active" <- for the active virtual environment\n // venv: "path/to/my-venv" <- for env created with e.g. `python -m venv path/to/my-venv`\n venv: ""\n }\n};\n')),(0,r.kt)("h3",{id:"custom-cairo-1-compilation"},"Custom Cairo 1 compilation"),(0,r.kt)("p",null,"If you're using ",(0,r.kt)("inlineCode",{parentName:"p"},"dockerizedVersion"),", it will also use the dockerized Cairo 1 compiler version (currently alpha.6). To specify your custom Cairo 1 compiler, you need to provide the path to the directory with its binary executables (likely a subdirectory of the target directory of your compiler repo). This can be configured in ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," or in ",(0,r.kt)("a",{parentName:"p",href:"#starknet-compile"},"the CLI"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n starknet: {\n // if you build with `cargo build --bin starknet-compile --bin starknet-sierra-compile --release`\n cairo1BinDir: "path/to/compiler/target/release/"\n }\n};\n')),(0,r.kt)("h3",{id:"request-timeout"},"Request Timeout"),(0,r.kt)("p",null,"Default requestTimeout is 30s. It can be changed using the following configuration.\nYou may need to increase the timeout value in some situation (declaring large smart contract)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"module.exports = {\n starknet: {\n requestTimeout: 90_000 // 90s\n }\n};\n")),(0,r.kt)("h3",{id:"paths"},"Paths"),(0,r.kt)("p",null,"Prefer providing absolute paths when using the plugin. If a relative path is provided, it will be resolved relative to the root of the project."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n paths: {\n // Defaults to "contracts" (the same as `paths.sources`).\n starknetSources: "my-own-starknet-path",\n\n // Defaults to "starknet-artifacts".\n // Has to be different from the value set in `paths.artifacts` (which is used by core Hardhat and has a default value of `artifacts`).\n starknetArtifacts: "also-my-own-starknet-path",\n\n // Same purpose as the `--cairo-path` argument of the `starknet-compile-deprecated` command\n // Allows specifying the locations of imported files, if necessary.\n cairoPaths: ["my/own/cairo-path1", "also/my/own/cairo-path2"]\n }\n ...\n};\n')),(0,r.kt)("h3",{id:"runtime-network"},"Runtime network"),(0,r.kt)("p",null,"To set the network used in your Hardhat scripts/tests, use ",(0,r.kt)("inlineCode",{parentName:"p"},'starknet["network"]')," or the ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network")," CLI option. Not specifying one will default to using alpha-goerli. Do not confuse this network with Hardhat's default ",(0,r.kt)("inlineCode",{parentName:"p"},"--network")," option which refers to the L1 network."),(0,r.kt)("p",null,"A faster approach is to use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"starknet-devnet"),", a Ganache-like local testnet."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n network: "myNetwork"\n },\n networks: {\n devnet: { // this way you can also specify it with `--starknet-network devnet`\n url: "http://127.0.0.1:5050"\n }\n }\n ...\n};\n')),(0,r.kt)("p",null,"Predefined networks include ",(0,r.kt)("inlineCode",{parentName:"p"},"alpha-goerli"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"alpha-goerli2"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"alpha-mainnet")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet"),"."),(0,r.kt)("h3",{id:"runtime-network---integrated-devnet"},"Runtime network - Integrated Devnet"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"starknet-devnet")," is available out of the box as a starknet network called ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet"),". By default, it will spawn Devnet using its Docker image and listening on ",(0,r.kt)("inlineCode",{parentName:"p"},"http://127.0.0.1:5050"),". Target it via the hardhat config file or ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network integrated-devnet"),". Using ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet")," makes ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/fork/"},"forking of existing blockchains")," very easy."),(0,r.kt)("p",null,"By defining/modifying ",(0,r.kt)("inlineCode",{parentName:"p"},'networks["integratedDevnet"]')," in your hardhat config file, you can specify:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"the version of Devnet to use (effectively specifying the version of the underlying Docker image)"),(0,r.kt)("li",{parentName:"ul"},"a Python environment with installed starknet-devnet (can be active environment); this will avoid using the dockerized version"),(0,r.kt)("li",{parentName:"ul"},"CLI arguments to be used on Devnet startup: ",(0,r.kt)("a",{parentName:"li",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/run"},"options")),(0,r.kt)("li",{parentName:"ul"},"where output should be flushed ",(0,r.kt)("em",{parentName:"li"},"(either to the terminal or to a file)"),".")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n network: "integrated-devnet"\n },\n networks: {\n integratedDevnet: {\n url: "http://127.0.0.1:5050",\n\n // venv: "active" <- for the active virtual environment with installed starknet-devnet\n // venv: "path/to/venv" <- for env with installed starknet-devnet (created with e.g. `python -m venv path/to/venv`)\n venv: "",\n\n // use python or rust vm implementation\n // vmLang: "python" <- use python vm (default value)\n // vmLang: "rust" <- use rust vm\n // (rust vm is available out of the box using dockerized integrated-devnet)\n // (rustc and cairo-rs-py required using installed devnet)\n // read more here : https://0xspaceshard.github.io/starknet-devnet/docs/guide/run/#run-with-the-rust-implementation-of-cairo-vm\n vmLang: "",\n\n // or specify Docker image tag\n dockerizedVersion: "",\n\n // optional devnet CLI arguments, read more here: https://0xspaceshard.github.io/starknet-devnet/docs/guide/run\n args: ["--gas-price", "2000000000", "--fork-network", "alpha-goerli"],\n\n // stdout: "logs/stdout.log" <- dumps stdout to the file\n stdout: "STDOUT", // <- logs stdout to the terminal\n // stderr: "logs/stderr.log" <- dumps stderr to the file\n stderr: "STDERR" // <- logs stderr to the terminal\n }\n }\n ...\n};\n')),(0,r.kt)("h3",{id:"installing-third-party-libraries"},"Installing third-party libraries"),(0,r.kt)("p",null,"If you want to install a third-party Cairo library and be able to import it in your Cairo files, use the following pattern:"),(0,r.kt)("h4",{id:"with-npm-packages"},"With npm packages:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install (example package: ",(0,r.kt)("inlineCode",{parentName:"li"},"influenceth__cairo_math_64x61@npm:@influenceth/cairo-math-64x61"),")")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"npm install --save-dev influenceth__cairo_math_64x61@npm:@influenceth/cairo-math-64x61\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Edit the ",(0,r.kt)("inlineCode",{parentName:"li"},"paths.cairoPaths")," section of your ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config")," file (",(0,r.kt)("a",{parentName:"li",href:"#paths"},"docs"),"):")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'paths: {\n cairoPaths: ["./node_modules"];\n}\n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Import")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"from influenceth__cairo_math_64x61.contracts.Math64x61 import Math64x61_ONE, Math64x61_mul\n")),(0,r.kt)("h4",{id:"with-pip-packages"},"With pip packages:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install (example package: ",(0,r.kt)("inlineCode",{parentName:"li"},"openzeppelin-cairo-contracts"),")")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pip install openzeppelin-cairo-contracts\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"If you are installing in a virtual environment, edit the ",(0,r.kt)("inlineCode",{parentName:"li"},"paths.cairoPaths")," section of your ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config")," file (",(0,r.kt)("a",{parentName:"li",href:"#paths"},"docs"),") as:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'paths: {\n // this directory contains the openzeppelin directory\n cairoPaths: ["path/to/cairo_venv/lib/python3.8/site-packages"],\n}\n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Import")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"from openzeppelin.token.erc20.library import ERC20\n")),(0,r.kt)("h4",{id:"with-non-npm-git-repositories"},"With non-npm git repositories:"),(0,r.kt)("p",null,"If you want to install directly from a git repo that doesn't contain ",(0,r.kt)("inlineCode",{parentName:"p"},"package.json"),", you cannot use ",(0,r.kt)("inlineCode",{parentName:"p"},"npm i"),". However, ",(0,r.kt)("inlineCode",{parentName:"p"},"yarn")," supports this."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install (example package: ",(0,r.kt)("inlineCode",{parentName:"li"},"https://github.com/OpenZeppelin/cairo-contracts"),")")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"yarn add openzeppelin__cairo_contracts@git+https://git@github.com/OpenZeppelin/cairo-contracts.git\n")),(0,r.kt)("h3",{id:"using-starknetgetcontractfactory-with-third-party-libraries"},"Using ",(0,r.kt)("inlineCode",{parentName:"h3"},"starknet.getContractFactory")," with third-party libraries"),(0,r.kt)("p",null,"This paragraph assumes you've read and run ",(0,r.kt)("a",{parentName:"p",href:"#Installing-third-party-libraries"},"3rd party library installation"),".\nThe example package used is ",(0,r.kt)("inlineCode",{parentName:"p"},"https://github.com/OpenZeppelin/cairo-contracts")," so you may want to check ",(0,r.kt)("a",{parentName:"p",href:"#With-non-npm-git-repositories"},"non-npm git repos"),"."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Compile")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-compile-deprecated node_modules/openzeppelin__cairo_contracts/src/openzeppelin/token/erc20/presets/ERC20.cairo\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Get contract factory")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'const contractFactory = await starknet.getContractFactory(\n "node_modules/openzeppelin__cairo_contracts/src/openzeppelin/token/erc20/presets/ERC20"\n);\n')),(0,r.kt)("h3",{id:"wallet---starknet-cli"},"Wallet - Starknet CLI"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"ATTENTION!")," Use this only if you want to achieve compatibility with the wallet used in Starknet CLI. For all other uses, ",(0,r.kt)("a",{parentName:"p",href:"#account"},"these accounts")," should suffice."),(0,r.kt)("p",null,"To configure a wallet for your project, specify it by adding an entry to ",(0,r.kt)("inlineCode",{parentName:"p"},"wallets")," in your hardhat config file.\nYou can specify multiple wallets/accounts."),(0,r.kt)("p",null,"The parameters for the wallet are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"accountName"),": The name to give the account. If omitted, the default value ",(0,r.kt)("inlineCode",{parentName:"li"},"__default__")," will be used;"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"modulePath"),": The python module and wallet class of your chosen wallet provider;"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"accountPath"),": The path where your wallet information will be saved.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n wallets: {\n MyWallet: {\n accountName: "OpenZeppelin",\n modulePath: "starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount",\n accountPath: "~/.starknet_accounts"\n },\n AnotherWallet: {\n accountName: "AnotherOpenZeppelin",\n modulePath: "starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount",\n accountPath: "~/.starknet_accounts"\n }\n }\n }\n ...\n};\n')),(0,r.kt)("p",null,"Accounts are deployed in the same network as the one passed as an argument to the ",(0,r.kt)("inlineCode",{parentName:"p"},"npx hardhat starknet-deploy-account")," CLI command."),(0,r.kt)("p",null,"To use the wallet in your scripts, use the ",(0,r.kt)("inlineCode",{parentName:"p"},"getWallet")," utility function (using ",(0,r.kt)("inlineCode",{parentName:"p"},"Account.getAccountFromAddress(...)")," will probably not work):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\n...\nconst wallet = starknet.getWallet("MyWallet");\nconst contract = ...;\nawait contract.invoke("increase_balance", { amount: 1 }, { wallet });\n')),(0,r.kt)("h2",{id:"recompilation"},"Recompilation"),(0,r.kt)("p",null,"Recompilation is performed when contracts are updated or when artifacts are missing. A file will be created with the name ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo-files-cache.json")," to handle caching. Recompilation is handled before the following ",(0,r.kt)("a",{parentName:"p",href:"#cli-commands"},"CLI commands")," are executed."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat run")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat test"))),(0,r.kt)("p",null,"This feature is turned off by default and is specified in the ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," file."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"module.exports = {\n starknet: {\n recompile: true // <- to switch recompilation on\n }\n};\n")),(0,r.kt)("h2",{id:"account"},"Account"),(0,r.kt)("p",null,"In Starknet, an account is a contract through which you interact with other contracts.\nIts usage is exemplified ",(0,r.kt)("a",{parentName:"p",href:"#accounts"},"earlier in the docs")," and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/plugin/test/oz-account-test.ts"},"in the example repo"),"."),(0,r.kt)("p",null,"There are several Starknet account implementations; this plugin supports the following as properties of ",(0,r.kt)("inlineCode",{parentName:"p"},"hre.starknet"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"OpenZeppelinAccount")," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/OpenZeppelin/cairo-contracts/releases/tag/v0.5.1"},"v0.5.1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ArgentAccount")," - Commit ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/argentlabs/argent-contracts-starknet/tree/780760e4156afe592bb1feff7e769cf279ae9831"},"780760e")," of branch develop.")),(0,r.kt)("h3",{id:"create-account"},"Create account"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\nconst account = await starknet.OpenZeppelinAccount.createAccount();\nconst accountFromOptions = await starknet.OpenZeppelinAccount.createAccount({\n salt: "0x123", // salt to always deploy to an expected address\n privateKey: process.env.MY_KEY // the key only known to you, the public key will be inferred\n});\nconsole.log(account.address);\n')),(0,r.kt)("h3",{id:"fund-account"},"Fund account"),(0,r.kt)("p",null,"After creating the account, you need to fund it (give it some ETH):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"On alpha-goerli use ",(0,r.kt)("a",{parentName:"li",href:"https://faucet.goerli.starknet.io/"},"this faucet"),"."),(0,r.kt)("li",{parentName:"ul"},"On alpha-goerli2 use ",(0,r.kt)("a",{parentName:"li",href:"https://www.newton.so/view/636d020159c30b8efc8d1d86"},"this")),(0,r.kt)("li",{parentName:"ul"},"On starknet-devnet call ",(0,r.kt)("a",{parentName:"li",href:"#mint-tokens-to-an-account"},(0,r.kt)("inlineCode",{parentName:"a"},"starknet.devnet.mint()"))," which uses ",(0,r.kt)("a",{parentName:"li",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/mint-token/"},"devnet faucet"),"."),(0,r.kt)("li",{parentName:"ul"},"Alternatively transfer some amount from an already funded account to the newly deployed account.")),(0,r.kt)("p",null,"If you're facing issues loading the account you've just funded, check out ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/issues/281#issuecomment-1354588817"},"this issue"),"."),(0,r.kt)("h3",{id:"get-balance"},"Get balance"),(0,r.kt)("p",null,"To find out the balance of your account on the current Starknet network, you can use ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.getBalance"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\nconst someBalance = starknet.getBalance("0x123...def")\nconst myAccount = ...;\nconst myAccountBalance = starknet.getBalance(myAccount.address);\n')),(0,r.kt)("h3",{id:"deploy-account"},"Deploy account"),(0,r.kt)("p",null,"After funding the account, you need to deploy it (in case of ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount"),", this will also take care of initialization):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await account.deployAccount({ maxFee: ... });\n")),(0,r.kt)("p",null,"Alternatively deploy your account by running ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/scripts/deploy-account.ts"},"this script"),"."),(0,r.kt)("p",null,"To successfully deploy ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount"),", the chain you are interacting with is expected to have ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount")," contracts declared. Alpha Goerli and Alpha Mainnet satisfy this criterion, but if you're working with Devnet, this is most easily achievable by running Devnet ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/fork"},"forked")," from e.g. Alpha Goerli."),(0,r.kt)("h3",{id:"reuse-account"},"Reuse account"),(0,r.kt)("p",null,"To retrieve an already deployed Account, use the ",(0,r.kt)("inlineCode",{parentName:"p"},"getAccountFromAddress")," method. Do not use this method for accounts deployed by e.g. Starknet CLI (those are modified OZ accounts that are not compatible with the OZ version supported by this plugin). What may be especially useful are ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/Predeployed-accounts"},"predeployed+predefined accounts")," that come with Devnet (retrieve them with ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.getPredeployedAccounts()"),")."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const account = await starknet.OpenZeppelinAccount.getAccountFromAddress(\n accountAddress,\n process.env.PRIVATE_KEY\n);\n")),(0,r.kt)("h3",{id:"interact-through-account"},"Interact through account"),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"invoke")," method of ",(0,r.kt)("inlineCode",{parentName:"p"},"Account")," to invoke (change the state), but ",(0,r.kt)("inlineCode",{parentName:"p"},"call")," method of ",(0,r.kt)("inlineCode",{parentName:"p"},"StarknetContract")," to call (read the state)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'await account.invoke(contract, "increase_balance", { amount });\nconst { res: amount } = await contract.call("get_balance");\n')),(0,r.kt)("p",null,"Once your account is funded and deployed, you can specify a max fee greater than zero:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'await account.invoke(contract, "foo", { arg1: ... }, { maxFee: BigInt(...) });\n')),(0,r.kt)("p",null,"If you don't specify a ",(0,r.kt)("inlineCode",{parentName:"p"},"maxFee"),", one will be calculated for you by applying an overhead of 50% to the result of fee estimation. You can also customize the overhead by providing a value for ",(0,r.kt)("inlineCode",{parentName:"p"},"overhead"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'// maxFee will be 40% of estimated fee; if overhead not provided, the default value is used.\nawait account.invoke(contract, "foo", { arg1: ... }, { overhead: 0.4 });\n')),(0,r.kt)("p",null,"Set the ",(0,r.kt)("inlineCode",{parentName:"p"},"rawInput")," option to ",(0,r.kt)("inlineCode",{parentName:"p"},"true")," to suppress validation of the args passed to the contract function:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'// pass a direct array\nawait account.invoke(contract, "foo", ["10", "20"], { rawInput: true });\nawait contract.call("bar", ["30", "40"], { rawInput: true });\n')),(0,r.kt)("h3",{id:"multicalls"},"Multicalls"),(0,r.kt)("p",null,"You can also use the Account object to perform multi{invokes, fee estimations}."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'const interactionArray = [\n {\n toContract: contract1,\n functionName: "increase_balance",\n calldata: { amount: 10n }\n },\n {\n toContract: contract2,\n functionName: "increase_balance",\n calldata: { amount: 20n }\n }\n];\nconst fee = await account.multiEstimateFee(interactionArray);\nconst txHash = await account.multiInvoke(interactionArray);\n')),(0,r.kt)("h3",{id:"guardian"},"Guardian"),(0,r.kt)("p",null,"Unlike OpenZeppelin account, Argent account offers ",(0,r.kt)("a",{parentName:"p",href:"https://support.argent.xyz/hc/en-us/articles/360022631992-About-guardians"},"guardian functionality"),". The guardian is by default not set (the guardian key is undefined), but if you want to change it, cast the ",(0,r.kt)("inlineCode",{parentName:"p"},"account")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount")," and execute ",(0,r.kt)("inlineCode",{parentName:"p"},"setGuardian"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await argentAccount.setGuardian(process.env.GUARDIAN_PRIVATE_KEY, { maxFee: 1e18 });\n// to unset it, use an undefined key\nawait argentAccount.setGuardian(undefined, { maxFee: 1e18 });\n")),(0,r.kt)("h2",{id:"more-examples"},"More examples"),(0,r.kt)("p",null,"An example Hardhat project using this plugin can be found ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example"},"here"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0e384e19.c57f202e.js b/assets/js/0e384e19.c57f202e.js new file mode 100644 index 00000000..a11f7a61 --- /dev/null +++ b/assets/js/0e384e19.c57f202e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[671],{3905:(e,t,a)=>{a.d(t,{Zo:()=>p,kt:()=>h});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 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 o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},d="mdxType",u={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,r=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=c(a),m=r,h=d["".concat(s,".").concat(m)]||d[m]||u[m]||i;return a?n.createElement(h,o(o({ref:t},p),{},{components:a})):n.createElement(h,o({ref:t},p))}));function h(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[d]="string"==typeof e?e:r,o[1]=l;for(var c=2;c{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=a(7462),r=(a(7294),a(3905));const i={},o="Starknet Hardhat Plugin",l={unversionedId:"intro",id:"intro",title:"Starknet Hardhat Plugin",description:"npm package",source:"@site/docs/intro.md",sourceDirName:".",slug:"/intro",permalink:"/starknet-hardhat-plugin/docs/intro",draft:!1,editUrl:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/docs/docs/intro.md",tags:[],version:"current",frontMatter:{}},s={},c=[{value:"Contents",id:"contents",level:2},{value:"Install",id:"install",level:2},{value:"Requirements",id:"requirements",level:3},{value:"CLI commands",id:"cli-commands",level:2},{value:"starknet-compile-deprecated",id:"starknet-compile-deprecated",level:3},{value:"starknet-compile",id:"starknet-compile",level:3},{value:"starknet-build",id:"starknet-build",level:3},{value:"starknet-verify",id:"starknet-verify",level:3},{value:"starknet-new-account",id:"starknet-new-account",level:3},{value:"starknet-deploy-account",id:"starknet-deploy-account",level:3},{value:"starknet-plugin-version",id:"starknet-plugin-version",level:3},{value:"migrate",id:"migrate",level:3},{value:"run",id:"run",level:3},{value:"amarna",id:"amarna",level:3},{value:"test",id:"test",level:3},{value:"API",id:"api",level:2},{value:"Testing",id:"testing",level:2},{value:"Important notes",id:"important-notes",level:3},{value:"Test examples",id:"test-examples",level:3},{value:"Setup",id:"setup",level:4},{value:"Deploy / load contract",id:"deploy--load-contract",level:4},{value:"Arrays",id:"arrays",level:4},{value:"Tuples",id:"tuples",level:4},{value:"Fee estimation",id:"fee-estimation",level:4},{value:"Delegate Proxy",id:"delegate-proxy",level:4},{value:"Transaction information and receipt with events",id:"transaction-information-and-receipt-with-events",level:4},{value:"Devnet examples",id:"devnet-examples",level:3},{value:"L1-L2 communication (Postman message exchange with Devnet)",id:"l1-l2-communication-postman-message-exchange-with-devnet",level:4},{value:"Mock message between L1 and L2",id:"mock-message-between-l1-and-l2",level:4},{value:"Restart",id:"restart",level:4},{value:"Dumping",id:"dumping",level:4},{value:"Loading",id:"loading",level:4},{value:"Advancing time",id:"advancing-time",level:4},{value:"Creating an empty block",id:"creating-an-empty-block",level:4},{value:"Mint tokens to an account",id:"mint-tokens-to-an-account",level:4},{value:"Debugging contracts",id:"debugging-contracts",level:2},{value:"Configure the plugin",id:"configure-the-plugin",level:2},{value:"Cairo version",id:"cairo-version",level:3},{value:"Existing virtual environment",id:"existing-virtual-environment",level:3},{value:"Single Cairo 1 file compilation",id:"single-cairo-1-file-compilation",level:3},{value:"Building Cairo 1 projects",id:"building-cairo-1-projects",level:3},{value:"Request Timeout",id:"request-timeout",level:3},{value:"Paths",id:"paths",level:3},{value:"Runtime network",id:"runtime-network",level:3},{value:"Runtime network - Integrated Devnet",id:"runtime-network---integrated-devnet",level:3},{value:"Installing third-party libraries",id:"installing-third-party-libraries",level:3},{value:"With npm packages:",id:"with-npm-packages",level:4},{value:"With pip packages:",id:"with-pip-packages",level:4},{value:"With non-npm git repositories:",id:"with-non-npm-git-repositories",level:4},{value:"Using starknet.getContractFactory with third-party libraries",id:"using-starknetgetcontractfactory-with-third-party-libraries",level:3},{value:"Wallet - Starknet CLI",id:"wallet---starknet-cli",level:3},{value:"Recompilation",id:"recompilation",level:2},{value:"Account",id:"account",level:2},{value:"Create account",id:"create-account",level:3},{value:"Fund account",id:"fund-account",level:3},{value:"Get balance",id:"get-balance",level:3},{value:"Deploy account",id:"deploy-account",level:3},{value:"Reuse account",id:"reuse-account",level:3},{value:"Interact through account",id:"interact-through-account",level:3},{value:"Multicalls",id:"multicalls",level:3},{value:"Guardian",id:"guardian",level:3},{value:"More examples",id:"more-examples",level:2}],p={toc:c},d="wrapper";function u(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:"starknet-hardhat-plugin"},"Starknet Hardhat Plugin"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin"},(0,r.kt)("img",{parentName:"a",src:"https://img.shields.io/npm/v/@shardlabs/starknet-hardhat-plugin?color=blue",alt:"npm package"}))),(0,r.kt)("p",null,"If you've used Hardhat \ud83d\udc77\u200d\u2640\ufe0f\ud83d\udc77\u200d\u2642\ufe0f and want to develop for Starknet ",(0,r.kt)("img",{src:"https://starkware.co/wp-content/uploads/2021/07/Group-177.svg",alt:"starknet",width:"18"}),", this plugin might come in hand. If you've never set up a Hardhat project, check out ",(0,r.kt)("a",{parentName:"p",href:"https://hardhat.org/tutorial/creating-a-new-hardhat-project.html"},"this guide"),"."),(0,r.kt)("h2",{id:"contents"},"Contents"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#install"},"Install")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#cli-commands"},"CLI commands")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#api"},"API")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#testing"},"Testing"),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#important-notes"},"Important notes")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#test-examples"},"Examples")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#devnet-examples"},"Devnet examples")))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#debugging-contracts"},"Debugging contracts")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#configure-the-plugin"},"Configure the plugin")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#account"},"Account support")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#more-examples"},"More examples")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#contribute"},"Contribute"))),(0,r.kt)("h2",{id:"install"},"Install"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"npm i @shardlabs/starknet-hardhat-plugin --save-dev\n")),(0,r.kt)("p",null,"For the latest unstable version, use"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"npm i @shardlabs/starknet-hardhat-plugin@alpha --save-dev\n")),(0,r.kt)("p",null,"Add the following line to the top of your ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," (or ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.js"),"):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import "@shardlabs/starknet-hardhat-plugin";\n// or\nrequire("@shardlabs/starknet-hardhat-plugin");\n')),(0,r.kt)("h3",{id:"requirements"},"Requirements"),(0,r.kt)("p",null,"This plugin was tested with:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Node.js v14.17.3"),(0,r.kt)("li",{parentName:"ul"},"npm/npx v7.19.1"),(0,r.kt)("li",{parentName:"ul"},"Docker v20.10.8 (optional):",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Since plugin version 0.3.4, Docker is no longer necessary if you opt for a Python environment (more info in ",(0,r.kt)("a",{parentName:"li",href:"#cairo-version"},"Config"),")."),(0,r.kt)("li",{parentName:"ul"},"If you opt for the containerized version, make sure you have a running Docker daemon."),(0,r.kt)("li",{parentName:"ul"},"If you're experiencing Docker access issues, check ",(0,r.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/52364905/after-executing-following-code-of-dockerode-npm-getting-error-connect-eacces-v"},"this"),"."))),(0,r.kt)("li",{parentName:"ul"},"Linux / macOS:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"On Windows, we recommend using ",(0,r.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"WSL 2")," with Docker instance installed on ",(0,r.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/windows/wsl/install"},"WSL 2")," instead of using Docker Desktop on your windows. Example installation for Ubuntu can be found ",(0,r.kt)("a",{parentName:"li",href:"https://docs.docker.com/engine/install/ubuntu/"},"here"),".")))),(0,r.kt)("h2",{id:"cli-commands"},"CLI commands"),(0,r.kt)("p",null,"This plugin defines the following Hardhat commands (also called tasks):"),(0,r.kt)("h3",{id:"starknet-compile-deprecated"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-compile-deprecated")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},'$ npx hardhat starknet-compile-deprecated [PATH...] [--cairo-path "::..."] [--account-contract] [--disable-hint-validation]\n')),(0,r.kt)("p",null,"Compiles Starknet Cairo 0 contracts. If no paths are provided, all Starknet contracts in the default contracts directory are compiled. Paths can be files and directories."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"--cairo-path")," allows specifying the locations of imported files, if necessary. Separate them with a colon (:), e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"--cairo-path='path/to/lib1:path/to/lib2'")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"--account-contract")," allows compiling an account contract."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"--disable-hint-validation")," allows compiling a contract without hint validation (any python code is allowed in hints, ex: print ...)."),(0,r.kt)("h3",{id:"starknet-compile"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-compile")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-compile [PATH...] [--add-pythonic-hints] [--replace-ids] [--allowed-libfuncs-list-file] [--allowed-libfuncs-list-name] [--cairo1-bin-dir ]\n")),(0,r.kt)("p",null,"Compiles Starknet Cairo 1 contracts in the provided path. Paths can be files and directories. Currently, contracts importing other contracts are not supported (until this is supported, you may try to use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/software-mansion/scarb"},"Scarb")," and modifying its artifacts to be compatible with this plugin)."),(0,r.kt)("p",null,"By default, the dockerized Cairo 1 compiler is used. In ",(0,r.kt)("a",{parentName:"p",href:"#existing-virtual-environment"},"venv mode"),", you can use a custom compiler by providing the path of the directory of its binary executable to ",(0,r.kt)("inlineCode",{parentName:"p"},"--cairo1-bin-dir")," or to the ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo1BinDir")," option in your hardhat config file. Other CLI options are the same as in the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/starkware-libs/cairo"},"native Cairo compiler"),"."),(0,r.kt)("p",null,"To build more complex Cairo 1 projects, read about ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat starknet-build"),"."),(0,r.kt)("h3",{id:"starknet-build"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-build")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-build [PATH...] [--scarb-command ] [--skip-validate]\n")),(0,r.kt)("p",null,"Builds Scarb projects."),(0,r.kt)("p",null,"Each of the provided paths is recursively looked into while searching for Scarb projects. If no paths are provided, the default contracts directory is traversed."),(0,r.kt)("p",null,"Each project must be a valid Scarb project with lib.cairo and Scarb.toml in its root. The toml file must have ",(0,r.kt)("inlineCode",{parentName:"p"},"sierra")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"casm")," set to ",(0,r.kt)("inlineCode",{parentName:"p"},"true")," under ",(0,r.kt)("inlineCode",{parentName:"p"},"[[target.starknet-contract]]"),". If you know what you are doing, you can skip the validation by providing ",(0,r.kt)("inlineCode",{parentName:"p"},"--skip-validate"),"."),(0,r.kt)("p",null,"In code, load the generated contracts with an underscore-separated string:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'starknet.getContractFactory("_");\n')),(0,r.kt)("p",null,"E.g. if your toml specifies ",(0,r.kt)("inlineCode",{parentName:"p"},"name = MyPackage")," and there is a contract called FooContract in your source files, you would load it with:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'// alternatively prepend the directory name to avoid ambiguity, but be sure to apply the underscore syntax\nstarknet.getContractFactory("MyPackage_FooContract");\n')),(0,r.kt)("p",null,"The name of the file where the contract was defined doesn't play a role."),(0,r.kt)("p",null,"The plugin doesn't have a default Scarb command yet (a dockerized wrapper will be supported soon). You need to provide a ",(0,r.kt)("inlineCode",{parentName:"p"},"scarbCommand")," (either an exact command or the path to it) under ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," in your hardhat config file, or you can override that via ",(0,r.kt)("inlineCode",{parentName:"p"},"--scarb-command "),"."),(0,r.kt)("h3",{id:"starknet-verify"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-verify")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-verify [--starknet-network ] [--path ] [ ...] [--address ] [--compiler-version ] [--license ] [--contract-name ] [--account-contract]\n")),(0,r.kt)("p",null,"Queries ",(0,r.kt)("a",{parentName:"p",href:"https://voyager.online/"},"Voyager")," to ",(0,r.kt)("a",{parentName:"p",href:"https://voyager.online/verifyContract"},"verify the contract")," deployed at ",(0,r.kt)("inlineCode",{parentName:"p"},"")," using the source files at ",(0,r.kt)("inlineCode",{parentName:"p"},"")," and any number of ",(0,r.kt)("inlineCode",{parentName:"p"},""),"."),(0,r.kt)("p",null,"Like in the previous command, this plugin relies on ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network"),", but will default to 'alphaGoerli' network in case this parameter is not passed."),(0,r.kt)("p",null,"The verifier expects ",(0,r.kt)("inlineCode",{parentName:"p"},"")," to be passed on request. Supported compiler versions are listed ",(0,r.kt)("a",{parentName:"p",href:"https://voyager.online/verifyContract"},"here")," in the dropdown menu."),(0,r.kt)("p",null,"We pass ",(0,r.kt)("inlineCode",{parentName:"p"},"--account-contract")," to tell the verifier that the contract is of type account."),(0,r.kt)("p",null,"For ",(0,r.kt)("inlineCode",{parentName:"p"},"")," the command takes ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/github/choosealicense.com/blob/a40ef42140d137770161addf4fefc715709d8ccd/no-permission.md"},(0,r.kt)("em",{parentName:"a"},"No License (None)"))," as default license scheme. ",(0,r.kt)("a",{parentName:"p",href:"https://goerli.voyager.online/cairo-licenses"},"Here")," is a list of available options."),(0,r.kt)("h3",{id:"starknet-new-account"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-new-account")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"ATTENTION!")," Use this only if you want to achieve compatibility with the wallet used in Starknet CLI. For all other uses, ",(0,r.kt)("a",{parentName:"p",href:"#account"},"these accounts")," should suffice."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-new-account [--starknet-network ] [--wallet ]\n")),(0,r.kt)("p",null,"Initializes a wallet ",(0,r.kt)("inlineCode",{parentName:"p"},'wallets["WALLET_NAME"]')," configured in the ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config")," file, which should then be followed by the command ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet-deploy-account"),". Uses the modified OZ implementation used by Starknet CLI."),(0,r.kt)("h3",{id:"starknet-deploy-account"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-deploy-account")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-deploy-account [--starknet-network ] [--wallet ]\n")),(0,r.kt)("p",null,"Deploys the wallet ",(0,r.kt)("inlineCode",{parentName:"p"},'wallets["WALLET_NAME"]')," configured in the ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config")," file. Uses the modified OZ implementation used by Starknet CLI. ",(0,r.kt)("em",{parentName:"p"},"Needs to be funded before deploying it.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-deploy-account --starknet-network myNetwork --wallet MyWallet\n")),(0,r.kt)("h3",{id:"starknet-plugin-version"},(0,r.kt)("inlineCode",{parentName:"h3"},"starknet-plugin-version")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-plugin-version\n")),(0,r.kt)("p",null,"Prints the version of the plugin."),(0,r.kt)("h3",{id:"migrate"},(0,r.kt)("inlineCode",{parentName:"h3"},"migrate")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat migrate [PATH...] [--inplace]\n")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"NOT APPLICABLE TO CAIRO 1")),(0,r.kt)("p",null,"Converts old syntax to Cairo 0.10 syntax. The ",(0,r.kt)("inlineCode",{parentName:"p"},"--inplace")," flag will change the contract file in place."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat migrate --inplace contract/contract.cairo\n")),(0,r.kt)("h3",{id:"run"},(0,r.kt)("inlineCode",{parentName:"h3"},"run")),(0,r.kt)("p",null,"Using ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network")," with ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat run")," currently does not have effect. Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"network")," property of the ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," object in your hardhat config file."),(0,r.kt)("h3",{id:"amarna"},(0,r.kt)("inlineCode",{parentName:"h3"},"amarna")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"$ npx hardhat amarna\n")),(0,r.kt)("p",null,"Runs ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/crytic/amarna"},"Amarna"),", the static-analyzer and linter for Cairo, in a Docker container. The output from amarna goes in ",(0,r.kt)("inlineCode",{parentName:"p"},"out.sarif")," file.\nUse flag ",(0,r.kt)("inlineCode",{parentName:"p"},"--script")," to run custom ",(0,r.kt)("inlineCode",{parentName:"p"},"./amarna.sh")," file to use Amarna with custom rules and args."),(0,r.kt)("p",null,"You need to have Docker installed and running to use ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat amarna"),"."),(0,r.kt)("h3",{id:"test"},(0,r.kt)("inlineCode",{parentName:"h3"},"test")),(0,r.kt)("p",null,"Introduces the ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network")," option to the existing ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat test")," task."),(0,r.kt)("h2",{id:"api"},"API"),(0,r.kt)("p",null,"Adding this plugin to your project expands Hardhat's runtime with a ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," object. It can be imported with:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\n// or\nconst starknet = require("hardhat").starknet;\n')),(0,r.kt)("p",null,"To see all the utilities introduced by the ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," object, check ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/types/starknet.ts"},"this")," out."),(0,r.kt)("h2",{id:"testing"},"Testing"),(0,r.kt)("p",null,"Relying on the above described API makes it easier to interact with your contracts and test them."),(0,r.kt)("p",null,"To test Starknet contracts with Mocha, use the regular Hardhat ",(0,r.kt)("inlineCode",{parentName:"p"},"test")," task which expects test files in your designated test directory:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat test\n")),(0,r.kt)("p",null,"Read more about the network used in tests in the ",(0,r.kt)("a",{parentName:"p",href:"#runtime-network"},"Runtime network")," section.\nThese examples are inspired by the official ",(0,r.kt)("a",{parentName:"p",href:"https://www.cairo-lang.org/docs/hello_starknet/unit_tests.html"},"Starknet Python tutorial"),"."),(0,r.kt)("h3",{id:"important-notes"},"Important notes"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"BigInt")," is used because ",(0,r.kt)("inlineCode",{parentName:"li"},"felt")," may be too big for javascript. Use it like ",(0,r.kt)("inlineCode",{parentName:"li"},'BigInt("10")')," or, since ES2020, like ",(0,r.kt)("inlineCode",{parentName:"li"},"10n"),"."),(0,r.kt)("li",{parentName:"ul"},"All function names, argument names and return value names should be referred to by the names specified in contract source files."),(0,r.kt)("li",{parentName:"ul"},"The argument of ",(0,r.kt)("inlineCode",{parentName:"li"},"getContractFactory")," is the ",(0,r.kt)("strong",{parentName:"li"},"name")," or the ",(0,r.kt)("strong",{parentName:"li"},"path")," of the source of the target contract:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"if providing a path, it should be relative to the project root or the contracts directory:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("contracts/subdir/MyContract.cairo")')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("subdir/MyContract.cairo")')))),(0,r.kt)("li",{parentName:"ul"},"the extension can be omitted:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("subdir/MyContract")')),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},'getContractFactory("MyContract")')))))),(0,r.kt)("li",{parentName:"ul"},"Nested arrays are currently not supported (eg. ",(0,r.kt)("inlineCode",{parentName:"li"},"core::array::Array::>"),")")),(0,r.kt)("h3",{id:"test-examples"},"Test examples"),(0,r.kt)("h4",{id:"setup"},"Setup"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { expect } from "chai";\nimport { starknet } from "hardhat";\n// or\nconst expect = require("chai").expect;\nconst starknet = require("hardhat").starknet;\n\ndescribe("My Test", function () {\n this.timeout(...); // Recommended to use a big value if interacting with Alpha Goerli\n')),(0,r.kt)("h4",{id:"deploy--load-contract"},"Deploy / load contract"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},' /**\n * Assumes there is a file MyContract.cairo whose compilation artifacts have been generated.\n * The contract is assumed to have:\n * - constructor function constructor(initial_balance: felt)\n * - external function increase_balance(amount: felt) -> (res: felt)\n * - view function get_balance() -> (res: felt)\n */\n it("should load a previously deployed contract", async function () {\n const contractFactory = await starknet.getContractFactory("MyContract");\n const contract = contractFactory.getContractAt("0x123..."); // address of a previously deployed contract\n });\n\n it("should declare class and deploy", async function() {\n // not compatible with accounts deployed with Starknet CLI\n const account = await starknet.OpenZeppelinAccount.getAccountFromAddress(...);\n const contractFactory = await starknet.getContractFactory("MyContract");\n // will call declare version 2 if contract is cairo 1\n const txHash = await account.declare(contractFactory); // class declaration\n const classHash = await contractFactory.getClassHash();\n\n const constructorArgs = { initial_balance: 0 };\n const options = { maxFee: ... };\n // implicitly invokes UDC\n const contract = await account.deploy(contractFactory, constructorArgs, options);\n });\n')),(0,r.kt)("h4",{id:"arrays"},"Arrays"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'/**\n * The contract is assumed to have:\n * - view function sum_array(a_len: felt, a: felt*) -> (res: felt)\n */\nit("should work with arrays", async function () {\n const contract = ...;\n // you don\'t have to specify the array length separately\n const { res } = await contract.call("sum_array", { a: [1, 2, 3] });\n expect(res).to.deep.equal(BigInt(6));\n});\n')),(0,r.kt)("h4",{id:"tuples"},"Tuples"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'/**\n * The contract is assumed to have:\n * - view function sum_pair(pair: (felt, felt)) -> (res : felt)\n * - view func sum_named_pair(pair : (x : felt, y : felt) -> (res : felt)\n * - using PairAlias = (x : felt, y : felt)\n * - view func sum_type_alias(pair : PairAlias) -> (res : felt)\n */\nit("should work with tuples", async function () {\n const contract = ...;\n // notice how the pair tuple is passed as javascript array\n const { res } = await contract.call("sum_pair", { pair: [10, 20] });\n ... = await contract.call("sum_named_pair", { pair: { x: 10, y: 20 } });\n ... = await contract.call("sum_type_alias", { pair: { x: 10, y: 20 } });\n expect(res).to.deep.equal(BigInt(30));\n});\n')),(0,r.kt)("h4",{id:"fee-estimation"},"Fee estimation"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'it("should estimate fee", async function () {\n const account = await starknet.OpenZeppelinAccount.createAccount({\n salt: "0x42",\n privateKey: OZ_ACCOUNT_PRIVATE_KEY\n });\n\n const estimatedFee = await account.estimateDeployAccountFee();\n await account.deployAccount(); // computes max fee implicitly\n\n // Every fee estimation returns an object with gas information\n\n const contractFactory = await starknet.getContractFactory("contract");\n const declareFee = await account.estimateDeclareFee(contractFactory);\n await account.declare(contractFactory); // computes max fee implicitly\n\n const deployFee = await account.estimateDeployFee(contractFactory);\n const contract = await account.deploy(contractFactory); // computes max fee implicitly\n\n const invokeFee = await account.estimateFee(contract, "method", { arg1: 10n });\n await account.invoke(contract, "method", { arg1: 10n }); // computes max fee implicitly\n\n // computes message estimate fee\n const estimatedMessageFee = await l2contract.estimateMessageFee("deposit", {\n from_address: L1_CONTRACT_ADDRESS,\n amount: 123,\n user: 1\n });\n});\n')),(0,r.kt)("h4",{id:"delegate-proxy"},"Delegate Proxy"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'it("should forward to the implementation contract", async function () {\n const implementationFactory = await starknet.getContractFactory("contract");\n const account = ...;\n const txHash = await account.declare(implementationFactory);\n const implementationClassHash = await implementationFactory.getClassHash();\n\n const proxyFactory = await starknet.getContractFactory("delegate_proxy");\n await account.declare(proxyFactory);\n const proxy = await account.deploy(proxyFactory, {\n implementation_hash_: implementationClassHash\n });\n\n proxy.setImplementation(implementationFactory);\n const { res: initialProxyBalance } = await proxy.call("get_balance");\n});\n')),(0,r.kt)("h4",{id:"transaction-information-and-receipt-with-events"},"Transaction information and receipt with events"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'it("should return transaction data and transaction receipt", async function () {\n const contract: StarknetContract = ...;\n console.log("Deployment transaction hash:", contract.deployTxHash);\n\n const transaction = await starknet.getTransaction(contract.deployTxHash);\n console.log(transaction);\n\n const account = ...;\n const txHash = await account.invoke(contract, "increase_balance", { amount: 10 });\n\n const receipt = await starknet.getTransactionReceipt(txHash);\n const decodedEvents = contract.decodeEvents(receipt.events);\n\n const txTrace = await starknet.getTransactionTrace(txHash);\n // decodedEvents contains hex data array converted to a structured object\n // { name: "increase_balance_called", data: { current_balance: 0n, amount: 10n } }\n});\n')),(0,r.kt)("p",null,"For more usage examples, including tuple, array and struct support, as well as Starknet CLI wallet support, check ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/sample-test.ts"},"sample-test.ts")," of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example"},"starknet-hardhat-example"),"."),(0,r.kt)("h3",{id:"devnet-examples"},"Devnet examples"),(0,r.kt)("h4",{id:"l1-l2-communication-postman-message-exchange-with-devnet"},"L1-L2 communication (Postman message exchange with Devnet)"),(0,r.kt)("p",null,"Exchanging messages between L1 (",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/ganache"},"Ganache"),", ",(0,r.kt)("a",{parentName:"p",href:"https://hardhat.org/hardhat-network/#running-stand-alone-in-order-to-support-wallets-and-other-software"},"Hardhat node"),", Ethereum testnet) and L2 (only supported for ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"starknet-devnet"),") can be done using this plugin:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Ensure there is an available L1 network and that you know its RPC endpoint URL."),(0,r.kt)("li",{parentName:"ul"},"Load an L1 Messaging contract using ",(0,r.kt)("inlineCode",{parentName:"li"},"starknet.devnet.loadL1MessagingContract"),"."),(0,r.kt)("li",{parentName:"ul"},"Call ",(0,r.kt)("inlineCode",{parentName:"li"},"starknet.devnet.flush")," after you ",(0,r.kt)("inlineCode",{parentName:"li"},"invoke")," your contract and want to propagate your message."),(0,r.kt)("li",{parentName:"ul"},"When running a hardhat test or script which relies on ",(0,r.kt)("inlineCode",{parentName:"li"},'network["config"]'),", specify the name of an L1 network you defined in ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config"),". Use ",(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat test --network "),". Network ",(0,r.kt)("inlineCode",{parentName:"li"},"localhost")," is predefined in hardhat so ",(0,r.kt)("inlineCode",{parentName:"li"},"--network localhost")," should work if you're using e.g. ",(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat node")," as the L1 network."),(0,r.kt)("li",{parentName:"ul"},"Check ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/postman.test.ts#L98"},"this example")," for more info.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},' it("should exchange messages with Devnet", async function() {\n await starknet.devnet.loadL1MessagingContract(...);\n\n // Exact syntax may vary depending on your L1 contract interaction library\n const l1contract = ...;\n const l2contract = ...;\n\n // If the L1 function is expected to send a message to L2,\n // it needs to be paid for by providing some value to the transaction\n await l1contract.send(..., {\n value: 1000 // pay for L1->L2 message\n });\n await starknet.devnet.flush();\n\n const account = ...;\n await account.invoke(l2contract, ...);\n await starknet.devnet.flush();\n });\n')),(0,r.kt)("h4",{id:"mock-message-between-l1-and-l2"},"Mock message between L1 and L2"),(0,r.kt)("p",null,"To send mock messages between L1 and L2 the following two functions can be used. Detailed example can be found ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/test/postman.test.ts#170"},"here"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"starknet.devnet.sendMessageToL2(...); // Sends message to L2\nstarknet.devnet.consumeMessageFromL2(...); // Sends message from L2 to L1\n")),(0,r.kt)("h4",{id:"restart"},"Restart"),(0,r.kt)("p",null,"Devnet can be restarted by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.restart()"),". All of the deployed contracts, blocks and storage updates will be restarted to the empty state."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.restart();\n")),(0,r.kt)("h4",{id:"dumping"},"Dumping"),(0,r.kt)("p",null,"Use ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.dump()")," to maintain the Devnet instance from the plugin."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.dump(path); // path to dump file (eg. dump.pkl)\n")),(0,r.kt)("h4",{id:"loading"},"Loading"),(0,r.kt)("p",null,"Dumped Devnet instance can be loaded using ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.load()"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.load(path); // path for dump file (eg. dump.pkl)\n")),(0,r.kt)("h4",{id:"advancing-time"},"Advancing time"),(0,r.kt)("p",null,"The plugin comes with support for ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/advancing-time"},"Devnet's timestamp management"),".\nThe time offset for each generated block can be increased by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.increaseTime()"),". The time for the next block can be set by calling ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.setTime()"),", with subsequent blocks keeping the set offset."),(0,r.kt)("p",null,"Warning: ",(0,r.kt)("em",{parentName:"p"},"block time can be set in the past and lead to unexpected behaviour!")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await starknet.devnet.setTime(1000); // time in seconds\nawait starknet.devnet.increaseTime(1000); // time in seconds\n")),(0,r.kt)("h4",{id:"creating-an-empty-block"},"Creating an empty block"),(0,r.kt)("p",null,"Devnet offers ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/blocks#create-an-empty-block"},"empty block creation"),". It can be useful to make available those changes that take effect with the next block."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const emptyBlock = await starknet.devnet.createBlock();\n")),(0,r.kt)("h4",{id:"mint-tokens-to-an-account"},"Mint tokens to an account"),(0,r.kt)("p",null,"Devnet allows ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/mint-token#mint-with-a-transaction"},"minting token"),". You can call ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.mint")," like this"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const lite_mode = true; // Optional, Default true\nawait starknet.devnet.mint(account_address, 2e12, lite_mode);\n")),(0,r.kt)("h2",{id:"debugging-contracts"},"Debugging contracts"),(0,r.kt)("p",null,"To debug Starknet contracts, you can use ",(0,r.kt)("inlineCode",{parentName:"p"},"print()")," in cairo hints in your contract, and the printed lines will appear in Devnet's log."),(0,r.kt)("p",null,"Compile with ",(0,r.kt)("inlineCode",{parentName:"p"},"--disable-hint-validation")," flag to allow hints."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"hardhat starknet-compile-deprecated --disable-hint-validation\n")),(0,r.kt)("p",null,"For example, when calling the following ",(0,r.kt)("inlineCode",{parentName:"p"},"increase_balance")," with input ",(0,r.kt)("inlineCode",{parentName:"p"},"25"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-cairo"},'@external\nfunc increase_balance{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}(\n amount: felt\n) {\n let (res) = balance.read();\n %{ print( "Adding balance..." ) %}\n %{ print( ids.res ) %}\n balance.write(res + amount);\n let (afterUpdate) = balance.read();\n %{ print( ids.afterUpdate ) %}\n return ();\n}\n')),(0,r.kt)("p",null,"Devnet logs look like this,"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"Adding balance...\n0\n25\n")),(0,r.kt)("p",null,"If you want to have your debug lines printed in the same terminal as your hardhat script/test, use ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet")," with ",(0,r.kt)("inlineCode",{parentName:"p"},"stdout")," set to ",(0,r.kt)("inlineCode",{parentName:"p"},'"STDOUT"')," as documented in ",(0,r.kt)("a",{parentName:"p",href:"#runtime-network---integrated-devnet"},"runtime network")," section."),(0,r.kt)("h2",{id:"configure-the-plugin"},"Configure the plugin"),(0,r.kt)("p",null,"Specify custom configuration by editing your project's ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," (or ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.js"),")."),(0,r.kt)("h3",{id:"cairo-version"},"Cairo version"),(0,r.kt)("p",null,"Use this configuration option to select the ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo-lang"),"/",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," version used by the underlying Docker container."),(0,r.kt)("p",null,"A Docker image tailored to the machine will be pulled. The ",(0,r.kt)("inlineCode",{parentName:"p"},"-arm")," suffix will be applied to the version name, if it's not applied on ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts"),", if the device's architecture is ",(0,r.kt)("inlineCode",{parentName:"p"},"arm64"),". (e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},'dockerizedVersion: "0.8.1-arm"')," and ",(0,r.kt)("inlineCode",{parentName:"p"},'dockerizedVersion: "0.8.1"')," both will work)."),(0,r.kt)("p",null,"If you specify neither ",(0,r.kt)("inlineCode",{parentName:"p"},"dockerizedVersion")," nor ",(0,r.kt)("a",{parentName:"p",href:"#existing-virtual-environment"},"venv"),", the latest dockerized version is used."),(0,r.kt)("p",null,"A list of available dockerized versions can be found ",(0,r.kt)("a",{parentName:"p",href:"https://hub.docker.com/r/shardlabs/cairo-cli/tags"},"here"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n dockerizedVersion: "0.8.1"\n }\n ...\n};\n')),(0,r.kt)("h3",{id:"existing-virtual-environment"},"Existing virtual environment"),(0,r.kt)("p",null,"If you want to use an existing Python virtual environment (pyenv, poetry, conda, miniconda), specify it by using ",(0,r.kt)("inlineCode",{parentName:"p"},'starknet["venv"]'),"."),(0,r.kt)("p",null,"To use the currently activated environment (or if you have the starknet commands globally installed), set ",(0,r.kt)("inlineCode",{parentName:"p"},"venv")," to ",(0,r.kt)("inlineCode",{parentName:"p"},'"active"'),"."),(0,r.kt)("p",null,"In any case, the specified environment is expected to contain the ",(0,r.kt)("inlineCode",{parentName:"p"},"python3")," command."),(0,r.kt)("p",null,"If you are on a Mac, you may experience Docker-related issues, so this may be the only way to run the plugin."),(0,r.kt)("p",null,"If you specify neither ",(0,r.kt)("a",{parentName:"p",href:"#cairo-version"},"dockerizedVersion")," nor ",(0,r.kt)("inlineCode",{parentName:"p"},"venv"),", the latest dockerized version is used."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n starknet: {\n // venv: "active" <- for the active virtual environment\n // venv: "path/to/my-venv" <- for env created with e.g. `python -m venv path/to/my-venv`\n venv: ""\n }\n};\n')),(0,r.kt)("h3",{id:"single-cairo-1-file-compilation"},"Single Cairo 1 file compilation"),(0,r.kt)("p",null,"If you're looking for a way to compile simple Cairo 1 contracts, read on. If you want to build more complex projects, read about ",(0,r.kt)("a",{parentName:"p",href:"#building-cairo-1-projects"},"Building Cairo 1 projects")),(0,r.kt)("p",null,"If you're using ",(0,r.kt)("inlineCode",{parentName:"p"},"dockerizedVersion"),", it will also use the dockerized Cairo 1 compiler version (currently 1.1.0). To specify your custom Cairo 1 compiler, you need to provide the path to the directory with its binary executables (likely a subdirectory of the target directory of your compiler repo). This can be configured in ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," or in ",(0,r.kt)("a",{parentName:"p",href:"#starknet-compile"},"the CLI"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n starknet: {\n // if you build with `cargo build --bin starknet-compile --bin starknet-sierra-compile --release`\n cairo1BinDir: "path/to/compiler/target/release/"\n }\n};\n')),(0,r.kt)("h3",{id:"building-cairo-1-projects"},"Building Cairo 1 projects"),(0,r.kt)("p",null,"This plugin comes with a Scarb wrapper. Read about how to use it in ",(0,r.kt)("a",{parentName:"p",href:"#starknet-build"},"this section"),". If not via CLI, you may specify the Scarb command via:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n starknet: {\n scarbCommand: "scarb" // or alternatively an exact path to the desired command\n }\n};\n')),(0,r.kt)("h3",{id:"request-timeout"},"Request Timeout"),(0,r.kt)("p",null,"Default requestTimeout is 30s. It can be changed using the following configuration.\nYou may need to increase the timeout value in some situation (declaring large smart contract)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"module.exports = {\n starknet: {\n requestTimeout: 90_000 // 90s\n }\n};\n")),(0,r.kt)("h3",{id:"paths"},"Paths"),(0,r.kt)("p",null,"Prefer providing absolute paths when using the plugin. If a relative path is provided, it will be resolved relative to the root of the project."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'module.exports = {\n paths: {\n // Defaults to "contracts" (the same as `paths.sources`).\n starknetSources: "my-own-starknet-path",\n\n // Defaults to "starknet-artifacts".\n // Has to be different from the value set in `paths.artifacts` (which is used by core Hardhat and has a default value of `artifacts`).\n starknetArtifacts: "also-my-own-starknet-path",\n\n // Same purpose as the `--cairo-path` argument of the `starknet-compile-deprecated` command\n // Allows specifying the locations of imported files, if necessary.\n cairoPaths: ["my/own/cairo-path1", "also/my/own/cairo-path2"]\n }\n ...\n};\n')),(0,r.kt)("h3",{id:"runtime-network"},"Runtime network"),(0,r.kt)("p",null,"To set the network used in your Hardhat scripts/tests, use ",(0,r.kt)("inlineCode",{parentName:"p"},'starknet["network"]')," or the ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network")," CLI option. Not specifying one will default to using alpha-goerli. Do not confuse this network with Hardhat's default ",(0,r.kt)("inlineCode",{parentName:"p"},"--network")," option which refers to the L1 network."),(0,r.kt)("p",null,"A faster approach is to use ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"starknet-devnet"),", a Ganache-like local testnet."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n network: "myNetwork"\n },\n networks: {\n devnet: { // this way you can also specify it with `--starknet-network devnet`\n url: "http://127.0.0.1:5050"\n }\n }\n ...\n};\n')),(0,r.kt)("p",null,"Predefined networks include ",(0,r.kt)("inlineCode",{parentName:"p"},"alpha-goerli"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"alpha-goerli2"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"alpha-mainnet")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet"),"."),(0,r.kt)("h3",{id:"runtime-network---integrated-devnet"},"Runtime network - Integrated Devnet"),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"starknet-devnet")," is available out of the box as a starknet network called ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet"),". By default, it will spawn Devnet using its Docker image and listening on ",(0,r.kt)("inlineCode",{parentName:"p"},"http://127.0.0.1:5050"),". Target it via the hardhat config file or ",(0,r.kt)("inlineCode",{parentName:"p"},"--starknet-network integrated-devnet"),". Using ",(0,r.kt)("inlineCode",{parentName:"p"},"integrated-devnet")," makes ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/fork/"},"forking of existing blockchains")," very easy."),(0,r.kt)("p",null,"By defining/modifying ",(0,r.kt)("inlineCode",{parentName:"p"},'networks["integratedDevnet"]')," in your hardhat config file, you can specify:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"the version of Devnet to use (effectively specifying the version of the underlying Docker image)"),(0,r.kt)("li",{parentName:"ul"},"a Python environment with installed starknet-devnet (can be active environment); this will avoid using the dockerized version"),(0,r.kt)("li",{parentName:"ul"},"CLI arguments to be used on Devnet startup: ",(0,r.kt)("a",{parentName:"li",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/run"},"options")),(0,r.kt)("li",{parentName:"ul"},"where output should be flushed ",(0,r.kt)("em",{parentName:"li"},"(either to the terminal or to a file)"),".")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n network: "integrated-devnet"\n },\n networks: {\n integratedDevnet: {\n url: "http://127.0.0.1:5050",\n\n // venv: "active" <- for the active virtual environment with installed starknet-devnet\n // venv: "path/to/venv" <- for env with installed starknet-devnet (created with e.g. `python -m venv path/to/venv`)\n venv: "",\n\n // use python or rust vm implementation\n // vmLang: "python" <- use python vm (default value)\n // vmLang: "rust" <- use rust vm\n // (rust vm is available out of the box using dockerized integrated-devnet)\n // (rustc and cairo-rs-py required using installed devnet)\n // read more here : https://0xspaceshard.github.io/starknet-devnet/docs/guide/run/#run-with-the-rust-implementation-of-cairo-vm\n vmLang: "",\n\n // or specify Docker image tag\n dockerizedVersion: "",\n\n // optional devnet CLI arguments, read more here: https://0xspaceshard.github.io/starknet-devnet/docs/guide/run\n args: ["--gas-price", "2000000000", "--fork-network", "alpha-goerli"],\n\n // stdout: "logs/stdout.log" <- dumps stdout to the file\n stdout: "STDOUT", // <- logs stdout to the terminal\n // stderr: "logs/stderr.log" <- dumps stderr to the file\n stderr: "STDERR" // <- logs stderr to the terminal\n }\n }\n ...\n};\n')),(0,r.kt)("h3",{id:"installing-third-party-libraries"},"Installing third-party libraries"),(0,r.kt)("p",null,"If you want to install a third-party Cairo library and be able to import it in your Cairo files, use the following pattern:"),(0,r.kt)("h4",{id:"with-npm-packages"},"With npm packages:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install (example package: ",(0,r.kt)("inlineCode",{parentName:"li"},"influenceth__cairo_math_64x61@npm:@influenceth/cairo-math-64x61"),")")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"npm install --save-dev influenceth__cairo_math_64x61@npm:@influenceth/cairo-math-64x61\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Edit the ",(0,r.kt)("inlineCode",{parentName:"li"},"paths.cairoPaths")," section of your ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config")," file (",(0,r.kt)("a",{parentName:"li",href:"#paths"},"docs"),"):")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'paths: {\n cairoPaths: ["./node_modules"];\n}\n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Import")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"from influenceth__cairo_math_64x61.contracts.Math64x61 import Math64x61_ONE, Math64x61_mul\n")),(0,r.kt)("h4",{id:"with-pip-packages"},"With pip packages:"),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install (example package: ",(0,r.kt)("inlineCode",{parentName:"li"},"openzeppelin-cairo-contracts"),")")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"pip install openzeppelin-cairo-contracts\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"If you are installing in a virtual environment, edit the ",(0,r.kt)("inlineCode",{parentName:"li"},"paths.cairoPaths")," section of your ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config")," file (",(0,r.kt)("a",{parentName:"li",href:"#paths"},"docs"),") as:")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'paths: {\n // this directory contains the openzeppelin directory\n cairoPaths: ["path/to/cairo_venv/lib/python3.9/site-packages"],\n}\n')),(0,r.kt)("ol",{start:3},(0,r.kt)("li",{parentName:"ol"},"Import")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"from openzeppelin.token.erc20.library import ERC20\n")),(0,r.kt)("h4",{id:"with-non-npm-git-repositories"},"With non-npm git repositories:"),(0,r.kt)("p",null,"If you want to install directly from a git repo that doesn't contain ",(0,r.kt)("inlineCode",{parentName:"p"},"package.json"),", you cannot use ",(0,r.kt)("inlineCode",{parentName:"p"},"npm i"),". However, ",(0,r.kt)("inlineCode",{parentName:"p"},"yarn")," supports this."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Install (example package: ",(0,r.kt)("inlineCode",{parentName:"li"},"https://github.com/OpenZeppelin/cairo-contracts"),")")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"yarn add openzeppelin__cairo_contracts@git+https://git@github.com/OpenZeppelin/cairo-contracts.git\n")),(0,r.kt)("h3",{id:"using-starknetgetcontractfactory-with-third-party-libraries"},"Using ",(0,r.kt)("inlineCode",{parentName:"h3"},"starknet.getContractFactory")," with third-party libraries"),(0,r.kt)("p",null,"This paragraph assumes you've read and run ",(0,r.kt)("a",{parentName:"p",href:"#Installing-third-party-libraries"},"3rd party library installation"),".\nThe example package used is ",(0,r.kt)("inlineCode",{parentName:"p"},"https://github.com/OpenZeppelin/cairo-contracts")," so you may want to check ",(0,r.kt)("a",{parentName:"p",href:"#With-non-npm-git-repositories"},"non-npm git repos"),"."),(0,r.kt)("ol",null,(0,r.kt)("li",{parentName:"ol"},"Compile")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npx hardhat starknet-compile-deprecated node_modules/openzeppelin__cairo_contracts/src/openzeppelin/token/erc20/presets/ERC20.cairo\n")),(0,r.kt)("ol",{start:2},(0,r.kt)("li",{parentName:"ol"},"Get contract factory")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'const contractFactory = await starknet.getContractFactory(\n "node_modules/openzeppelin__cairo_contracts/src/openzeppelin/token/erc20/presets/ERC20"\n);\n')),(0,r.kt)("h3",{id:"wallet---starknet-cli"},"Wallet - Starknet CLI"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"ATTENTION!")," Use this only if you want to achieve compatibility with the wallet used in Starknet CLI. For all other uses, ",(0,r.kt)("a",{parentName:"p",href:"#account"},"these accounts")," should suffice."),(0,r.kt)("p",null,"To configure a wallet for your project, specify it by adding an entry to ",(0,r.kt)("inlineCode",{parentName:"p"},"wallets")," in your hardhat config file.\nYou can specify multiple wallets/accounts."),(0,r.kt)("p",null,"The parameters for the wallet are:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"accountName"),": The name to give the account. If omitted, the default value ",(0,r.kt)("inlineCode",{parentName:"li"},"__default__")," will be used;"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"modulePath"),": The python module and wallet class of your chosen wallet provider;"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"accountPath"),": The path where your wallet information will be saved.")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-javascript"},'module.exports = {\n starknet: {\n wallets: {\n MyWallet: {\n accountName: "OpenZeppelin",\n modulePath: "starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount",\n accountPath: "~/.starknet_accounts"\n },\n AnotherWallet: {\n accountName: "AnotherOpenZeppelin",\n modulePath: "starkware.starknet.wallets.open_zeppelin.OpenZeppelinAccount",\n accountPath: "~/.starknet_accounts"\n }\n }\n }\n ...\n};\n')),(0,r.kt)("p",null,"Accounts are deployed in the same network as the one passed as an argument to the ",(0,r.kt)("inlineCode",{parentName:"p"},"npx hardhat starknet-deploy-account")," CLI command."),(0,r.kt)("p",null,"To use the wallet in your scripts, use the ",(0,r.kt)("inlineCode",{parentName:"p"},"getWallet")," utility function (using ",(0,r.kt)("inlineCode",{parentName:"p"},"Account.getAccountFromAddress(...)")," will probably not work):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\n...\nconst wallet = starknet.getWallet("MyWallet");\nconst contract = ...;\nawait contract.invoke("increase_balance", { amount: 1 }, { wallet });\n')),(0,r.kt)("h2",{id:"recompilation"},"Recompilation"),(0,r.kt)("p",null,"Recompilation is performed when contracts are updated or when artifacts are missing. A file will be created with the name ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo-files-cache.json")," to handle caching. Recompilation is handled before the following ",(0,r.kt)("a",{parentName:"p",href:"#cli-commands"},"CLI commands")," are executed."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat run")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"npx hardhat test"))),(0,r.kt)("p",null,"This feature is turned off by default and is specified in the ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts")," file."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"module.exports = {\n starknet: {\n recompile: true // <- to switch recompilation on\n }\n};\n")),(0,r.kt)("h2",{id:"account"},"Account"),(0,r.kt)("p",null,"In Starknet, an account is a contract through which you interact with other contracts.\nIts usage is exemplified ",(0,r.kt)("a",{parentName:"p",href:"#accounts"},"earlier in the docs")," and ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/plugin/test/oz-account-test.ts"},"in the example repo"),"."),(0,r.kt)("p",null,"There are several Starknet account implementations; this plugin supports the following as properties of ",(0,r.kt)("inlineCode",{parentName:"p"},"hre.starknet"),":"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"OpenZeppelinAccount")," - ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/OpenZeppelin/cairo-contracts/releases/tag/v0.5.1"},"v0.5.1")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"ArgentAccount")," - Commit ",(0,r.kt)("a",{parentName:"li",href:"https://github.com/argentlabs/argent-contracts-starknet/tree/780760e4156afe592bb1feff7e769cf279ae9831"},"780760e")," of branch develop.")),(0,r.kt)("h3",{id:"create-account"},"Create account"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\nconst account = await starknet.OpenZeppelinAccount.createAccount();\nconst accountFromOptions = await starknet.OpenZeppelinAccount.createAccount({\n salt: "0x123", // salt to always deploy to an expected address\n privateKey: process.env.MY_KEY // the key only known to you, the public key will be inferred\n});\nconsole.log(account.address);\n')),(0,r.kt)("h3",{id:"fund-account"},"Fund account"),(0,r.kt)("p",null,"After creating the account, you need to fund it (give it some ETH):"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"On alpha-goerli use ",(0,r.kt)("a",{parentName:"li",href:"https://faucet.goerli.starknet.io/"},"this faucet"),"."),(0,r.kt)("li",{parentName:"ul"},"On alpha-goerli2 use ",(0,r.kt)("a",{parentName:"li",href:"https://www.newton.so/view/636d020159c30b8efc8d1d86"},"this")),(0,r.kt)("li",{parentName:"ul"},"On starknet-devnet call ",(0,r.kt)("a",{parentName:"li",href:"#mint-tokens-to-an-account"},(0,r.kt)("inlineCode",{parentName:"a"},"starknet.devnet.mint()"))," which uses ",(0,r.kt)("a",{parentName:"li",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/mint-token/"},"devnet faucet"),"."),(0,r.kt)("li",{parentName:"ul"},"Alternatively transfer some amount from an already funded account to the newly deployed account.")),(0,r.kt)("p",null,"If you're facing issues loading the account you've just funded, check out ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/issues/281#issuecomment-1354588817"},"this issue"),"."),(0,r.kt)("h3",{id:"get-balance"},"Get balance"),(0,r.kt)("p",null,"To find out the balance of your account on the current Starknet network, you can use ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.getBalance"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'import { starknet } from "hardhat";\nconst someBalance = starknet.getBalance("0x123...def")\nconst myAccount = ...;\nconst myAccountBalance = starknet.getBalance(myAccount.address);\n')),(0,r.kt)("h3",{id:"deploy-account"},"Deploy account"),(0,r.kt)("p",null,"After funding the account, you need to deploy it (in case of ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount"),", this will also take care of initialization):"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await account.deployAccount({ maxFee: ... });\n")),(0,r.kt)("p",null,"Alternatively deploy your account by running ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example/blob/master/scripts/deploy-account.ts"},"this script"),"."),(0,r.kt)("p",null,"To successfully deploy ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount"),", the chain you are interacting with is expected to have ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount")," contracts declared. Alpha Goerli and Alpha Mainnet satisfy this criterion, but if you're working with Devnet, this is most easily achievable by running Devnet ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/fork"},"forked")," from e.g. Alpha Goerli."),(0,r.kt)("h3",{id:"reuse-account"},"Reuse account"),(0,r.kt)("p",null,"To retrieve an already deployed Account, use the ",(0,r.kt)("inlineCode",{parentName:"p"},"getAccountFromAddress")," method. Do not use this method for accounts deployed by e.g. Starknet CLI (those are modified OZ accounts that are not compatible with the OZ version supported by this plugin). What may be especially useful are ",(0,r.kt)("a",{parentName:"p",href:"https://0xspaceshard.github.io/starknet-devnet/docs/guide/Predeployed-accounts"},"predeployed+predefined accounts")," that come with Devnet (retrieve them with ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet.devnet.getPredeployedAccounts()"),")."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"const account = await starknet.OpenZeppelinAccount.getAccountFromAddress(\n accountAddress,\n process.env.PRIVATE_KEY\n);\n")),(0,r.kt)("h3",{id:"interact-through-account"},"Interact through account"),(0,r.kt)("p",null,"Use the ",(0,r.kt)("inlineCode",{parentName:"p"},"invoke")," method of ",(0,r.kt)("inlineCode",{parentName:"p"},"Account")," to invoke (change the state), but ",(0,r.kt)("inlineCode",{parentName:"p"},"call")," method of ",(0,r.kt)("inlineCode",{parentName:"p"},"StarknetContract")," to call (read the state)."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'await account.invoke(contract, "increase_balance", { amount });\nconst { res: amount } = await contract.call("get_balance");\n')),(0,r.kt)("p",null,"Once your account is funded and deployed, you can specify a max fee greater than zero:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'await account.invoke(contract, "foo", { arg1: ... }, { maxFee: BigInt(...) });\n')),(0,r.kt)("p",null,"If you don't specify a ",(0,r.kt)("inlineCode",{parentName:"p"},"maxFee"),", one will be calculated for you by applying an overhead of 50% to the result of fee estimation. You can also customize the overhead by providing a value for ",(0,r.kt)("inlineCode",{parentName:"p"},"overhead"),":"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'// maxFee will be 40% of estimated fee; if overhead not provided, the default value is used.\nawait account.invoke(contract, "foo", { arg1: ... }, { overhead: 0.4 });\n')),(0,r.kt)("p",null,"Set the ",(0,r.kt)("inlineCode",{parentName:"p"},"rawInput")," option to ",(0,r.kt)("inlineCode",{parentName:"p"},"true")," to suppress validation of the args passed to the contract function:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'// pass a direct array\nawait account.invoke(contract, "foo", ["10", "20"], { rawInput: true });\nawait contract.call("bar", ["30", "40"], { rawInput: true });\n')),(0,r.kt)("h3",{id:"multicalls"},"Multicalls"),(0,r.kt)("p",null,"You can also use the Account object to perform multi{invokes, fee estimations}."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'const interactionArray = [\n {\n toContract: contract1,\n functionName: "increase_balance",\n calldata: { amount: 10n }\n },\n {\n toContract: contract2,\n functionName: "increase_balance",\n calldata: { amount: 20n }\n }\n];\nconst fee = await account.multiEstimateFee(interactionArray);\nconst txHash = await account.multiInvoke(interactionArray);\n')),(0,r.kt)("h3",{id:"guardian"},"Guardian"),(0,r.kt)("p",null,"Unlike OpenZeppelin account, Argent account offers ",(0,r.kt)("a",{parentName:"p",href:"https://support.argent.xyz/hc/en-us/articles/360022631992-About-guardians"},"guardian functionality"),". The guardian is by default not set (the guardian key is undefined), but if you want to change it, cast the ",(0,r.kt)("inlineCode",{parentName:"p"},"account")," to ",(0,r.kt)("inlineCode",{parentName:"p"},"ArgentAccount")," and execute ",(0,r.kt)("inlineCode",{parentName:"p"},"setGuardian"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},"await argentAccount.setGuardian(process.env.GUARDIAN_PRIVATE_KEY, { maxFee: 1e18 });\n// to unset it, use an undefined key\nawait argentAccount.setGuardian(undefined, { maxFee: 1e18 });\n")),(0,r.kt)("h2",{id:"more-examples"},"More examples"),(0,r.kt)("p",null,"An example Hardhat project using this plugin can be found ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example"},"here"),"."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/127ae528.40cedfdc.js b/assets/js/127ae528.40cedfdc.js new file mode 100644 index 00000000..e6fa7176 --- /dev/null +++ b/assets/js/127ae528.40cedfdc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[23],{3769:u=>{u.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/03e12d40.d99bcb3d.js b/assets/js/53fd2da9.fb694be5.js similarity index 65% rename from assets/js/03e12d40.d99bcb3d.js rename to assets/js/53fd2da9.fb694be5.js index a74aaa51..5c2642b5 100644 --- a/assets/js/03e12d40.d99bcb3d.js +++ b/assets/js/53fd2da9.fb694be5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[651],{5745:u=>{u.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[867],{5745:u=>{u.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/79c382f5.bb0f9892.js b/assets/js/79c382f5.bb0f9892.js deleted file mode 100644 index 058a2f9a..00000000 --- a/assets/js/79c382f5.bb0f9892.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[197],{3769:u=>{u.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/950718c7.0ab63016.js b/assets/js/950718c7.0ab63016.js new file mode 100644 index 00000000..b6b059c1 --- /dev/null +++ b/assets/js/950718c7.0ab63016.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[796],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var a=n(7294);function i(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 o(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=p(n),u=i,m=c["".concat(s,".").concat(u)]||c[u]||h[u]||r;return n?a.createElement(m,o(o({ref:t},d),{},{components:n})):a.createElement(m,o({ref:t},d))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:i,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>l,toc:()=>p});var a=n(7462),i=(n(7294),n(3905));const r={},o="Contribute",l={unversionedId:"dev",id:"dev",title:"Contribute",description:"Set up development environment",source:"@site/docs/dev.md",sourceDirName:".",slug:"/dev",permalink:"/starknet-hardhat-plugin/docs/dev",draft:!1,editUrl:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/docs/docs/dev.md",tags:[],version:"current",frontMatter:{}},s={},p=[{value:"Set up development environment",id:"set-up-development-environment",level:2},{value:"Clone the repository",id:"clone-the-repository",level:3},{value:"Install dependencies",id:"install-dependencies",level:3},{value:"Compile",id:"compile",level:3},{value:"Set up the example repository",id:"set-up-the-example-repository",level:3},{value:"Testing",id:"testing",level:2},{value:"Executing tests locally",id:"executing-tests-locally",level:3},{value:"Executing individual tests",id:"executing-individual-tests",level:3},{value:"Executing individual tests with dockerized environnement",id:"executing-individual-tests-with-dockerized-environnement",level:3},{value:"Running tests in dev mode",id:"running-tests-in-dev-mode",level:3},{value:"Executing tests on CircleCI",id:"executing-tests-on-circleci",level:3},{value:"Testing network",id:"testing-network",level:3},{value:"Creating a PR",id:"creating-a-pr",level:3},{value:"Adapting to a new Starknet / cairo-lang version",id:"adapting-to-a-new-starknet--cairo-lang-version",level:2},{value:"In cairo-cli repo",id:"in-cairo-cli-repo",level:3},{value:"In starknet-hardhat-example repo",id:"in-starknet-hardhat-example-repo",level:3},{value:"Architecture",id:"architecture",level:2},{value:"Wrapper",id:"wrapper",level:3},{value:"Accessing HardhatRuntimeEnvironment (hre)",id:"accessing-hardhatruntimeenvironment-hre",level:3},{value:"Version management",id:"version-management",level:2},{value:"Docs",id:"docs",level:3},{value:"Example repo after a new version",id:"example-repo-after-a-new-version",level:3}],d={toc:p},c="wrapper";function h(e){let{components:t,...n}=e;return(0,i.kt)(c,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"contribute"},"Contribute"),(0,i.kt)("h2",{id:"set-up-development-environment"},"Set up development environment"),(0,i.kt)("h3",{id:"clone-the-repository"},"Clone the repository"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ git clone git@github.com:0xSpaceShard/starknet-hardhat-plugin.git\n$ cd starknet-hardhat-plugin\n")),(0,i.kt)("h3",{id:"install-dependencies"},"Install dependencies"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ npm ci\n")),(0,i.kt)("h3",{id:"compile"},"Compile"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ npm run build\n")),(0,i.kt)("h3",{id:"set-up-the-example-repository"},"Set up the example repository"),(0,i.kt)("p",null,"The ",(0,i.kt)("inlineCode",{parentName:"p"},"starknet-hardhat-example")," repository is used to showcase and test this plugin's functionality.\nSet it up following ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example#get-started"},"its readme"),", but after installing it, link it to use your local plugin repository:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ cd \n$ npm link\n\n$ cd \n$ npm link @shardlabs/starknet-hardhat-plugin\n")),(0,i.kt)("p",null,"If your IDE is reporting Typescript issues after compiling the plugin, you may want to restart the Typescript language server (e.g. in VS Code on Linux: Ctrl+Shift+P)"),(0,i.kt)("h2",{id:"testing"},"Testing"),(0,i.kt)("p",null,"A test case is added by creating a directory in a subdirectory of a test group in the ",(0,i.kt)("inlineCode",{parentName:"p"},"test")," directory. E.g. ",(0,i.kt)("inlineCode",{parentName:"p"},"declare-test")," is a test case in the ",(0,i.kt)("inlineCode",{parentName:"p"},"general-tests")," test group. A test case should contain:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"a ",(0,i.kt)("inlineCode",{parentName:"li"},"check.ts")," script which does the testing logic"),(0,i.kt)("li",{parentName:"ul"},"a ",(0,i.kt)("inlineCode",{parentName:"li"},"network.json")," file which specifies on which networks should the test case be run"),(0,i.kt)("li",{parentName:"ul"},"a ",(0,i.kt)("inlineCode",{parentName:"li"},"hardhat.config.ts")," file will be used")),(0,i.kt)("p",null,"The main testing script is ",(0,i.kt)("inlineCode",{parentName:"p"},"scripts/test.ts"),". It iterates over the test cases the test group specified by the ",(0,i.kt)("inlineCode",{parentName:"p"},"TEST_SUBDIR")," environment variable."),(0,i.kt)("h3",{id:"executing-tests-locally"},"Executing tests locally"),(0,i.kt)("p",null,"When running tests locally, you probably don't want to run the whole ",(0,i.kt)("inlineCode",{parentName:"p"},"test.sh")," script as it may alter your development environment. However, you can run individual tests by:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"positioning yourself in your example repository"),(0,i.kt)("li",{parentName:"ul"},"configuring the ",(0,i.kt)("inlineCode",{parentName:"li"},"hardhat.config.ts")),(0,i.kt)("li",{parentName:"ul"},"executing the ",(0,i.kt)("inlineCode",{parentName:"li"},"check.ts")," script (potentially modifying it to address path differences)")),(0,i.kt)("p",null,"To run all tests, you can use the ",(0,i.kt)("inlineCode",{parentName:"p"},"test-")," scripts defined in ",(0,i.kt)("inlineCode",{parentName:"p"},"package.json"),". For the tests to work, you may need to set the values from ",(0,i.kt)("inlineCode",{parentName:"p"},"config.json")," as environment variables. You should also have the ",(0,i.kt)("a",{parentName:"p",href:"https://stedolan.github.io/jq/"},(0,i.kt)("inlineCode",{parentName:"a"},"jq")," CLI tool")," installed."),(0,i.kt)("h3",{id:"executing-individual-tests"},"Executing individual tests"),(0,i.kt)("p",null,"To run a specific test case in the test group you can pass in the name of directory inside test group. E.g. to run ",(0,i.kt)("inlineCode",{parentName:"p"},"declare-test")," test case in ",(0,i.kt)("inlineCode",{parentName:"p"},"general-tests")," test group, you can use the script\n",(0,i.kt)("inlineCode",{parentName:"p"},"test-general-tests")," and pass in the name of the test after a ",(0,i.kt)("inlineCode",{parentName:"p"},"--")," like this,"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"$ npm run test-general-tests -- declare-test\n")),(0,i.kt)("h3",{id:"executing-individual-tests-with-dockerized-environnement"},"Executing individual tests with dockerized environnement"),(0,i.kt)("p",null,"If you are only running Devnet in dockerized mode, you don't need to install all the dev tools locally. With a properly set up ",(0,i.kt)("inlineCode",{parentName:"p"},"starknet-hardhat-example")," (read more ",(0,i.kt)("a",{parentName:"p",href:"#Set-up-the-example-repository"},"here"),"), you can position yourself in that repository and to execute the ",(0,i.kt)("inlineCode",{parentName:"p"},"declare-test")," case of the ",(0,i.kt)("inlineCode",{parentName:"p"},"general-tests")," group, you can run:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"$ npx ts-node STARKNET_HARDHAT_PLUGIN_PATH/test/general-tests/declare-test/check.ts\n")),(0,i.kt)("p",null,"Using this command will use the starknet-hardhat-example hardhat.config.ts. You can make modifications to make it match the config file in the test directory ",(0,i.kt)("inlineCode",{parentName:"p"},"STARKNET_HARDHAT_PLUGIN_PATH/test/general-tests/declare-test/hardhat.config.ts")),(0,i.kt)("h3",{id:"running-tests-in-dev-mode"},"Running tests in dev mode"),(0,i.kt)("p",null,"To run tests locally with test-dev. This is designed to run same tests repeatedly while developing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-sh"},"$ npm run test-dev\n")),(0,i.kt)("h3",{id:"executing-tests-on-circleci"},"Executing tests on CircleCI"),(0,i.kt)("p",null,"If you're a member of the organization and you do a push to origin, you trigger CI/CD workflow on CircleCI. Track the progress on ",(0,i.kt)("a",{parentName:"p",href:"https://circleci.com/gh/0xSpaceShard/workflows/starknet-hardhat-plugin"},"the dashboard"),"."),(0,i.kt)("p",null,"Sometimes the tests fail because of internal CircleCI or Starknet issues; in that case, you can try restarting the workflow."),(0,i.kt)("p",null,"Bear in mind that each workflow consumes credits. Track the spending ",(0,i.kt)("a",{parentName:"p",href:"https://app.circleci.com/settings/plan/github/0xSpaceShard/overview"},"here"),"."),(0,i.kt)("p",null,"The whole workflow is defined in ",(0,i.kt)("inlineCode",{parentName:"p"},".circleci/config.yml")," - you may find it somewhat chaotic as it uses dependency caching (we kind of sacrificed config clarity for performance)."),(0,i.kt)("p",null,"Script ",(0,i.kt)("inlineCode",{parentName:"p"},"scripts/set-alpha-vars.sh")," expects account information to be set through environment variables. These variables are defined in ",(0,i.kt)("a",{parentName:"p",href:"https://app.circleci.com/settings/organization/github/0xSpaceShard/contexts/c36fa213-2511-465b-b303-0d35d76b42eb"},"spaceshard CircleCI context"),". If you upload a new account (with new keys), you cannot modify existing variables but have to delete old ones and create new ones."),(0,i.kt)("p",null,"To skip running tests on CircleCI, add ",(0,i.kt)("inlineCode",{parentName:"p"},"[skip ci]")," in the first 250 characters of the commit message."),(0,i.kt)("h3",{id:"testing-network"},"Testing network"),(0,i.kt)("p",null,"The script ",(0,i.kt)("inlineCode",{parentName:"p"},"test.sh")," runs tests on Devnet and Testnet (alpha-goerli). To skip running tests on Testnet, add ",(0,i.kt)("inlineCode",{parentName:"p"},"[skip testnet]")," to the commit message."),(0,i.kt)("h3",{id:"creating-a-pr"},"Creating a PR"),(0,i.kt)("p",null,"When adding new functionality to the plugin, you will probably also have to create a PR to the ",(0,i.kt)("inlineCode",{parentName:"p"},"plugin")," branch of ",(0,i.kt)("inlineCode",{parentName:"p"},"starknet-hardhat-example"),". You can then modify the ",(0,i.kt)("inlineCode",{parentName:"p"},"test.sh")," script to use your branch instead of the ",(0,i.kt)("inlineCode",{parentName:"p"},"plugin")," branch."),(0,i.kt)("p",null,"If your reviewer makes an observation that requires a fix, after you push the commit with the fix, find the commit link on the PR conversation page, and reply to the reviewer by providing that link. In ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/pull/130#discussion_r913581807"},"this example")," the contributor even linked to the specific change of the commit - you don't have to do that if you made multiple smaller commits."),(0,i.kt)("p",null,"When the PR is ready to be merged, do ",(0,i.kt)("inlineCode",{parentName:"p"},"Squash and merge")," and delete the branch."),(0,i.kt)("h2",{id:"adapting-to-a-new-starknet--cairo-lang-version"},"Adapting to a new Starknet / cairo-lang version"),(0,i.kt)("p",null,"Since the plugin relies on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"Devnet")," in its tests, first an adapted version of Devnet might need to be released. Current versions of Devnet and cairo-lang used in tests are specified in ",(0,i.kt)("inlineCode",{parentName:"p"},"config.json"),"."),(0,i.kt)("h3",{id:"in-cairo-cli-repo"},"In cairo-cli repo"),(0,i.kt)("p",null,"When a new Starknet / cairo-lang version is released, a new ",(0,i.kt)("inlineCode",{parentName:"p"},"cairo-cli")," Docker image can be released (probably without any adaptation). This is done through the CI/CD pipeline of ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/cairo-cli-docker#build-a-new-image"},"the cairo-cli-docker repository"),"."),(0,i.kt)("p",null,"Likely places where the old version has to be replaced with the new version are ",(0,i.kt)("inlineCode",{parentName:"p"},"README.md")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"constants.ts"),"."),(0,i.kt)("h3",{id:"in-starknet-hardhat-example-repo"},"In starknet-hardhat-example repo"),(0,i.kt)("p",null,"Change the version in ",(0,i.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts"),". Recompile the contracts (only important for local usage)."),(0,i.kt)("h2",{id:"architecture"},"Architecture"),(0,i.kt)("h3",{id:"wrapper"},"Wrapper"),(0,i.kt)("p",null,"This plugin is a wrapper around Starknet CLI (tool installed with cairo-lang). E.g. when you do ",(0,i.kt)("inlineCode",{parentName:"p"},"hardhat starknet-compile-deprecated")," in a shell or ",(0,i.kt)("inlineCode",{parentName:"p"},"contractFactory.deploy()")," in a Hardhat JS/TS script, you are making a subprocess that executes Starknet CLI's ",(0,i.kt)("inlineCode",{parentName:"p"},"starknet deploy"),"."),(0,i.kt)("p",null,"There are two wrappers around Starknet CLI. They are defined in ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/starknet-wrappers.ts"},"starknet-wrapper.ts")," and both rely on a ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/starknet_cli_wrapper.py"},"proxy server")," that imports ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," methods of ",(0,i.kt)("inlineCode",{parentName:"p"},"starknet")," and ",(0,i.kt)("inlineCode",{parentName:"p"},"starknet-compile-deprecated")," and uses them to execute commands (this is a speedup since a subprocess importing the whole Starknet doesn't have to be spawned for each request)."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Docker wrapper:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"runs Starknet CLI in a Docker container"),(0,i.kt)("li",{parentName:"ul"},"the default option"))),(0,i.kt)("li",{parentName:"ul"},"Venv wrapper:",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"for users that already have ",(0,i.kt)("inlineCode",{parentName:"li"},"cairo-lang")," installed"),(0,i.kt)("li",{parentName:"ul"},"faster than Docker wrapper - not necessarily true since Docker wrapper also started using a proxy server")))),(0,i.kt)("h3",{id:"accessing-hardhatruntimeenvironment-hre"},"Accessing HardhatRuntimeEnvironment (hre)"),(0,i.kt)("p",null,"Before v0.7.0 we didn't know how to export classes to users, since every class needed to have access to ",(0,i.kt)("inlineCode",{parentName:"p"},"hre"),", which was passed on in ",(0,i.kt)("inlineCode",{parentName:"p"},"extendEnvironment"),". After introducing dynamic ",(0,i.kt)("inlineCode",{parentName:"p"},"hre")," importing, exporting classes has become a possibility:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-typescript"},'const hre = await import("hardhat");\n')),(0,i.kt)("p",null,"In ",(0,i.kt)("inlineCode",{parentName:"p"},"types/starknet.ts"),", classes are specified using ",(0,i.kt)("inlineCode",{parentName:"p"},"typeof"),", e.g. ",(0,i.kt)("inlineCode",{parentName:"p"},"OpenZeppelinAccount: typeof OpenZeppelinAccount"),". However, exporting classes this way doesn't export their type."),(0,i.kt)("h2",{id:"version-management"},"Version management"),(0,i.kt)("p",null,"When a push is done to the ",(0,i.kt)("inlineCode",{parentName:"p"},"master")," branch and the version in ",(0,i.kt)("inlineCode",{parentName:"p"},"package.json")," differs from the one published on ",(0,i.kt)("inlineCode",{parentName:"p"},"npm"),", the release process is triggered."),(0,i.kt)("p",null,"The updating of ",(0,i.kt)("inlineCode",{parentName:"p"},"package.json")," doesn't have to be done directly, but can be done by running"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"$ npm version \n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NEW_VERSION")," can be anything documented ",(0,i.kt)("a",{parentName:"p",href:"https://docs.npmjs.com/cli/v8/commands/npm-version"},"here"),", but will most commonly be ",(0,i.kt)("inlineCode",{parentName:"p"},"patch"),"."),(0,i.kt)("p",null,"This will also update ",(0,i.kt)("inlineCode",{parentName:"p"},"package-lock.json"),", create a new commit, and create a new git tag."),(0,i.kt)("p",null,"You may want your version-bumping commit to contain the ",(0,i.kt)("inlineCode",{parentName:"p"},"[skip testnet]")," string (documented ",(0,i.kt)("a",{parentName:"p",href:"#testing-network"},"here"),") to avoid testing on alpha-goerli (may postpone the version release significantly, if it will ever pass at all)."),(0,i.kt)("p",null,"If for whatever reason the publishing workflow in CI/CD cannot be executed, the version can be released manually via ",(0,i.kt)("inlineCode",{parentName:"p"},"scripts/npm-publish.sh"),", just be sure to have an NPM access token and that you have the rights to publish."),(0,i.kt)("p",null,"Apart from ",(0,i.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin?activeTab=versions"},"npm"),", releases are also tracked on ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/releases"},"GitHub")," with ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/tags"},"git tags"),". Notice the prepended ",(0,i.kt)("inlineCode",{parentName:"p"},"v")," in tag names."),(0,i.kt)("p",null,"After the npm package is released and the tag is pushed:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"$ git push origin \n")),(0,i.kt)("p",null,"the release can be made public ",(0,i.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/releases/new"},"on GitHub"),". Automatic note generation can be used, augmented with usage and development changes (see past releases for reference)."),(0,i.kt)("p",null,"Users should be notified about the usage related changes. This can be done on Telegram, ",(0,i.kt)("a",{parentName:"p",href:"https://discord.com/channels/793094838509764618/912735106899275856"},"Discord"),", ",(0,i.kt)("a",{parentName:"p",href:"https://community.starknet.io/t/starknet-hardhat-plugin/67"},"Shamans")," etc."),(0,i.kt)("h3",{id:"docs"},"Docs"),(0,i.kt)("p",null,"New documentation is ",(0,i.kt)("strong",{parentName:"p"},"automatically")," deployed after publishing a new version with ",(0,i.kt)("inlineCode",{parentName:"p"},"scripts/npm-publish.sh")," (also part of CI/CD)."),(0,i.kt)("p",null,"To manually deploy new documentation, run:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"$ cd www\n$ npm ci\n$ npm run deploy\n")),(0,i.kt)("h3",{id:"example-repo-after-a-new-version"},"Example repo after a new version"),(0,i.kt)("p",null,"After releasing a new plugin version, the ",(0,i.kt)("inlineCode",{parentName:"p"},"plugin")," branch of the example repo should be updated and pushed:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"package.json")," should be updated by running ",(0,i.kt)("inlineCode",{parentName:"li"},"npm install --save-exact @shardlabs/starknet-hardhat-plugin@")),(0,i.kt)("li",{parentName:"ul"},"The ",(0,i.kt)("inlineCode",{parentName:"li"},"master")," branch, which serves as reference to the users, should be synchronized with the ",(0,i.kt)("inlineCode",{parentName:"li"},"plugin")," branch. This can probably be done by doing ",(0,i.kt)("inlineCode",{parentName:"li"},"git reset plugin")," while on ",(0,i.kt)("inlineCode",{parentName:"li"},"master"),"."),(0,i.kt)("li",{parentName:"ul"},"Since you did ",(0,i.kt)("inlineCode",{parentName:"li"},"npm install"),", you may need to link again, as described ",(0,i.kt)("a",{parentName:"li",href:"#set-up-the-example-repository"},"initially"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/950718c7.a1e74440.js b/assets/js/950718c7.a1e74440.js deleted file mode 100644 index 42033f1d..00000000 --- a/assets/js/950718c7.a1e74440.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).push([[796],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});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 i(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 o(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=a.createContext({}),p=function(e){var t=a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},d=function(e){var t=p(e.components);return a.createElement(s.Provider,{value:t},e.children)},c="mdxType",h={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),c=p(n),u=r,m=c["".concat(s,".").concat(u)]||c[u]||h[u]||i;return n?a.createElement(m,o(o({ref:t},d),{},{components:n})):a.createElement(m,o({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l[c]="string"==typeof e?e:r,o[1]=l;for(var p=2;p{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const i={},o="Contribute",l={unversionedId:"dev",id:"dev",title:"Contribute",description:"Set up development environment",source:"@site/docs/dev.md",sourceDirName:".",slug:"/dev",permalink:"/starknet-hardhat-plugin/docs/dev",draft:!1,editUrl:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/tree/master/docs/docs/dev.md",tags:[],version:"current",frontMatter:{}},s={},p=[{value:"Set up development environment",id:"set-up-development-environment",level:2},{value:"Clone the repository",id:"clone-the-repository",level:3},{value:"Install dependencies",id:"install-dependencies",level:3},{value:"Compile",id:"compile",level:3},{value:"Set up the example repository",id:"set-up-the-example-repository",level:3},{value:"Testing",id:"testing",level:2},{value:"Executing tests locally",id:"executing-tests-locally",level:3},{value:"Executing individual tests",id:"executing-individual-tests",level:3},{value:"Running tests in dev mode",id:"running-tests-in-dev-mode",level:3},{value:"Executing tests on CircleCI",id:"executing-tests-on-circleci",level:3},{value:"Testing network",id:"testing-network",level:3},{value:"Creating a PR",id:"creating-a-pr",level:3},{value:"Adapting to a new Starknet / cairo-lang version",id:"adapting-to-a-new-starknet--cairo-lang-version",level:2},{value:"In cairo-cli repo",id:"in-cairo-cli-repo",level:3},{value:"In starknet-hardhat-example repo",id:"in-starknet-hardhat-example-repo",level:3},{value:"Architecture",id:"architecture",level:2},{value:"Wrapper",id:"wrapper",level:3},{value:"Accessing HardhatRuntimeEnvironment (hre)",id:"accessing-hardhatruntimeenvironment-hre",level:3},{value:"Version management",id:"version-management",level:2},{value:"Docs",id:"docs",level:3},{value:"Example repo after a new version",id:"example-repo-after-a-new-version",level:3}],d={toc:p},c="wrapper";function h(e){let{components:t,...n}=e;return(0,r.kt)(c,(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"contribute"},"Contribute"),(0,r.kt)("h2",{id:"set-up-development-environment"},"Set up development environment"),(0,r.kt)("h3",{id:"clone-the-repository"},"Clone the repository"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ git clone git@github.com:0xSpaceShard/starknet-hardhat-plugin.git\n$ cd starknet-hardhat-plugin\n")),(0,r.kt)("h3",{id:"install-dependencies"},"Install dependencies"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npm ci\n")),(0,r.kt)("h3",{id:"compile"},"Compile"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npm run build\n")),(0,r.kt)("h3",{id:"set-up-the-example-repository"},"Set up the example repository"),(0,r.kt)("p",null,"The ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet-hardhat-example")," repository is used to showcase and test this plugin's functionality.\nSet it up following ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-example#get-started"},"its readme"),", but after installing it, link it to use your local plugin repository:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ cd \n$ npm link\n\n$ cd \n$ npm link @shardlabs/starknet-hardhat-plugin\n")),(0,r.kt)("p",null,"If your IDE is reporting Typescript issues after compiling the plugin, you may want to restart the Typescript language server (e.g. in VS Code on Linux: Ctrl+Shift+P)"),(0,r.kt)("h2",{id:"testing"},"Testing"),(0,r.kt)("p",null,"A test case is added by creating a directory in a subdirectory of a test group in the ",(0,r.kt)("inlineCode",{parentName:"p"},"test")," directory. E.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"declare-test")," is a test case in the ",(0,r.kt)("inlineCode",{parentName:"p"},"general-tests")," test group. A test case should contain:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"a ",(0,r.kt)("inlineCode",{parentName:"li"},"check.ts")," script which does the testing logic"),(0,r.kt)("li",{parentName:"ul"},"a ",(0,r.kt)("inlineCode",{parentName:"li"},"network.json")," file which specifies on which networks should the test case be run"),(0,r.kt)("li",{parentName:"ul"},"a ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config.ts")," file will be used")),(0,r.kt)("p",null,"The main testing script is ",(0,r.kt)("inlineCode",{parentName:"p"},"scripts/test.ts"),". It iterates over the test cases the test group specified by the ",(0,r.kt)("inlineCode",{parentName:"p"},"TEST_SUBDIR")," environment variable."),(0,r.kt)("h3",{id:"executing-tests-locally"},"Executing tests locally"),(0,r.kt)("p",null,"When running tests locally, you probably don't want to run the whole ",(0,r.kt)("inlineCode",{parentName:"p"},"test.sh")," script as it may alter your development environment. However, you can run individual tests by:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"positioning yourself in your example repository"),(0,r.kt)("li",{parentName:"ul"},"configuring the ",(0,r.kt)("inlineCode",{parentName:"li"},"hardhat.config.ts")),(0,r.kt)("li",{parentName:"ul"},"executing the ",(0,r.kt)("inlineCode",{parentName:"li"},"check.ts")," script (potentially modifying it to address path differences)")),(0,r.kt)("p",null,"To run all tests, you can use the ",(0,r.kt)("inlineCode",{parentName:"p"},"test-")," scripts defined in ",(0,r.kt)("inlineCode",{parentName:"p"},"package.json"),". For the tests to work, you may need to set the values from ",(0,r.kt)("inlineCode",{parentName:"p"},"config.json")," as environment variables. You should also have the ",(0,r.kt)("a",{parentName:"p",href:"https://stedolan.github.io/jq/"},(0,r.kt)("inlineCode",{parentName:"a"},"jq")," CLI tool")," installed."),(0,r.kt)("h3",{id:"executing-individual-tests"},"Executing individual tests"),(0,r.kt)("p",null,"To run a specific test case in the test group you can pass in the name of directory inside test group. E.g. to run ",(0,r.kt)("inlineCode",{parentName:"p"},"declare-test")," test case in ",(0,r.kt)("inlineCode",{parentName:"p"},"general-tests")," test group, you can use the script\n",(0,r.kt)("inlineCode",{parentName:"p"},"test-general-tests")," and pass in the name of the test after a ",(0,r.kt)("inlineCode",{parentName:"p"},"--")," like this,"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"$ npm run test-general-tests -- declare-test\n")),(0,r.kt)("h3",{id:"running-tests-in-dev-mode"},"Running tests in dev mode"),(0,r.kt)("p",null,"To run tests locally with test-dev. This is designed to run same tests repeatedly while developing."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-sh"},"$ npm run test-dev\n")),(0,r.kt)("h3",{id:"executing-tests-on-circleci"},"Executing tests on CircleCI"),(0,r.kt)("p",null,"If you're a member of the organization and you do a push to origin, you trigger CI/CD workflow on CircleCI. Track the progress on ",(0,r.kt)("a",{parentName:"p",href:"https://circleci.com/gh/0xSpaceShard/workflows/starknet-hardhat-plugin"},"the dashboard"),"."),(0,r.kt)("p",null,"Sometimes the tests fail because of internal CircleCI or Starknet issues; in that case, you can try restarting the workflow."),(0,r.kt)("p",null,"Bear in mind that each workflow consumes credits. Track the spending ",(0,r.kt)("a",{parentName:"p",href:"https://app.circleci.com/settings/plan/github/0xSpaceShard/overview"},"here"),"."),(0,r.kt)("p",null,"The whole workflow is defined in ",(0,r.kt)("inlineCode",{parentName:"p"},".circleci/config.yml")," - you may find it somewhat chaotic as it uses dependency caching (we kind of sacrificed config clarity for performance)."),(0,r.kt)("p",null,"Script ",(0,r.kt)("inlineCode",{parentName:"p"},"scripts/set-alpha-vars.sh")," expects account information to be set through environment variables. These variables are defined in ",(0,r.kt)("a",{parentName:"p",href:"https://app.circleci.com/settings/organization/github/0xSpaceShard/contexts/c36fa213-2511-465b-b303-0d35d76b42eb"},"spaceshard CircleCI context"),". If you upload a new account (with new keys), you cannot modify existing variables but have to delete old ones and create new ones."),(0,r.kt)("p",null,"To skip running tests on CircleCI, add ",(0,r.kt)("inlineCode",{parentName:"p"},"[skip ci]")," in the first 250 characters of the commit message."),(0,r.kt)("h3",{id:"testing-network"},"Testing network"),(0,r.kt)("p",null,"The script ",(0,r.kt)("inlineCode",{parentName:"p"},"test.sh")," runs tests on Devnet and Testnet (alpha-goerli). To skip running tests on Testnet, add ",(0,r.kt)("inlineCode",{parentName:"p"},"[skip testnet]")," to the commit message."),(0,r.kt)("h3",{id:"creating-a-pr"},"Creating a PR"),(0,r.kt)("p",null,"When adding new functionality to the plugin, you will probably also have to create a PR to the ",(0,r.kt)("inlineCode",{parentName:"p"},"plugin")," branch of ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet-hardhat-example"),". You can then modify the ",(0,r.kt)("inlineCode",{parentName:"p"},"test.sh")," script to use your branch instead of the ",(0,r.kt)("inlineCode",{parentName:"p"},"plugin")," branch."),(0,r.kt)("p",null,"If your reviewer makes an observation that requires a fix, after you push the commit with the fix, find the commit link on the PR conversation page, and reply to the reviewer by providing that link. In ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/pull/130#discussion_r913581807"},"this example")," the contributor even linked to the specific change of the commit - you don't have to do that if you made multiple smaller commits."),(0,r.kt)("p",null,"When the PR is ready to be merged, do ",(0,r.kt)("inlineCode",{parentName:"p"},"Squash and merge")," and delete the branch."),(0,r.kt)("h2",{id:"adapting-to-a-new-starknet--cairo-lang-version"},"Adapting to a new Starknet / cairo-lang version"),(0,r.kt)("p",null,"Since the plugin relies on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-devnet"},"Devnet")," in its tests, first an adapted version of Devnet might need to be released. Current versions of Devnet and cairo-lang used in tests are specified in ",(0,r.kt)("inlineCode",{parentName:"p"},"config.json"),"."),(0,r.kt)("h3",{id:"in-cairo-cli-repo"},"In cairo-cli repo"),(0,r.kt)("p",null,"When a new Starknet / cairo-lang version is released, a new ",(0,r.kt)("inlineCode",{parentName:"p"},"cairo-cli")," Docker image can be released (probably without any adaptation). This is done through the CI/CD pipeline of ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/cairo-cli-docker#build-a-new-image"},"the cairo-cli-docker repository"),"."),(0,r.kt)("p",null,"Likely places where the old version has to be replaced with the new version are ",(0,r.kt)("inlineCode",{parentName:"p"},"README.md")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"constants.ts"),"."),(0,r.kt)("h3",{id:"in-starknet-hardhat-example-repo"},"In starknet-hardhat-example repo"),(0,r.kt)("p",null,"Change the version in ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat.config.ts"),". Recompile the contracts (only important for local usage)."),(0,r.kt)("h2",{id:"architecture"},"Architecture"),(0,r.kt)("h3",{id:"wrapper"},"Wrapper"),(0,r.kt)("p",null,"This plugin is a wrapper around Starknet CLI (tool installed with cairo-lang). E.g. when you do ",(0,r.kt)("inlineCode",{parentName:"p"},"hardhat starknet-compile-deprecated")," in a shell or ",(0,r.kt)("inlineCode",{parentName:"p"},"contractFactory.deploy()")," in a Hardhat JS/TS script, you are making a subprocess that executes Starknet CLI's ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet deploy"),"."),(0,r.kt)("p",null,"There are two wrappers around Starknet CLI. They are defined in ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/starknet-wrappers.ts"},"starknet-wrapper.ts")," and both rely on a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/blob/master/src/starknet_cli_wrapper.py"},"proxy server")," that imports ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," methods of ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"starknet-compile-deprecated")," and uses them to execute commands (this is a speedup since a subprocess importing the whole Starknet doesn't have to be spawned for each request)."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Docker wrapper:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"runs Starknet CLI in a Docker container"),(0,r.kt)("li",{parentName:"ul"},"the default option"))),(0,r.kt)("li",{parentName:"ul"},"Venv wrapper:",(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"for users that already have ",(0,r.kt)("inlineCode",{parentName:"li"},"cairo-lang")," installed"),(0,r.kt)("li",{parentName:"ul"},"faster than Docker wrapper - not necessarily true since Docker wrapper also started using a proxy server")))),(0,r.kt)("h3",{id:"accessing-hardhatruntimeenvironment-hre"},"Accessing HardhatRuntimeEnvironment (hre)"),(0,r.kt)("p",null,"Before v0.7.0 we didn't know how to export classes to users, since every class needed to have access to ",(0,r.kt)("inlineCode",{parentName:"p"},"hre"),", which was passed on in ",(0,r.kt)("inlineCode",{parentName:"p"},"extendEnvironment"),". After introducing dynamic ",(0,r.kt)("inlineCode",{parentName:"p"},"hre")," importing, exporting clases has become a possibility:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-typescript"},'const hre = await import("hardhat");\n')),(0,r.kt)("p",null,"In ",(0,r.kt)("inlineCode",{parentName:"p"},"types/starknet.ts"),", classes are specified using ",(0,r.kt)("inlineCode",{parentName:"p"},"typeof"),", e.g. ",(0,r.kt)("inlineCode",{parentName:"p"},"OpenZeppelinAccount: typeof OpenZeppelinAccount"),". However, exporting classes this way doesn't export their type."),(0,r.kt)("h2",{id:"version-management"},"Version management"),(0,r.kt)("p",null,"When a push is done to the ",(0,r.kt)("inlineCode",{parentName:"p"},"master")," branch and the version in ",(0,r.kt)("inlineCode",{parentName:"p"},"package.json")," differs from the one published on ",(0,r.kt)("inlineCode",{parentName:"p"},"npm"),", the release process is triggered."),(0,r.kt)("p",null,"The updating of ",(0,r.kt)("inlineCode",{parentName:"p"},"package.json")," doesn't have to be done directly, but can be done by running"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"$ npm version \n")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"NEW_VERSION")," can be anything documented ",(0,r.kt)("a",{parentName:"p",href:"https://docs.npmjs.com/cli/v8/commands/npm-version"},"here"),", but will most commonly be ",(0,r.kt)("inlineCode",{parentName:"p"},"patch"),"."),(0,r.kt)("p",null,"This will also update ",(0,r.kt)("inlineCode",{parentName:"p"},"package-lock.json"),", create a new commit, and create a new git tag."),(0,r.kt)("p",null,"If for whatever reason the publishing workflow in CI/CD cannot be executed, the version can be released manually via ",(0,r.kt)("inlineCode",{parentName:"p"},"scripts/npm-publish.sh"),", just be sure to have an NPM access token and that you have the rights to publish."),(0,r.kt)("p",null,"Apart from ",(0,r.kt)("a",{parentName:"p",href:"https://www.npmjs.com/package/@shardlabs/starknet-hardhat-plugin?activeTab=versions"},"npm"),", releases are also tracked on ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/releases"},"GitHub")," with ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/tags"},"git tags"),". Notice the prepended ",(0,r.kt)("inlineCode",{parentName:"p"},"v")," in tag names."),(0,r.kt)("p",null,"When the tag is pushed:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ git push origin \n")),(0,r.kt)("p",null,"the release can be made public ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/0xSpaceShard/starknet-hardhat-plugin/releases/new"},"on GitHub"),". Automatic note generation can be used, augmented with usage and development changes (see past releases for reference)."),(0,r.kt)("p",null,"Users should be notified about the usage related changes. This can be done on Telegram, ",(0,r.kt)("a",{parentName:"p",href:"https://discord.com/channels/793094838509764618/912735106899275856"},"Discord"),", ",(0,r.kt)("a",{parentName:"p",href:"https://community.starknet.io/t/starknet-hardhat-plugin/67"},"Shamans")," etc."),(0,r.kt)("h3",{id:"docs"},"Docs"),(0,r.kt)("p",null,"New documentation is ",(0,r.kt)("strong",{parentName:"p"},"automatically")," deployed after publishing a new version with ",(0,r.kt)("inlineCode",{parentName:"p"},"scripts/npm-publish.sh"),"."),(0,r.kt)("p",null,"To manually deploy new documentation, run:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash"},"$ cd www\n$ npm ci\n$ npm run deploy\n")),(0,r.kt)("h3",{id:"example-repo-after-a-new-version"},"Example repo after a new version"),(0,r.kt)("p",null,"After releasing a new plugin version, the ",(0,r.kt)("inlineCode",{parentName:"p"},"plugin")," branch of the example repo should be updated and pushed:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"package.json")," should be updated by running ",(0,r.kt)("inlineCode",{parentName:"li"},"npm install --save-exact @shardlabs/starknet-hardhat-plugin@")),(0,r.kt)("li",{parentName:"ul"},"The ",(0,r.kt)("inlineCode",{parentName:"li"},"master")," branch, which serves as reference to the users, should be synchronized with the ",(0,r.kt)("inlineCode",{parentName:"li"},"plugin")," branch. This can probably be done by doing ",(0,r.kt)("inlineCode",{parentName:"li"},"git reset plugin")," while on ",(0,r.kt)("inlineCode",{parentName:"li"},"master"),"."),(0,r.kt)("li",{parentName:"ul"},"Since you did ",(0,r.kt)("inlineCode",{parentName:"li"},"npm install"),", you may need to link again, as described ",(0,r.kt)("a",{parentName:"li",href:"#set-up-the-example-repository"},"initially"),".")))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.3e19e4bf.js b/assets/js/main.3e19e4bf.js deleted file mode 100644 index aee037db..00000000 --- a/assets/js/main.3e19e4bf.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.3e19e4bf.js.LICENSE.txt */ -(self.webpackChunkdocusaurus=self.webpackChunkdocusaurus||[]).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={"03e12d40":[()=>n.e(651).then(n.t.bind(n,5745,19)),"/home/fabijanc/shardlabs/starknet-hardhat-plugin/www/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],"0e384e19":[()=>n.e(671).then(n.bind(n,9881)),"@site/docs/intro.md",9881],17896441:[()=>Promise.all([n.e(532),n.e(666),n.e(918)]).then(n.bind(n,3332)),"@theme/DocItem",3332],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1f391b9e":[()=>Promise.all([n.e(532),n.e(666),n.e(85)]).then(n.bind(n,4247)),"@theme/MDXPage",4247],"393be207":[()=>n.e(414).then(n.bind(n,3123)),"@site/src/pages/markdown-page.md",3123],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"79c382f5":[()=>n.e(197).then(n.t.bind(n,3769,19)),"/home/fabijanc/shardlabs/starknet-hardhat-plugin/www/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"950718c7":[()=>n.e(796).then(n.bind(n,2433)),"@site/docs/dev.md",2433],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(195)]).then(n.bind(n,3261)),"@site/src/pages/index.js",3261]};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(972).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=[],h=(0,c.Z)(o);return Object.entries(h).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:"/starknet-hardhat-plugin/markdown-page",component:f("/starknet-hardhat-plugin/markdown-page","8ac"),exact:!0},{path:"/starknet-hardhat-plugin/docs",component:f("/starknet-hardhat-plugin/docs","a6b"),routes:[{path:"/starknet-hardhat-plugin/docs/dev",component:f("/starknet-hardhat-plugin/docs/dev","276"),exact:!0},{path:"/starknet-hardhat-plugin/docs/intro",component:f("/starknet-hardhat-plugin/docs/intro","275"),exact:!0}]},{path:"/starknet-hardhat-plugin/",component:f("/starknet-hardhat-plugin/","577"),exact:!0},{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),h=n(2263),g=n(4996),v=n(6668),b=n(1944),y=n(4711),w=n(9727),k=n(3320),E=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.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,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,c.TH)();return e+(0,g.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 C(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,v.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(b.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function _(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),L=n(8940);function R(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);n?.scrollIntoView()}else window.scrollTo(0,0)}(n),R("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 O extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),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(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const I=O,D="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner",F="docusaurus-base-url-issue-banner-suggestion-container",B="__DOCUSAURUS_INSERT_BASEURL_BANNER";function j(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('${D}');\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,j(e))),r.createElement("div",{id:D}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(z,null):null}function $(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.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 H=n(4763);function q(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(H.Z,null,r.createElement(L.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement($,null),r.createElement(C,null),r.createElement(U,null),r.createElement(I,{location:_(t)},e)))))}var G=n(6887);const Z=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 V=n(9670);const W=new Set,Y=new Set,K=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,Q={prefetch(e){if(!(e=>!K()&&!Y.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!K()&&!Y.has(e))(e)&&(Y.add(e),P(e))},X=Object.freeze(Q);if(l.Z.canUseDOM){window.docusaurus=X;const e=a.hydrate;P(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(q,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":"/starknet-hardhat-plugin/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/starknet-hardhat-plugin/docs","mainDocId":"dev","docs":[{"id":"dev","path":"/starknet-hardhat-plugin/docs/dev"},{"id":"intro","path":"/starknet-hardhat-plugin/docs/intro"}],"draftIds":[],"sidebars":{}}],"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.2.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.2.0"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.2.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.2.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.2.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.2.0"}}}'),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:()=>c});var r=n(7294),a=n(412),o=n(5742),i=n(3285);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c 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??u)(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:h,"data-noBrokenLinkCheck":g,autoAddBaseUrl:v=!0,...b}=e;const{siteConfig:{trailingSlash:y,baseUrl:w}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),E=(0,a.useContext)(c),S=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>S.current));const x=f||p;const C=(0,s.Z)(x),T=x?.replace("pathname://","");let _=void 0!==T?(A=T,v&&(e=>e.startsWith("/"))(A)?k(A):A):void 0;var A;_&&C&&(_=(0,i.applyTrailingSlash)(_,{trailingSlash:y,baseUrl:w}));const L=(0,a.useRef)(!1),R=n?o.OL:o.rU,N=u.Z.canUseIntersectionObserver,P=(0,a.useRef)(),O=()=>{L.current||null==_||(window.docusaurus.preload(_),L.current=!0)};(0,a.useEffect)((()=>(!N&&C&&null!=_&&window.docusaurus.prefetch(_),()=>{N&&P.current&&P.current.disconnect()})),[P,_,N,C]);const I=_?.startsWith("#")??!1,D=!_||!C||I;return D||g||E.collectLink(_),D?a.createElement("a",(0,r.Z)({ref:S,href:_},x&&!C&&{target:"_blank",rel:"noopener noreferrer"},b)):a.createElement(R,(0,r.Z)({},b,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,N&&e&&C&&(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!=_&&window.docusaurus.prefetch(_))}))})),P.current.observe(e))},to:_},n&&{isActive:h,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:()=>o,Z:()=>i});var r=n(2263),a=n(3919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)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)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();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:()=>h,gA:()=>f,_r:()=>c,Jo:()=>g,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 h(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function g(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(6726)(`./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"}))}},3285:(e,t,n)=>{"use strict";n.d(t,{Z:()=>st});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 h(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 g=n(5281),v=n(9727);const b={skipToContent:"skipToContent_fXgn"};function y(){return r.createElement(h,{className:b.skipToContent})}var w=n(6668),k=n(9689);function E(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(E,{width:14,height:14,strokeWidth:3.1}))}const C={content:"content_knG7"};function T(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const _={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:_.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:_.announcementBarPlaceholder}),r.createElement(T,{className:_.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:_.announcementBarClose}))}var L=n(2961),R=n(2466);var N=n(902),P=n(3102);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,P.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,N.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(O.Provider,{value:n},t)}function D(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function M(){const e=(0,r.useContext)(O);if(!e)throw new N.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:D(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=M();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),j=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 $={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function H(e){let{className:t,value:n,onChange:o}=e;const i=(0,j.Z)(),l=(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"===n?(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)($.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",$.toggleButton,!i&&$.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)($.toggleIcon,$.lightToggleIcon)}),r.createElement(U,{className:(0,a.Z)($.toggleIcon,$.darkToggleIcon)})))}const q=r.memo(H);function G(e){let{className:t}=e;const n=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,B.I)();return n?null:r.createElement(q,{className:t,value:a,onChange:o})}var Z=n(1327);function V(){return r.createElement(Z.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,L.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(E,{color:"var(--ifm-color-emphasis-600)"}))}function Y(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(V,null),r.createElement(G,{className:"margin-right--md"}),r.createElement(W,null))}var K=n(9960),Q=n(4996),X=n(3919);function J(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var ee=n(9471);function te(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}),h=i&&o&&!(0,X.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(ee.Z,u&&{width:12,height:12}))};return o?r.createElement(K.Z,(0,l.Z)({href:c?m:o},d,g)):r.createElement(K.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?J(n,t.pathname):t.pathname.startsWith(p)},d,g))}function ne(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(te,(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 re(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(te,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function ae(e){let{mobile:t=!1,position:n,...a}=e;const o=t?re:ne;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var oe=n(6043),ie=n(8596),le=n(2263);function se(e,t){return e.some((e=>function(e,t){return!!(0,ie.Mg)(e.to,t)||!!J(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ue(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.removeEventListener("mousedown",e),document.removeEventListener("touchstart",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(te,(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,n)=>r.createElement(Se,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function ce(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=se(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,oe.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(te,(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(oe.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Se,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function de(e){let{mobile:t=!1,...n}=e;const a=t?ce:ue;return r.createElement(a,n)}var fe=n(4711);function pe(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 me="iconLanguage_nlXk";var he=n(1875);const ge={searchBox:"searchBox_ZlJk"};function ve(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,ge.searchBox)},t)}var be=n(143),ye=n(2802);var we=n(373);const ke=e=>e.docs.find((t=>t.id===e.mainDocId));const Ee={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,le.Z)(),f=(0,fe.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...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],g=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(de,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(pe,{className:me}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(ve,{className:n},r.createElement(he.Z,null))},dropdown:de,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,be.Iw)(a),s=(0,ye.vY)(t,a);return null===s?null:r.createElement(ae,(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,be.Iw)(a),s=(0,ye.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(ae,(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,ye.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(ae,(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,be.Iw)(n),m=(0,be.gB)(n),{savePreferredVersionName:h}=(0,we.J)(n),g=[...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:()=>h(e.name)}})),...i],v=(0,ye.lO)(n)[0],b=t&&g.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):v.label,y=t&&g.length>1?void 0:ke(v).path;return g.length<=1?r.createElement(ae,(0,l.Z)({},c,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(de,(0,l.Z)({},c,{mobile:t,label:b,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Se(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ee[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function xe(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Se,(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=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Ce,{onClick:()=>t.hide()}),t.content)}function _e(){const e=(0,L.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(Y,null),primaryMenu:r.createElement(xe,null),secondaryMenu:r.createElement(Te,null)}):null}const Ae={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Le(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Re(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.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,R.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,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(Le,{onClick:i.toggle}),r.createElement(_e,null))}const Ne="right";function Pe(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 Oe(){const{toggle:e,shown:t}=(0,L.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(Pe,null))}const Ie={colorModeToggle:"colorModeToggle_DEke"};function De(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Se,(0,l.Z)({},e,{key:t})))))}function Me(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 Fe(){const e=(0,L.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??Ne)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Me,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Oe,null),r.createElement(V,null),r.createElement(De,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(De,{items:a}),r.createElement(G,{className:Ie.colorModeToggle}),!o&&r.createElement(ve,null,r.createElement(he.Z,null)))})}function Be(){return r.createElement(Re,null,r.createElement(Fe,null))}function je(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(K.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,X.Z)(a)&&r.createElement(ee.Z,null))}function ze(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(je,{item:t}))}function Ue(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(ze,{key:t,item:e})))))}function $e(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Ue,{key:t,column:e}))))}function He(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function qe(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(je,{item:t})}function Ge(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(qe,{item:e}),t.length!==n+1&&r.createElement(He,null))))))}function Ze(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement($e,{columns:t}):r.createElement(Ge,{links:t})}var Ve=n(941);const We={footerLogoLink:"footerLogoLink_BH7S"};function Ye(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(Ve.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function Ke(e){let{logo:t}=e;return t.href?r.createElement(K.Z,{href:t.href,className:We.footerLogoLink,target:t.target},r.createElement(Ye,{logo:t})):r.createElement(Ye,{logo:t})}function Qe(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Xe(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 Je(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Xe,{style:o,links:n&&n.length>0&&r.createElement(Ze,{links:n}),logo:a&&r.createElement(Ke,{logo:a}),copyright:t&&r.createElement(Qe,{copyright:t})})}const et=r.memo(Je);var tt=n(12);const nt="docusaurus.tab.",rt=r.createContext(void 0);const at=(0,N.Qc)([B.S,k.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,tt.W)(`${nt}${e}`).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,tt._)().forEach((t=>{if(t.startsWith(nt)){const n=t.substring(nt.length);e[n]=(0,tt.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const a=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:a})),[e,a])}();return r.createElement(rt.Provider,{value:n},t)},R.OC,we.L5,i.VC,function(e){let{children:t}=e;return r.createElement(P.n2,null,r.createElement(L.M,null,r.createElement(I,null,t)))}]);function ot(e){let{children:t}=e;return r.createElement(at,null,t)}function it(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("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const lt={mainWrapper:"mainWrapper_z2l0"};function st(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(ot,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(A,null),r.createElement(Be,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,lt.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(it,e)},t)),!n&&r.createElement(et,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||"/"),h=n?"":t,g=u?.alt??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,u?.target&&{target:u.target}),u&&a.createElement(c,{logo:u,alt:g,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:()=>l,z:()=>h});var r=n(7462),a=n(7294),o=n(412);const i="ease-in-out";function l(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 s={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?s:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function d(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){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??i}`,height:`${t}px`}}function l(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=s.height,e.style.overflow=s.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function f(e){if(!o.Z.canUseDOM)return e?s:u}function p(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 d({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:f(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(u.current,n),i?.(n))},className:l},r)}function m(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(p,(0,r.Z)({},n,{collapsed:l})):null}function h(e){let{lazy:t,...n}=e;const r=t?m:p;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.W)("docusaurus.announcement.dismiss"),u=(0,o.W)("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:()=>g,S:()=>h});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.W)(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 h(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 g(){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:()=>b,L5:()=>g});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),u=n(12);const c=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,u.W)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.W)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.W)(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 h(e){let{children:t}=e;const n=m();return r.createElement(p.Provider,{value:n},t)}function g(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(p);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function b(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{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}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6550),l=n(902);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(6668);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.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:{}}},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>h,cE:()=>d,hI:()=>k,lO:()=>b,vY:()=>w,oz:()=>y,s1:()=>v});var r=n(7294),a=n(6550),o=n(8790),i=n(143),l=n(373),s=n(1116);function u(e){return Array.from(new Set(e))}var 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=>h(e,t)));function h(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||m(e.items,t))}function g(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 v(){const e=(0,s.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?g({sidebarItems:e.items,pathname:t}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function y(e,t){const n=b(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(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function w(e,t){const n=b(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(`DocNavbarItem: 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- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function k(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}}},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:()=>f,OC:()=>s,RF:()=>d});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=(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,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"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,o||(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),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(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}}(e);const n=a(t?.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"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)}},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.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},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_:()=>T,ob:()=>p,PP:()=>A,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,h(),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),h=s(n),g=0;g{"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{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],v=n[4],b=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=h&&null!=m&&m!==h,E="+"===y||"*"===y,S="?"===y||"*"===y,x=n[2]||c,C=v||b;r.push({name:g||o++,prefix:h||"",delimiter:x,optional:S,repeat:E,partial:k,asterisk:!!w,pattern:C?u(C):w?".*":"[^"+s(x)+"]+?"})}}return i{"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+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var C,T=1;if(b){if(!(C=o(k,S,e,v))||C.index>=e.length)break;var _=C.index,A=C.index+C[0].length,L=S;for(L+=E.value.length;_>=L;)L+=(E=E.next).value.length;if(S=L-=E.value.length,E.value instanceof a)continue;for(var R=E;R!==t.tail&&(Ld.reach&&(d.reach=I);var D=E.prev;if(P&&(D=s(t,D,P),S+=P.length),u(t,D,T),E=s(t,D,new a(f,g?r.tokenize(N,g):N,y,N)),O&&s(t,E,O),T>1){var M={cause:f+","+m,reach:I};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.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 h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(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 h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),v=f.substring(m+p.length),b=[];h&&b.push.apply(b,i([h])),b.push(g),v&&b.push.apply(b,i([v])),"string"==typeof u?l.splice.apply(l,[s,1].concat(b)):u.content=b}}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},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;a(m);){for(var h in f={},m){var g=s[h];t(g&&g.modify,(function(e){e in d&&(f[e]=!0)}))}for(var v in d)if(!(v in c))for(var b in p(v))if(b in c){f[v]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},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