From 652b4851427676abb2a2f272fe30dcc1e253e03b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 8 Jan 2024 14:02:29 +0000 Subject: [PATCH] deploy: 340aadb919318f961e4f224b3e0c3667dbc15271 --- 404.html | 8 ++++---- assets/js/a5a67c7b.b472adfd.js | 1 + assets/js/a5a67c7b.db2fe5ac.js | 1 - assets/js/d33af5b6.79d5e054.js | 1 + assets/js/d33af5b6.ad69056a.js | 1 - .../js/{main.1dbc2a26.js => main.6aadb150.js} | 4 ++-- ...CENSE.txt => main.6aadb150.js.LICENSE.txt} | 0 ...n.1b1e64f4.js => runtime~main.5f7f9228.js} | 2 +- docs/faq/index.html | 8 ++++---- docs/infrastructure/emails/index.html | 8 ++++---- docs/infrastructure/pra/index.html | 8 ++++---- docs/infrastructure/presentation/index.html | 8 ++++---- docs/init/accueil-produits/index.html | 8 ++++---- docs/init/fonctionnement/index.html | 8 ++++---- docs/init/presentation/index.html | 8 ++++---- docs/standards/accessibilite/index.html | 8 ++++---- docs/standards/databases/index.html | 8 ++++---- docs/standards/developpement/index.html | 8 ++++---- docs/standards/docker/index.html | 8 ++++---- docs/standards/kubernetes/index.html | 10 +++++----- docs/standards/mobile/index.html | 8 ++++---- docs/standards/securite/index.html | 19 +++++++++---------- docs/standards/tests/index.html | 8 ++++---- docs/workshops/index.html | 8 ++++---- docs/workshops/kubernetes/index.html | 8 ++++---- index.html | 8 ++++---- search-index.json | 2 +- search/index.html | 8 ++++---- 28 files changed, 92 insertions(+), 93 deletions(-) create mode 100644 assets/js/a5a67c7b.b472adfd.js delete mode 100644 assets/js/a5a67c7b.db2fe5ac.js create mode 100644 assets/js/d33af5b6.79d5e054.js delete mode 100644 assets/js/d33af5b6.ad69056a.js rename assets/js/{main.1dbc2a26.js => main.6aadb150.js} (99%) rename assets/js/{main.1dbc2a26.js.LICENSE.txt => main.6aadb150.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.1b1e64f4.js => runtime~main.5f7f9228.js} (97%) diff --git a/404.html b/404.html index 3d53fd0d..d0ed7be0 100644 --- a/404.html +++ b/404.html @@ -4,13 +4,13 @@ Page introuvable | SocialGouv SRE documentation - - + +
Aller au contenu principal

Page introuvable

Nous n'avons pas trouvé ce que vous recherchez.

Veuillez contacter le propriétaire du site qui vous a lié à l'URL d'origine et leur faire savoir que leur lien est cassé.

- - + + \ No newline at end of file diff --git a/assets/js/a5a67c7b.b472adfd.js b/assets/js/a5a67c7b.b472adfd.js new file mode 100644 index 00000000..1b900fa9 --- /dev/null +++ b/assets/js/a5a67c7b.b472adfd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksupport=self.webpackChunksupport||[]).push([[771],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(7294);function s(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 i(e){for(var t=1;t=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}var o=a.createContext({}),u=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(o.Provider,{value:t},e.children)},d="mdxType",c={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,s=e.mdxType,r=e.originalType,o=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(n),m=s,h=d["".concat(o,".").concat(m)]||d[m]||c[m]||r;return n?a.createElement(h,i(i({ref:t},p),{},{components:n})):a.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var o in t)hasOwnProperty.call(t,o)&&(l[o]=t[o]);l.originalType=e,l[d]="string"==typeof e?e:s,i[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var a=n(7462),s=(n(7294),n(3905));const r={},i="S\xe9curit\xe9",l={unversionedId:"standards/securite",id:"standards/securite",title:"S\xe9curit\xe9",description:"\ud83d\udd12 Tous les acc\xe8s aux outils doivent \xeatre s\xe9curis\xe9s par authentification\xe0 deux",source:"@site/docs/standards/securite.md",sourceDirName:"standards",slug:"/standards/securite",permalink:"/support/docs/standards/securite",draft:!1,editUrl:"https://github.com/socialgouv/support/tree/master/docs/standards/securite.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Bases de donn\xe9es",permalink:"/support/docs/standards/databases"},next:{title:"Kubernetes (K8S)",permalink:"/support/docs/standards/kubernetes"}},o={},u=[{value:"Outils",id:"outils",level:2},{value:"DashLord : dashboard de s\xe9curit\xe9 et accessibilt\xe9",id:"dashlord--dashboard-de-s\xe9curit\xe9-et-accessibilt\xe9",level:3},{value:"SonarCloud : analyseur statique de code",id:"sonarcloud--analyseur-statique-de-code",level:3},{value:"Talisman : pr\xe9vention de publication de secrets",id:"talisman--pr\xe9vention-de-publication-de-secrets",level:3},{value:"ClamAV : scan antivirus de fichiers",id:"clamav--scan-antivirus-de-fichiers",level:3},{value:"Best practices",id:"best-practices",level:2},{value:"CODEOWNERS",id:"codeowners",level:3},{value:"Third-parties",id:"third-parties",level:3},{value:"Maintenance des d\xe9pendances",id:"maintenance-des-d\xe9pendances",level:3},{value:"Contr\xf4les d'acc\xe8s",id:"contr\xf4les-dacc\xe8s",level:3},{value:"Leak d'informations",id:"leak-dinformations",level:3},{value:"S\xe9curit\xe9 navigateurs",id:"s\xe9curit\xe9-navigateurs",level:3},{value:"Sessions",id:"sessions",level:3},{value:"Mots de passe",id:"mots-de-passe",level:3},{value:"Robustesse",id:"robustesse",level:4},{value:"Proc\xe9dure de changement de mot de passe",id:"proc\xe9dure-de-changement-de-mot-de-passe",level:4},{value:"Proc\xe9dure de reset de mot passe",id:"proc\xe9dure-de-reset-de-mot-passe",level:4},{value:"DDOS",id:"ddos",level:3},{value:"Logging",id:"logging",level:3},{value:"Exceptions",id:"exceptions",level:4},{value:"Logs applicatifs",id:"logs-applicatifs",level:4},{value:"Position de la CNIL",id:"position-de-la-cnil",level:5},{value:"Actions \xe0 logger",id:"actions-\xe0-logger",level:5},{value:"Upload de fichiers",id:"upload-de-fichiers",level:3},{value:"Risques",id:"risques",level:4},{value:"Mesures",id:"mesures",level:4},{value:"FAQ",id:"faq",level:2},{value:"Mettre \xe0 jour les headers HTTP de mes applications",id:"mettre-\xe0-jour-les-headers-http-de-mes-applications",level:3},{value:"Directement via l'Ingress",id:"directement-via-lingress",level:4},{value:"C\xf4t\xe9 applicatif",id:"c\xf4t\xe9-applicatif",level:4},{value:"Chiffrer des fichiers",id:"chiffrer-des-fichiers",level:3},{value:"R\xe9f\xe9rences",id:"r\xe9f\xe9rences",level:2},{value:"G\xe9n\xe9ral",id:"g\xe9n\xe9ral",level:3},{value:"NodeJS",id:"nodejs",level:3},{value:"Docker",id:"docker",level:3}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,s.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"s\xe9curit\xe9"},"S\xe9curit\xe9"),(0,s.kt)("p",null,"\ud83d\udd12 Tous les acc\xe8s aux outils doivent \xeatre s\xe9curis\xe9s par authentification\xe0 deux\nfacteurs (2FA)."),(0,s.kt)("p",null,"\ud83c\udf10 Les variables d'environnement doivent \xeatre utilis\xe9es pour tout ce qui est\nsecrets, tokens, logins, urls, hostnames, etc."),(0,s.kt)("p",null,"\ud83d\udee1\ufe0f La gestion des secrets est assur\xe9e par des\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/bitnami-labs/sealed-secrets"},"sealed-secrets")," qui versionnent\nles secrets chiffr\xe9s dans GIT."),(0,s.kt)("h2",{id:"outils"},"Outils"),(0,s.kt)("h3",{id:"dashlord--dashboard-de-s\xe9curit\xe9-et-accessibilt\xe9"},"DashLord : dashboard de s\xe9curit\xe9 et accessibilt\xe9"),(0,s.kt)("p",null,"Accessible ici (se connecter pour voir plus d'informations) :\n",(0,s.kt)("a",{parentName:"p",href:"https://dashlord.fabrique.social.gouv.fr"},"https://dashlord.fabrique.social.gouv.fr"),"."),(0,s.kt)("p",null,"Voir aussi :\n",(0,s.kt)("a",{parentName:"p",href:"https://doc.incubateur.net/communaute/travailler-a-beta-gouv/jutilise-les-outils-de-la-communaute/dashlord"},"https://doc.incubateur.net/communaute/travailler-a-beta-gouv/jutilise-les-outils-de-la-communaute/dashlord"),"."),(0,s.kt)("h3",{id:"sonarcloud--analyseur-statique-de-code"},"SonarCloud : analyseur statique de code"),(0,s.kt)("p",null,"Les produits de l'organisation sont tous scann\xe9s et les r\xe9sultats sont\naccessibles ici : ",(0,s.kt)("a",{parentName:"p",href:"https://sonarcloud.io/organizations/socialgouv"},"https://sonarcloud.io/organizations/socialgouv"),"."),(0,s.kt)("h3",{id:"talisman--pr\xe9vention-de-publication-de-secrets"},"Talisman : pr\xe9vention de publication de secrets"),(0,s.kt)("p",null,"Publier involontairement un secret (par exemple un jeton d'acc\xe8s) sur un d\xe9p\xf4t\npublic peut avoir beaucoup de cons\xe9quences ind\xe9sirables. Une mani\xe8re efficace\nd'\xe9viter cela est d'ex\xe9cuter\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/thoughtworks/talisman/"},"un d\xe9tecteur de secrets comme ",(0,s.kt)("inlineCode",{parentName:"a"},"talisman")),"\nsur le hook ",(0,s.kt)("inlineCode",{parentName:"p"},"pre-commit")," de git."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-bash"},'yarn add -D husky is-ci node-talisman\n\n# installer husky seulement si hors environnement de CI\nnpm set-script postinstall "is-ci || husky install"\n\n# installation de husky gr\xe2ce au script de postinstall\nyarn\n\n# ex\xe9cuter node-talisman sur le hook de pre-commit\n# on d\xe9tecte ici si l\'interaction via un terminal est possible afin de ne pas\n# crash quand le pre-commit est lanc\xe9 par une application comme VSCode\nyarn husky add .husky/pre-commit "if sh -c \': >/dev/tty\' >/dev/null 2>/dev/null; then exec .talismanrc\n')),(0,s.kt)("p",null,"On utilise ",(0,s.kt)("inlineCode",{parentName:"p"},"husky")," pour g\xe9rer simplement le hook. Si vous utilisez d\xe9j\xe0 un\ngestionnaire de hooks, vous pouvez y ajouter ",(0,s.kt)("inlineCode",{parentName:"p"},"node-talisman")," de mani\xe8re\nsimilaire."),(0,s.kt)("p",null,"On pourra observer des cas de faux positif de talisman, par exemple sur des\nmigrations SQL ou des donn\xe9es en base64. Dans ce cas, on lit attentivement le\nrapport, et on ajuste\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/thoughtworks/talisman/#ignoring-files"},"le fichier ",(0,s.kt)("inlineCode",{parentName:"a"},".talismanrc")),"\nen fonction."),(0,s.kt)("h3",{id:"clamav--scan-antivirus-de-fichiers"},"ClamAV : scan antivirus de fichiers"),(0,s.kt)("p",null,"Lorsqu'un produit propose \xe0 ses utilisateurs de ",(0,s.kt)("strong",{parentName:"p"},"t\xe9l\xe9verser des fichiers"),", il\nest recommand\xe9 de ",(0,s.kt)("strong",{parentName:"p"},"scanner")," les fichiers pour y d\xe9tecter de ",(0,s.kt)("strong",{parentName:"p"},"potentiels\nvirus"),". Dans ce but, la Fabrique met \xe0 disposition un service ",(0,s.kt)("strong",{parentName:"p"},"ClamAV"),"."),(0,s.kt)("p",null,"Impl\xe9menter dans l'application la communication avec le service antivirus. On\npassera par une interface REST afin d'envoyer un ou plusieurs fichiers et la\nr\xe9ponse mentionnera pour chacun d'eux si le fichier semble sain."),(0,s.kt)("p",null,"Le service REST utilis\xe9 est celui-ci :\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/benzino77/clamav-rest-api"},"https://github.com/benzino77/clamav-rest-api"),"."),(0,s.kt)("p",null,"Il est n\xe9cessaire d'envoyer les fichiers \xe0\n",(0,s.kt)("inlineCode",{parentName:"p"},"http://clamav-rest.clamav.svc/api/v1/scan")," encod\xe9s avec ",(0,s.kt)("inlineCode",{parentName:"p"},"multipart/form-data"),"\net sous la cl\xe9 ",(0,s.kt)("inlineCode",{parentName:"p"},"FILES"),"."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Le service ClamAV n'est accessible que depuis l'int\xe9rieur de notre\ninfrastructure. Un scan ne peut donc \xeatre demand\xe9 que depuis le backend des\napplications, les clients n'y ont pas acc\xe8s.")),(0,s.kt)("p",null,"Exemple NodeJS :"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-js"},'const FormData = require("form-data");\nconst fs = require("fs");\n\nconst formData = new FormData();\nformData.append("FILES", fs.createReadStream("file1.txt"), "file1.txt");\nformData.append("FILES", fs.createReadStream("file2.txt"), "file2.txt");\n\nconst res = await fetch("http://clamav-rest.clamav.svc/api/v1/scan", {\n method: "POST",\n body: formData,\n headers: formData.getHeaders(),\n});\nconsole.log(await res.json());\n')),(0,s.kt)("admonition",{type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"Ce service de la Fabrique est exp\xe9rimental. Aucune application ne doit bloquer\nsur le scan antivirus car le service pourrait \xeatre indisponible.")),(0,s.kt)("h2",{id:"best-practices"},"Best practices"),(0,s.kt)("p",null,"Les ",(0,s.kt)("a",{parentName:"p",href:"https://cheatsheetseries.owasp.org/"},"cheat sheets OWASP")," sont une tr\xe8s\nbonne r\xe9f\xe9rence."),(0,s.kt)("h3",{id:"codeowners"},"CODEOWNERS"),(0,s.kt)("p",null,"Les workflows d'int\xe9gration et d\xe9ploiements continus des repositories SocialGouv\nsont prot\xe9g\xe9s par la convention\n",(0,s.kt)("a",{parentName:"p",href:"https://github.blog/2017-07-06-introducing-code-owners/"},"CODEOWNERS")," : tout\nchangement impactant potentiellement l'infrastructure doit \xeatre revue par une\npersonne de l'\xe9quipe OPS ou SRE. Ils seront automatiquement assign\xe9s aux issues\nqui touchent aux fichiers de CI lors d'une pull-request."),(0,s.kt)("h3",{id:"third-parties"},"Third-parties"),(0,s.kt)("p",null,"De mani\xe8re g\xe9n\xe9rale il est d\xe9conseill\xe9 de r\xe9f\xe9rencer des scripts externes dans\nses applications, comme des scripts ou CSS via CDN, google fonts ou autres\nservices tiers; Privil\xe9gier l'utilisation de librairies d\xe9di\xe9es que vous pouvez\nembarquer dans l'application elle-m\xeame."),(0,s.kt)("h3",{id:"maintenance-des-d\xe9pendances"},"Maintenance des d\xe9pendances"),(0,s.kt)("p",null,"Les packages utilis\xe9s dans les applications doivent \xeatre maintenus \xe0 jour et\nscann\xe9s r\xe9guli\xe8rement, id\xe9alement dans la CI."),(0,s.kt)("p",null,"Les packages non utilis\xe9s ou obsol\xe8tes doivent \xeatre supprim\xe9s."),(0,s.kt)("p",null,"Utilisez ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SocialGouv/renovate-config"},"renovate")," pour\nmaintenir votre application \xe0 jour et pr\xe9voyez le temps n\xe9cessaire dans les\nsprints."),(0,s.kt)("h3",{id:"contr\xf4les-dacc\xe8s"},"Contr\xf4les d'acc\xe8s"),(0,s.kt)("p",null,"La mise en place d'un middleware de RBAC par lequel toutes les requ\xeates\nentrantes passent permet de rejeter au plus t\xf4t les requ\xeates ill\xe9gitimes et de\nmettre en place une liste blanche de pages ou endpoints non prot\xe9g\xe9s (le\ncomportement par d\xe9faut \xe9tant \"prot\xe9g\xe9\" pour \xe9viter l'introduction de d\xe9fauts de\ncontr\xf4le d'acc\xe8s au fur et \xe0 mesure des d\xe9veloppements)."),(0,s.kt)("p",null,"Ex : ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/nyambati/express-acl"},"https://github.com/nyambati/express-acl")),(0,s.kt)("p",null,"Mettre en place une ",(0,s.kt)("strong",{parentName:"p"},"matrice des r\xf4les")," qui associe \xe0 chaque type de donn\xe9e\ndes permissions de type lecture/\xe9criture par r\xf4le."),(0,s.kt)("h3",{id:"leak-dinformations"},"Leak d'informations"),(0,s.kt)("p",null,"Les informations techniques ne doivent pas \xeatre expos\xe9es au runtime. Les\nserveurs et applications ne doivent pas fournir de header ou signature\npermettant de les identifier. (ex: header ",(0,s.kt)("inlineCode",{parentName:"p"},"Served-by"),")"),(0,s.kt)("p",null,"Les donn\xe9es de d\xe9veloppement (GIT et bases de donn\xe9es) doivent \xeatre consid\xe9r\xe9es\ncomme publiques et ne pas utiliser de donn\xe9es sensibles ou personnelles."),(0,s.kt)("p",null,"Les d\xe9veloppeur(se)s ne doivent en aucun cas recevoir de donn\xe9es de production\nsur leur poste de travail. Les \xe9quipes de dev doivent mettre en oeuvre des\nm\xe9canismes de ",(0,s.kt)("inlineCode",{parentName:"p"},"seeds")," pour travailler avec des volumes de donn\xe9es r\xe9alistes."),(0,s.kt)("p",null,"Les applications ne doivent jamais logger d'information confidentielle ou de\ncredentials sur la console. En effet ces informations pourraient remonter sur\nles outils de logging tels Sentry ou grafana."),(0,s.kt)("h3",{id:"s\xe9curit\xe9-navigateurs"},"S\xe9curit\xe9 navigateurs"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"D\xe9finir une ",(0,s.kt)("strong",{parentName:"li"},"content security policy (CSP) stricte"),", comme par exemple :\nen-t\xeate HTTP Content-Security-Policy: default-src 'self'; frame-ancestors\n'self'; Utiliser un outil comme\n",(0,s.kt)("a",{parentName:"li",href:"https://github.com/april/laboratory"},"Laboratory")," pour profiler votre\napplication et v\xe9rifier les headers CSP."),(0,s.kt)("li",{parentName:"ul"},"D\xe9finir l'attribut \"integrity\" sur l'ensemble des ressources link et script de\nla page (",(0,s.kt)("strong",{parentName:"li"},"SubResource Integrity"),")."),(0,s.kt)("li",{parentName:"ul"},"Gestion des ",(0,s.kt)("strong",{parentName:"li"},"cookies")," : utiliser les attributs de cookie ",(0,s.kt)("strong",{parentName:"li"},"HttpOnly, Secure\net SameSite"),'. Ne pas mettre SameSite \xe0 "None".'),(0,s.kt)("li",{parentName:"ul"},"Auto-h\xe9berger l'ensemble des ressources de la page. Pour celles qui ne peuvent\npas l'\xeatre et pour les traitements de moindre confiance, utiliser un WebWorker\nou une iFrame avec l'attribut \"sandbox\"."),(0,s.kt)("li",{parentName:"ul"},"Les verbes HTTP doivent \xeatre respect\xe9s, les op\xe9rations ",(0,s.kt)("inlineCode",{parentName:"li"},"GET")," ne doivent pas\nmodifier de donn\xe9es."),(0,s.kt)("li",{parentName:"ul"},"En cas d'utilisation de sessions, les op\xe9rations qui impactent des donn\xe9es\ndoivent \xeatre prot\xe9g\xe9es des\n",(0,s.kt)("a",{parentName:"li",href:"https://www.cert.ssi.gouv.fr/information/CERTA-2008-INF-003/"},"attaques de type CSRF"),"\navec un syst\xe8me de jeton.")),(0,s.kt)("p",null,"Ex: ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/helmetjs/helmet"},"https://github.com/helmetjs/helmet")),(0,s.kt)("h3",{id:"sessions"},"Sessions"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Les sessions des utilisateurs authentifi\xe9s doivent expirer automatiquement et\npouvoir \xeatre ferm\xe9es par l'utilisateur (cette action doit effectivement\nsupprimer la session c\xf4te serveur)."),(0,s.kt)("li",{parentName:"ul"},"Les sessions doivent pouvoir \xeatre ferm\xe9es par des administrateurs"),(0,s.kt)("li",{parentName:"ul"},"Dur\xe9e : Le d\xe9lai doit \xeatre adapt\xe9 \xe0 la dur\xe9e d'utilisation l\xe9gitime pr\xe9vue\n(pour les utilisateurs authentifi\xe9s) et \xe0 la sensibilit\xe9 des donn\xe9es. Ex: 6h\npour une s\xe9curit\xe9 moyenne")),(0,s.kt)("h3",{id:"mots-de-passe"},"Mots de passe"),(0,s.kt)("h4",{id:"robustesse"},"Robustesse"),(0,s.kt)("p",null,"Les empreintes de mot de passe doivent \xeatre stock\xe9es de fa\xe7on s\xe9curis\xe9e, en s'en\nremettant \xe0 une impl\xe9mentation propos\xe9e par le framework ou langage utilis\xe9,\napr\xe8s avoir v\xe9rifi\xe9 qu'il impl\xe9mente correctement une fonction ad\xe9quate pour le\nstockage des empreintes, telle que PBKDF2, Bcrypt, Scrypt ou Argon2, avec des\ncontraintes temps/m\xe9moire adapt\xe9es."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"Forcer la complexit\xe9 du mot de passe")," \xe0 : minimum 12 chars, 1 majuscule, 1\nminuscule, 1 chiffre, 1 caract\xe8re sp\xe9cial"),(0,s.kt)("p",null,"Proposer \xe0 l'utilisateur de lui g\xe9n\xe9rer."),(0,s.kt)("h4",{id:"proc\xe9dure-de-changement-de-mot-de-passe"},"Proc\xe9dure de changement de mot de passe"),(0,s.kt)("p",null,"Avertir par email l'utilisateur en cas de changement de mot passe."),(0,s.kt)("h4",{id:"proc\xe9dure-de-reset-de-mot-passe"},"Proc\xe9dure de reset de mot passe"),(0,s.kt)("p",null,"Voir r\xe9f\xe9rences\n",(0,s.kt)("a",{parentName:"p",href:"https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html"},"OWASP"),"\net\n",(0,s.kt)("a",{parentName:"p",href:"https://www.troyhunt.com/everything-you-ever-wanted-to-know/"},"building a secure password reset feature")),(0,s.kt)("p",null,"Avertir par email l'utilisateur en cas de changement de mot passe."),(0,s.kt)("p",null,"Voir aussi cet article sur les\n",(0,s.kt)("a",{parentName:"p",href:"https://hiddedevries.nl/en/blog/2018-01-13-making-password-managers-play-ball-with-your-login-form"},"forms de logins et passwords managers")),(0,s.kt)("h3",{id:"ddos"},"DDOS"),(0,s.kt)("p",null,"Les mesures de pr\xe9vention anti-DDOS et Waf doivent \xeatre mis en place en amont de\nl'application (c\xf4t\xe9 infra/reverse-proxy)"),(0,s.kt)("p",null,"C\xf4t\xe9 applicatif, l'utilisation de fonctions synchrones trop gourmandes en CPU\n(exemples : ",(0,s.kt)("inlineCode",{parentName:"p"},"readFileSync"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"jwt.verify")," sans callback, ",(0,s.kt)("inlineCode",{parentName:"p"},"bcrypt.hashSync"),",\n",(0,s.kt)("inlineCode",{parentName:"p"},"bcrypt.genSaltSync"),") pr\xe9sente deux types de risques :"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("strong",{parentName:"p"},"c\xf4t\xe9 serveur")," : vuln\xe9rabilit\xe9 augment\xe9e au d\xe9ni de service (DOS),\nl'attaquant pouvant cibler les pages qui mettent en oeuvre ce type de\nfonctions c\xf4t\xe9 serveur pour diminuer le co\xfbt de l'attaque.")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("strong",{parentName:"p"},"c\xf4t\xe9 client"),' : le blocage du fil d\'ex\xe9cution principal se traduit en un\n"freeze" d\xe9sagr\xe9able de la page'))),(0,s.kt)("p",null,"Il est recommand\xe9 de faire appel \xe0 la version asynchrone de ces fonctions, ou de\nles wrapper dans un thread ou web worker si elles n'ont pas d'impl\xe9mentation\nasynchrone disponible."),(0,s.kt)("h3",{id:"logging"},"Logging"),(0,s.kt)("h4",{id:"exceptions"},"Exceptions"),(0,s.kt)("p",null,"Journaliser explicitement les erreurs issues de la logique de l'application, qui\nsont inconnues du runtime. par exemple \xe0 l'aide de ",(0,s.kt)("a",{parentName:"p",href:"https://sentry.fabrique.social.gouv.fr"},"sentry"),". La remont\xe9e\nd'exceptions dans sentry doit veiller \xe0 ne pas remonter de donn\xe9es sensibles ou personnelles\n(ex: cookies)."),(0,s.kt)("h4",{id:"logs-applicatifs"},"Logs applicatifs"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"L'application doit logger en JSON (cf ",(0,s.kt)("a",{parentName:"li",href:"/support/docs/standards/kubernetes"},"12 factors apps"),")"),(0,s.kt)("li",{parentName:"ul"},"L'application ne doit logger ",(0,s.kt)("strong",{parentName:"li"},"QUE")," les donn\xe9es n\xe9cessaires au bon fonctionnement du service"),(0,s.kt)("li",{parentName:"ul"},"Les utilisateurs de l'application doivent \xeatre inform\xe9s de cette journalisation"),(0,s.kt)("li",{parentName:"ul"},"Ces donn\xe9es techniques ne doivent ",(0,s.kt)("strong",{parentName:"li"},"PAS")," contenir de donn\xe9es permettant d'identifier un individu"),(0,s.kt)("li",{parentName:"ul"},"Les logs peuvent \xeatre conserv\xe9s jusqu'\xe0 12 mois si n\xe9cessaire")),(0,s.kt)("h5",{id:"position-de-la-cnil"},"Position de la CNIL"),(0,s.kt)("blockquote",null,(0,s.kt)("p",{parentName:"blockquote"},"\u201cDe ce point de vue, l\u2019enregistrement de ces donn\xe9es de journalisation ne rend pas le traitement plus intrusif, sous r\xe9serve que leur existence ne m\xe8ne pas \xe0 un d\xe9passement de la dur\xe9e de conservation des donn\xe9es. De plus, cette mesure peut apporter des garanties importantes pour la s\xe9curit\xe9 de ces donn\xe9es.\u201d")),(0,s.kt)("h5",{id:"actions-\xe0-logger"},"Actions \xe0 logger"),(0,s.kt)("p",null,"Certains actions peuvent \xeatre utiles \xe0 logger pour de l'audit de s\xe9curit\xe9"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"actions destructives (suppression de donn\xe9es/fichiers)"),(0,s.kt)("li",{parentName:"ul"},"auth: tentatives de login, logout, changement/reset de pwd"),(0,s.kt)("li",{parentName:"ul"},"auth: erreurs 401/403"),(0,s.kt)("li",{parentName:"ul"},"upload/download T\xe9l\xe9chargement de document"),(0,s.kt)("li",{parentName:"ul"},"exports de donn\xe9es")),(0,s.kt)("p",null,"C\xf4t\xe9 base de donn\xe9es, un audit log peut \xeatre n\xe9cessaire. Ex:\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/hasura/audit-trigger"},"https://github.com/hasura/audit-trigger")," ou ",(0,s.kt)("a",{parentName:"p",href:"https://www.pgaudit.org"},"pgaudit")),(0,s.kt)("h3",{id:"upload-de-fichiers"},"Upload de fichiers"),(0,s.kt)("h4",{id:"risques"},"Risques"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"perte d'int\xe9grit\xe9 comportement/contenu")," : remplacement de code applicatif\nau moyen d'un fichier upload\xe9 / h\xe9bergement de contenu illicite (ex\xe9cution non\nma\xeetris\xe9e ou m\xe9sinterpr\xe9tation du contenu)"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"perte de confidentialit\xe9")," : fuite de documents (d\xe9faut de contr\xf4le d'acc\xe8s)"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"perte de disponibilit\xe9")," : d\xe9ni de service de l'application (d\xe9faut de\nlimitation en ressources)")),(0,s.kt)("h4",{id:"mesures"},"Mesures"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"Upload")," :",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"Limiter la taille du fichier"),(0,s.kt)("li",{parentName:"ul"},"V\xe9rifier type mime envoy\xe9 par le client et le comparer \xe0 une liste blanche\npr\xe9-\xe9tablie, le stocker, puis refl\xe9ter la m\xeame valeur lors du download du\nfichier par un utilisateur"),(0,s.kt)("li",{parentName:"ul"},"Si un traitement doit \xeatre r\xe9alis\xe9, le d\xe9porter sur un webservice d\xe9di\xe9"))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"Stockage")," :",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"Stocker les fichiers dans un emplacement impos\xe9, hors du document root, dans\nune partition d\xe9di\xe9e, ou en base de donn\xe9es"),(0,s.kt)("li",{parentName:"ul"},"Ne pas utiliser le nom fourni dans les en-t\xeates HTTP pour le stockage direct\ndu fichier (exemple : utiliser un ",(0,s.kt)("inlineCode",{parentName:"li"},"sha-256")," sal\xe9 sur le nom ou encore un\njeton d'acc\xe8s al\xe9atoire avec lequel la correspondance sera faite en base -\nne pas conserver l'extension)"))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"Download")," :",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"Utilisation un contr\xf4leur qui induit un niveau d'abstraction entre la fa\xe7on\nde r\xe9cup\xe9rer le fichier et la situation r\xe9elle c\xf4t\xe9 serveur. (exemple : GET\n",(0,s.kt)("inlineCode",{parentName:"li"},"/download?[random_token]")," VS GET ",(0,s.kt)("inlineCode",{parentName:"li"},"/static/mnt/volume/fichier.pdf"),")"),(0,s.kt)("li",{parentName:"ul"},"Utiliser l'en-t\xeate ",(0,s.kt)("inlineCode",{parentName:"li"},"Content-Disposition: attachement")," afin de forcer le\nt\xe9l\xe9chargement"),(0,s.kt)("li",{parentName:"ul"},"Utiliser l'en-t\xeate ",(0,s.kt)("inlineCode",{parentName:"li"},"Content-Type")," avec la valeur \xe9mise lors de l'upload"),(0,s.kt)("li",{parentName:"ul"},"Utiliser l'en-t\xeate ",(0,s.kt)("inlineCode",{parentName:"li"},"X-Content-Type-Options: nosniff")," afin d'emp\xeacher le\nnavigateur d'inf\xe9rer le type du fichier et de lui demander de respecter le\nContent-Type que l'on aura positionn\xe9.")))),(0,s.kt)("h2",{id:"faq"},"FAQ"),(0,s.kt)("h3",{id:"mettre-\xe0-jour-les-headers-http-de-mes-applications"},"Mettre \xe0 jour les headers HTTP de mes applications"),(0,s.kt)("p",null,"Inspectez les headers HTTP de votre frontend avec\n",(0,s.kt)("a",{parentName:"p",href:"https://observatory.mozilla.org/"},"Mozilla HTTP Observatory"),". Vous pouvez\n\xe9galement les retrouver sur\n",(0,s.kt)("a",{parentName:"p",href:"https://dashlord-full.fabrique.social.gouv.fr/"},"DashLord"),"."),(0,s.kt)("p",null,"Plusieurs possibilit\xe9s pour corriger vos headers :"),(0,s.kt)("h4",{id:"directement-via-lingress"},"Directement via l'Ingress"),(0,s.kt)("p",null,"Il est possible d'ajouter des annotations pour forcer les headers directement\nsur la route de votre application."),(0,s.kt)("p",null,"Exemple avec kontinuous ou kube-workflow, dans le ",(0,s.kt)("inlineCode",{parentName:"p"},"values.yaml")," de votre\napplication :"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},"app:\n ingress:\n annotations:\n nginx.ingress.kubernetes.io/configuration-snippet: |\n more_set_headers \"Content-Security-Policy: default-src 'none'; connect-src 'self' https://*.gouv.fr; font-src 'self'; img-src 'self'; prefetch-src 'self' https://*.gouv.fr; script-src 'self' https://*.gouv.fr; frame-src 'self' https://*.gouv.fr; style-src 'self' 'unsafe-inline'\";\n more_set_headers \"X-Frame-Options: deny\";\n more_set_headers \"X-XSS-Protection: 1; mode=block\";\n more_set_headers \"X-Content-Type-Options: nosniff\";\n")),(0,s.kt)("p",null,"La CSP est \xe0 adapter selon vos scripts externes; vous pouvez la d\xe9finir\nmanuellement ou avec l'extension\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/april/laboratory"},"CSP laboratory"),"."),(0,s.kt)("p",null,"Le repo ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SocialGouv/template"},"template")," pr\xe9sente\nl'int\xe9gration dans un Next.js statique (branche ",(0,s.kt)("inlineCode",{parentName:"p"},"main"),") ou avec un serveur\n(branche ",(0,s.kt)("inlineCode",{parentName:"p"},"hasura"),")."),(0,s.kt)("h4",{id:"c\xf4t\xe9-applicatif"},"C\xf4t\xe9 applicatif"),(0,s.kt)("p",null,"Il est possible d'ajouter les headers c\xf4t\xe9 applicatif, par exemple avec\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/helmetjs/helmet"},"helmet"),"."),(0,s.kt)("h3",{id:"chiffrer-des-fichiers"},"Chiffrer des fichiers"),(0,s.kt)("p",null,"Si vous souhaitez chiffrer des fichiers c\xf4t\xe9 serveur, vous pouvez utiliser le\nmodule\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SocialGouv/streaming-file-encryption"},"streaming-file-encryption"),"."),(0,s.kt)("p",null,"La s\xe9curit\xe9 de ce module repose sur la connaissance n\xe9cessaire de 3 informations\ndisctinctes pour pouvoir d\xe9chiffrer un fichier :"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Le ",(0,s.kt)("inlineCode",{parentName:"li"},"mainSecret")," \xe0 d\xe9finir en tant que variable d'environnement c\xf4t\xe9 applicatif"),(0,s.kt)("li",{parentName:"ul"},"Le ",(0,s.kt)("inlineCode",{parentName:"li"},"context")," \xe0 stocker dans votre base de donn\xe9es et li\xe9 \xe0 votre fichier"),(0,s.kt)("li",{parentName:"ul"},"Le ",(0,s.kt)("inlineCode",{parentName:"li"},"ciphertext")," \xe0 stocker sur un volume disque persistant")),(0,s.kt)("p",null,"\u26a0\ufe0f il est essentiel de stocker ces donn\xe9es dans des espaces isol\xe9s."),(0,s.kt)("p",null,"Les fichiers chiffr\xe9s r\xe9pondent\xa0aux propri\xe9t\xe9s cryptographiques suivantes :"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 la falsification (modification des donn\xe9es)"),(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 la troncature (suppression des donn\xe9es \xe0 chaque extr\xe9mit\xe9 ou au\nmilieu)"),(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 l'extension (ajout de donn\xe9es \xe0 chaque extr\xe9mit\xe9 ou au milieu)"),(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 la r\xe9organisation (\xe9change de pages de donn\xe9es)")),(0,s.kt)("h2",{id:"r\xe9f\xe9rences"},"R\xe9f\xe9rences"),(0,s.kt)("h3",{id:"g\xe9n\xe9ral"},"G\xe9n\xe9ral"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.ssi.gouv.fr/uploads/2018/11/guide-securite-numerique-agile-anssi-pa-v1.pdf"},"guide ANSSI de la s\xe9curit\xe9 agile")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://cheatsheetseries.owasp.org/"},"https://cheatsheetseries.owasp.org/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.ssi.gouv.fr/guide/mot-de-passe/"},"https://www.ssi.gouv.fr/guide/mot-de-passe/")),(0,s.kt)("li",{parentName:"ul"},"Reset password best practices :\n",(0,s.kt)("a",{parentName:"li",href:"https://www.troyhunt.com/everything-you-ever-wanted-to-know/"},"https://www.troyhunt.com/everything-you-ever-wanted-to-know/"))),(0,s.kt)("h3",{id:"nodejs"},"NodeJS"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.sqreen.com/checklists/nodejs-security-handbook"},"https://www.sqreen.com/checklists/nodejs-security-handbook")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/goldbergyoni/nodebestpractices#6-security-best-practices"},"https://github.com/goldbergyoni/nodebestpractices#6-security-best-practices")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md"},"https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md"))),(0,s.kt)("h3",{id:"docker"},"Docker"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.ssi.gouv.fr/administration/publication/recommandations-de-securite-relatives-au-deploiement-de-conteneurs-docker/"},"https://www.ssi.gouv.fr/administration/publication/recommandations-de-securite-relatives-au-deploiement-de-conteneurs-docker/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"},"https://docs.docker.com/develop/develop-images/dockerfile_best-practices/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://snyk.io/blog/10-docker-image-security-best-practices/"},"https://snyk.io/blog/10-docker-image-security-best-practices/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/OWASP/Docker-Security"},"https://github.com/OWASP/Docker-Security")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Docker_Security_Cheat_Sheet.md"},"https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Docker_Security_Cheat_Sheet.md"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a5a67c7b.db2fe5ac.js b/assets/js/a5a67c7b.db2fe5ac.js deleted file mode 100644 index c399a31e..00000000 --- a/assets/js/a5a67c7b.db2fe5ac.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksupport=self.webpackChunksupport||[]).push([[771],{3905:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>h});var a=n(7294);function s(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 i(e){for(var t=1;t=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}var o=a.createContext({}),u=function(e){var t=a.useContext(o),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return a.createElement(o.Provider,{value:t},e.children)},d="mdxType",c={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,s=e.mdxType,r=e.originalType,o=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),d=u(n),m=s,h=d["".concat(o,".").concat(m)]||d[m]||c[m]||r;return n?a.createElement(h,i(i({ref:t},p),{},{components:n})):a.createElement(h,i({ref:t},p))}));function h(e,t){var n=arguments,s=t&&t.mdxType;if("string"==typeof e||s){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var o in t)hasOwnProperty.call(t,o)&&(l[o]=t[o]);l.originalType=e,l[d]="string"==typeof e?e:s,i[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>o,contentTitle:()=>i,default:()=>c,frontMatter:()=>r,metadata:()=>l,toc:()=>u});var a=n(7462),s=(n(7294),n(3905));const r={},i="S\xe9curit\xe9",l={unversionedId:"standards/securite",id:"standards/securite",title:"S\xe9curit\xe9",description:"\ud83d\udd12 Tous les acc\xe8s aux outils doivent \xeatre s\xe9curis\xe9s par authentification\xe0 deux",source:"@site/docs/standards/securite.md",sourceDirName:"standards",slug:"/standards/securite",permalink:"/support/docs/standards/securite",draft:!1,editUrl:"https://github.com/socialgouv/support/tree/master/docs/standards/securite.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Bases de donn\xe9es",permalink:"/support/docs/standards/databases"},next:{title:"Kubernetes (K8S)",permalink:"/support/docs/standards/kubernetes"}},o={},u=[{value:"Outils",id:"outils",level:2},{value:"DashLord : dashboard de s\xe9curit\xe9 et accessibilt\xe9",id:"dashlord--dashboard-de-s\xe9curit\xe9-et-accessibilt\xe9",level:3},{value:"SonarCloud : analyseur statique de code",id:"sonarcloud--analyseur-statique-de-code",level:3},{value:"Talisman : pr\xe9vention de publication de secrets",id:"talisman--pr\xe9vention-de-publication-de-secrets",level:3},{value:"ClamAV : scan antivirus de fichiers",id:"clamav--scan-antivirus-de-fichiers",level:3},{value:"Best practices",id:"best-practices",level:2},{value:"CODEOWNERS",id:"codeowners",level:3},{value:"Third-parties",id:"third-parties",level:3},{value:"Maintenance des d\xe9pendances",id:"maintenance-des-d\xe9pendances",level:3},{value:"Contr\xf4les d'acc\xe8s",id:"contr\xf4les-dacc\xe8s",level:3},{value:"Leak d'informations",id:"leak-dinformations",level:3},{value:"S\xe9curit\xe9 navigateurs",id:"s\xe9curit\xe9-navigateurs",level:3},{value:"Sessions",id:"sessions",level:3},{value:"Mots de passe",id:"mots-de-passe",level:3},{value:"Robustesse",id:"robustesse",level:4},{value:"Proc\xe9dure de changement de mot de passe",id:"proc\xe9dure-de-changement-de-mot-de-passe",level:4},{value:"Proc\xe9dure de reset de mot passe",id:"proc\xe9dure-de-reset-de-mot-passe",level:4},{value:"DDOS",id:"ddos",level:3},{value:"Logging",id:"logging",level:3},{value:"Upload de fichiers",id:"upload-de-fichiers",level:3},{value:"Risques",id:"risques",level:4},{value:"Mesures",id:"mesures",level:4},{value:"FAQ",id:"faq",level:2},{value:"Mettre \xe0 jour les headers HTTP de mes applications",id:"mettre-\xe0-jour-les-headers-http-de-mes-applications",level:3},{value:"Directement via l'Ingress",id:"directement-via-lingress",level:4},{value:"C\xf4t\xe9 applicatif",id:"c\xf4t\xe9-applicatif",level:4},{value:"Chiffrer des fichiers",id:"chiffrer-des-fichiers",level:3},{value:"R\xe9f\xe9rences",id:"r\xe9f\xe9rences",level:2},{value:"G\xe9n\xe9ral",id:"g\xe9n\xe9ral",level:3},{value:"NodeJS",id:"nodejs",level:3},{value:"Docker",id:"docker",level:3}],p={toc:u},d="wrapper";function c(e){let{components:t,...n}=e;return(0,s.kt)(d,(0,a.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,s.kt)("h1",{id:"s\xe9curit\xe9"},"S\xe9curit\xe9"),(0,s.kt)("p",null,"\ud83d\udd12 Tous les acc\xe8s aux outils doivent \xeatre s\xe9curis\xe9s par authentification\xe0 deux\nfacteurs (2FA)."),(0,s.kt)("p",null,"\ud83c\udf10 Les variables d'environnement doivent \xeatre utilis\xe9es pour tout ce qui est\nsecrets, tokens, logins, urls, hostnames, etc."),(0,s.kt)("p",null,"\ud83d\udee1\ufe0f La gestion des secrets est assur\xe9e par des\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/bitnami-labs/sealed-secrets"},"sealed-secrets")," qui versionnent\nles secrets chiffr\xe9s dans GIT."),(0,s.kt)("h2",{id:"outils"},"Outils"),(0,s.kt)("h3",{id:"dashlord--dashboard-de-s\xe9curit\xe9-et-accessibilt\xe9"},"DashLord : dashboard de s\xe9curit\xe9 et accessibilt\xe9"),(0,s.kt)("p",null,"Accessible ici (se connecter pour voir plus d'informations) :\n",(0,s.kt)("a",{parentName:"p",href:"https://dashlord.fabrique.social.gouv.fr"},"https://dashlord.fabrique.social.gouv.fr"),"."),(0,s.kt)("p",null,"Voir aussi :\n",(0,s.kt)("a",{parentName:"p",href:"https://doc.incubateur.net/communaute/travailler-a-beta-gouv/jutilise-les-outils-de-la-communaute/dashlord"},"https://doc.incubateur.net/communaute/travailler-a-beta-gouv/jutilise-les-outils-de-la-communaute/dashlord"),"."),(0,s.kt)("h3",{id:"sonarcloud--analyseur-statique-de-code"},"SonarCloud : analyseur statique de code"),(0,s.kt)("p",null,"Les produits de l'organisation sont tous scann\xe9s et les r\xe9sultats sont\naccessibles ici : ",(0,s.kt)("a",{parentName:"p",href:"https://sonarcloud.io/organizations/socialgouv"},"https://sonarcloud.io/organizations/socialgouv"),"."),(0,s.kt)("h3",{id:"talisman--pr\xe9vention-de-publication-de-secrets"},"Talisman : pr\xe9vention de publication de secrets"),(0,s.kt)("p",null,"Publier involontairement un secret (par exemple un jeton d'acc\xe8s) sur un d\xe9p\xf4t\npublic peut avoir beaucoup de cons\xe9quences ind\xe9sirables. Une mani\xe8re efficace\nd'\xe9viter cela est d'ex\xe9cuter\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/thoughtworks/talisman/"},"un d\xe9tecteur de secrets comme ",(0,s.kt)("inlineCode",{parentName:"a"},"talisman")),"\nsur le hook ",(0,s.kt)("inlineCode",{parentName:"p"},"pre-commit")," de git."),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-bash"},'yarn add -D husky is-ci node-talisman\n\n# installer husky seulement si hors environnement de CI\nnpm set-script postinstall "is-ci || husky install"\n\n# installation de husky gr\xe2ce au script de postinstall\nyarn\n\n# ex\xe9cuter node-talisman sur le hook de pre-commit\n# on d\xe9tecte ici si l\'interaction via un terminal est possible afin de ne pas\n# crash quand le pre-commit est lanc\xe9 par une application comme VSCode\nyarn husky add .husky/pre-commit "if sh -c \': >/dev/tty\' >/dev/null 2>/dev/null; then exec .talismanrc\n')),(0,s.kt)("p",null,"On utilise ",(0,s.kt)("inlineCode",{parentName:"p"},"husky")," pour g\xe9rer simplement le hook. Si vous utilisez d\xe9j\xe0 un\ngestionnaire de hooks, vous pouvez y ajouter ",(0,s.kt)("inlineCode",{parentName:"p"},"node-talisman")," de mani\xe8re\nsimilaire."),(0,s.kt)("p",null,"On pourra observer des cas de faux positif de talisman, par exemple sur des\nmigrations SQL ou des donn\xe9es en base64. Dans ce cas, on lit attentivement le\nrapport, et on ajuste\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/thoughtworks/talisman/#ignoring-files"},"le fichier ",(0,s.kt)("inlineCode",{parentName:"a"},".talismanrc")),"\nen fonction."),(0,s.kt)("h3",{id:"clamav--scan-antivirus-de-fichiers"},"ClamAV : scan antivirus de fichiers"),(0,s.kt)("p",null,"Lorsqu'un produit propose \xe0 ses utilisateurs de ",(0,s.kt)("strong",{parentName:"p"},"t\xe9l\xe9verser des fichiers"),", il\nest recommand\xe9 de ",(0,s.kt)("strong",{parentName:"p"},"scanner")," les fichiers pour y d\xe9tecter de ",(0,s.kt)("strong",{parentName:"p"},"potentiels\nvirus"),". Dans ce but, la Fabrique met \xe0 disposition un service ",(0,s.kt)("strong",{parentName:"p"},"ClamAV"),"."),(0,s.kt)("p",null,"Impl\xe9menter dans l'application la communication avec le service antivirus. On\npassera par une interface REST afin d'envoyer un ou plusieurs fichiers et la\nr\xe9ponse mentionnera pour chacun d'eux si le fichier semble sain."),(0,s.kt)("p",null,"Le service REST utilis\xe9 est celui-ci :\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/benzino77/clamav-rest-api"},"https://github.com/benzino77/clamav-rest-api"),"."),(0,s.kt)("p",null,"Il est n\xe9cessaire d'envoyer les fichiers \xe0\n",(0,s.kt)("inlineCode",{parentName:"p"},"http://clamav-rest.clamav.svc/api/v1/scan")," encod\xe9s avec ",(0,s.kt)("inlineCode",{parentName:"p"},"multipart/form-data"),"\net sous la cl\xe9 ",(0,s.kt)("inlineCode",{parentName:"p"},"FILES"),"."),(0,s.kt)("admonition",{type:"info"},(0,s.kt)("p",{parentName:"admonition"},"Le service ClamAV n'est accessible que depuis l'int\xe9rieur de notre\ninfrastructure. Un scan ne peut donc \xeatre demand\xe9 que depuis le backend des\napplications, les clients n'y ont pas acc\xe8s.")),(0,s.kt)("p",null,"Exemple NodeJS :"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-js"},'const FormData = require("form-data");\nconst fs = require("fs");\n\nconst formData = new FormData();\nformData.append("FILES", fs.createReadStream("file1.txt"), "file1.txt");\nformData.append("FILES", fs.createReadStream("file2.txt"), "file2.txt");\n\nconst res = await fetch("http://clamav-rest.clamav.svc/api/v1/scan", {\n method: "POST",\n body: formData,\n headers: formData.getHeaders(),\n});\nconsole.log(await res.json());\n')),(0,s.kt)("admonition",{type:"caution"},(0,s.kt)("p",{parentName:"admonition"},"Ce service de la Fabrique est exp\xe9rimental. Aucune application ne doit bloquer\nsur le scan antivirus car le service pourrait \xeatre indisponible.")),(0,s.kt)("h2",{id:"best-practices"},"Best practices"),(0,s.kt)("p",null,"Les ",(0,s.kt)("a",{parentName:"p",href:"https://cheatsheetseries.owasp.org/"},"cheat sheets OWASP")," sont une tr\xe8s\nbonne r\xe9f\xe9rence."),(0,s.kt)("h3",{id:"codeowners"},"CODEOWNERS"),(0,s.kt)("p",null,"Les workflows d'int\xe9gration et d\xe9ploiements continus des repositories SocialGouv\nsont prot\xe9g\xe9s par la convention\n",(0,s.kt)("a",{parentName:"p",href:"https://github.blog/2017-07-06-introducing-code-owners/"},"CODEOWNERS")," : tout\nchangement impactant potentiellement l'infrastructure doit \xeatre revue par une\npersonne de l'\xe9quipe OPS ou SRE. Ils seront automatiquement assign\xe9s aux issues\nqui touchent aux fichiers de CI lors d'une pull-request."),(0,s.kt)("h3",{id:"third-parties"},"Third-parties"),(0,s.kt)("p",null,"De mani\xe8re g\xe9n\xe9rale il est d\xe9conseill\xe9 de r\xe9f\xe9rencer des scripts externes dans\nses applications, comme des scripts ou CSS via CDN, google fonts ou autres\nservices tiers; Privil\xe9gier l'utilisation de librairies d\xe9di\xe9es que vous pouvez\nembarquer dans l'application elle-m\xeame."),(0,s.kt)("h3",{id:"maintenance-des-d\xe9pendances"},"Maintenance des d\xe9pendances"),(0,s.kt)("p",null,"Les packages utilis\xe9s dans les applications doivent \xeatre maintenus \xe0 jour et\nscann\xe9s r\xe9guli\xe8rement, id\xe9alement dans la CI."),(0,s.kt)("p",null,"Les packages non utilis\xe9s ou obsol\xe8tes doivent \xeatre supprim\xe9s."),(0,s.kt)("p",null,"Utilisez ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SocialGouv/renovate-config"},"renovate")," pour\nmaintenir votre application \xe0 jour et pr\xe9voyez le temps n\xe9cessaire dans les\nsprints."),(0,s.kt)("h3",{id:"contr\xf4les-dacc\xe8s"},"Contr\xf4les d'acc\xe8s"),(0,s.kt)("p",null,"La mise en place d'un middleware de RBAC par lequel toutes les requ\xeates\nentrantes passent permet de rejeter au plus t\xf4t les requ\xeates ill\xe9gitimes et de\nmettre en place une liste blanche de pages ou endpoints non prot\xe9g\xe9s (le\ncomportement par d\xe9faut \xe9tant \"prot\xe9g\xe9\" pour \xe9viter l'introduction de d\xe9fauts de\ncontr\xf4le d'acc\xe8s au fur et \xe0 mesure des d\xe9veloppements)."),(0,s.kt)("p",null,"Ex : ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/nyambati/express-acl"},"https://github.com/nyambati/express-acl")),(0,s.kt)("p",null,"Mettre en place une ",(0,s.kt)("strong",{parentName:"p"},"matrice des r\xf4les")," qui associe \xe0 chaque type de donn\xe9e\ndes permissions de type lecture/\xe9criture par r\xf4le."),(0,s.kt)("h3",{id:"leak-dinformations"},"Leak d'informations"),(0,s.kt)("p",null,"Les informations techniques ne doivent pas \xeatre expos\xe9es au runtime. Les\nserveurs et applications ne doivent pas fournir de header ou signature\npermettant de les identifier. (ex: header ",(0,s.kt)("inlineCode",{parentName:"p"},"Served-by"),")"),(0,s.kt)("p",null,"Les donn\xe9es de d\xe9veloppement (GIT et bases de donn\xe9es) doivent \xeatre consid\xe9r\xe9es\ncomme publiques et ne pas utiliser de donn\xe9es sensibles ou personnelles."),(0,s.kt)("p",null,"Les d\xe9veloppeur(se)s ne doivent en aucun cas recevoir de donn\xe9es de production\nsur leur poste de travail. Les \xe9quipes de dev doivent mettre en oeuvre des\nm\xe9canismes de ",(0,s.kt)("inlineCode",{parentName:"p"},"seeds")," pour travailler avec des volumes de donn\xe9es r\xe9alistes."),(0,s.kt)("p",null,"Les applications ne doivent jamais logger d'information confidentielle ou de\ncredentials sur la console. En effet ces informations pourraient remonter sur\nles outils de logging tels Sentry ou grafana."),(0,s.kt)("h3",{id:"s\xe9curit\xe9-navigateurs"},"S\xe9curit\xe9 navigateurs"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"D\xe9finir une ",(0,s.kt)("strong",{parentName:"li"},"content security policy (CSP) stricte"),", comme par exemple :\nen-t\xeate HTTP Content-Security-Policy: default-src 'self'; frame-ancestors\n'self'; Utiliser un outil comme\n",(0,s.kt)("a",{parentName:"li",href:"https://github.com/april/laboratory"},"Laboratory")," pour profiler votre\napplication et v\xe9rifier les headers CSP."),(0,s.kt)("li",{parentName:"ul"},"D\xe9finir l'attribut \"integrity\" sur l'ensemble des ressources link et script de\nla page (",(0,s.kt)("strong",{parentName:"li"},"SubResource Integrity"),")."),(0,s.kt)("li",{parentName:"ul"},"Gestion des ",(0,s.kt)("strong",{parentName:"li"},"cookies")," : utiliser les attributs de cookie ",(0,s.kt)("strong",{parentName:"li"},"HttpOnly, Secure\net SameSite"),'. Ne pas mettre SameSite \xe0 "None".'),(0,s.kt)("li",{parentName:"ul"},"Auto-h\xe9berger l'ensemble des ressources de la page. Pour celles qui ne peuvent\npas l'\xeatre et pour les traitements de moindre confiance, utiliser un WebWorker\nou une iFrame avec l'attribut \"sandbox\"."),(0,s.kt)("li",{parentName:"ul"},"Les verbes HTTP doivent \xeatre respect\xe9s, les op\xe9rations ",(0,s.kt)("inlineCode",{parentName:"li"},"GET")," ne doivent pas\nmodifier de donn\xe9es."),(0,s.kt)("li",{parentName:"ul"},"En cas d'utilisation de sessions, les op\xe9rations qui impactent des donn\xe9es\ndoivent \xeatre prot\xe9g\xe9es des\n",(0,s.kt)("a",{parentName:"li",href:"https://www.cert.ssi.gouv.fr/information/CERTA-2008-INF-003/"},"attaques de type CSRF"),"\navec un syst\xe8me de jeton.")),(0,s.kt)("p",null,"Ex: ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/helmetjs/helmet"},"https://github.com/helmetjs/helmet")),(0,s.kt)("h3",{id:"sessions"},"Sessions"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Les sessions des utilisateurs authentifi\xe9s doivent expirer automatiquement et\npouvoir \xeatre ferm\xe9es par l'utilisateur (cette action doit effectivement\nsupprimer la session c\xf4te serveur)."),(0,s.kt)("li",{parentName:"ul"},"Les sessions doivent pouvoir \xeatre ferm\xe9es par des administrateurs"),(0,s.kt)("li",{parentName:"ul"},"Dur\xe9e : Le d\xe9lai doit \xeatre adapt\xe9 \xe0 la dur\xe9e d'utilisation l\xe9gitime pr\xe9vue\n(pour les utilisateurs authentifi\xe9s) et \xe0 la sensibilit\xe9 des donn\xe9es. Ex: 6h\npour une s\xe9curit\xe9 moyenne")),(0,s.kt)("h3",{id:"mots-de-passe"},"Mots de passe"),(0,s.kt)("h4",{id:"robustesse"},"Robustesse"),(0,s.kt)("p",null,"Les empreintes de mot de passe doivent \xeatre stock\xe9es de fa\xe7on s\xe9curis\xe9e, en s'en\nremettant \xe0 une impl\xe9mentation propos\xe9e par le framework ou langage utilis\xe9,\napr\xe8s avoir v\xe9rifi\xe9 qu'il impl\xe9mente correctement une fonction ad\xe9quate pour le\nstockage des empreintes, telle que PBKDF2, Bcrypt, Scrypt ou Argon2, avec des\ncontraintes temps/m\xe9moire adapt\xe9es."),(0,s.kt)("p",null,(0,s.kt)("strong",{parentName:"p"},"Forcer la complexit\xe9 du mot de passe")," \xe0 : minimum 12 chars, 1 majuscule, 1\nminuscule, 1 chiffre, 1 caract\xe8re sp\xe9cial"),(0,s.kt)("p",null,"Proposer \xe0 l'utilisateur de lui g\xe9n\xe9rer."),(0,s.kt)("h4",{id:"proc\xe9dure-de-changement-de-mot-de-passe"},"Proc\xe9dure de changement de mot de passe"),(0,s.kt)("p",null,"Avertir par email l'utilisateur en cas de changement de mot passe."),(0,s.kt)("h4",{id:"proc\xe9dure-de-reset-de-mot-passe"},"Proc\xe9dure de reset de mot passe"),(0,s.kt)("p",null,"Voir r\xe9f\xe9rences\n",(0,s.kt)("a",{parentName:"p",href:"https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html"},"OWASP"),"\net\n",(0,s.kt)("a",{parentName:"p",href:"https://www.troyhunt.com/everything-you-ever-wanted-to-know/"},"building a secure password reset feature")),(0,s.kt)("p",null,"Avertir par email l'utilisateur en cas de changement de mot passe."),(0,s.kt)("p",null,"Voir aussi cet article sur les\n",(0,s.kt)("a",{parentName:"p",href:"https://hiddedevries.nl/en/blog/2018-01-13-making-password-managers-play-ball-with-your-login-form"},"forms de logins et passwords managers")),(0,s.kt)("h3",{id:"ddos"},"DDOS"),(0,s.kt)("p",null,"Les mesures de pr\xe9vention anti-DDOS et Waf doivent \xeatre mis en place en amont de\nl'application (c\xf4t\xe9 infra/reverse-proxy)"),(0,s.kt)("p",null,"C\xf4t\xe9 applicatif, l'utilisation de fonctions synchrones trop gourmandes en CPU\n(exemples : ",(0,s.kt)("inlineCode",{parentName:"p"},"readFileSync"),", ",(0,s.kt)("inlineCode",{parentName:"p"},"jwt.verify")," sans callback, ",(0,s.kt)("inlineCode",{parentName:"p"},"bcrypt.hashSync"),",\n",(0,s.kt)("inlineCode",{parentName:"p"},"bcrypt.genSaltSync"),") pr\xe9sente deux types de risques :"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("strong",{parentName:"p"},"c\xf4t\xe9 serveur")," : vuln\xe9rabilit\xe9 augment\xe9e au d\xe9ni de service (DOS),\nl'attaquant pouvant cibler les pages qui mettent en oeuvre ce type de\nfonctions c\xf4t\xe9 serveur pour diminuer le co\xfbt de l'attaque.")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("p",{parentName:"li"},(0,s.kt)("strong",{parentName:"p"},"c\xf4t\xe9 client"),' : le blocage du fil d\'ex\xe9cution principal se traduit en un\n"freeze" d\xe9sagr\xe9able de la page'))),(0,s.kt)("p",null,"Il est recommand\xe9 de faire appel \xe0 la version asynchrone de ces fonctions, ou de\nles wrapper dans un thread ou web worker si elles n'ont pas d'impl\xe9mentation\nasynchrone disponible."),(0,s.kt)("h3",{id:"logging"},"Logging"),(0,s.kt)("p",null,"Journaliser explicitement les erreurs issues de la logique de l'application, qui\nsont inconnues du runtime. par exemple \xe0 l'aide de sentry. La remont\xe9e\nd'exceptions dans sentry doit veiller \xe0 ne pas remonter de donn\xe9es sensibles\n(ex: cookies)."),(0,s.kt)("p",null,"L'application doit logger en JSON (cf\n",(0,s.kt)("a",{parentName:"p",href:"/support/docs/standards/kubernetes"},"12 factors apps"),")"),(0,s.kt)("p",null,"C\xf4t\xe9 base de donn\xe9es, un audit log peut \xeatre n\xe9cessaire. Ex:\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/hasura/audit-trigger"},"https://github.com/hasura/audit-trigger")),(0,s.kt)("h3",{id:"upload-de-fichiers"},"Upload de fichiers"),(0,s.kt)("h4",{id:"risques"},"Risques"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"perte d'int\xe9grit\xe9 comportement/contenu")," : remplacement de code applicatif\nau moyen d'un fichier upload\xe9 / h\xe9bergement de contenu illicite (ex\xe9cution non\nma\xeetris\xe9e ou m\xe9sinterpr\xe9tation du contenu)"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"perte de confidentialit\xe9")," : fuite de documents (d\xe9faut de contr\xf4le d'acc\xe8s)"),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"perte de disponibilit\xe9")," : d\xe9ni de service de l'application (d\xe9faut de\nlimitation en ressources)")),(0,s.kt)("h4",{id:"mesures"},"Mesures"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"Upload")," :",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"Limiter la taille du fichier"),(0,s.kt)("li",{parentName:"ul"},"V\xe9rifier type mime envoy\xe9 par le client et le comparer \xe0 une liste blanche\npr\xe9-\xe9tablie, le stocker, puis refl\xe9ter la m\xeame valeur lors du download du\nfichier par un utilisateur"),(0,s.kt)("li",{parentName:"ul"},"Si un traitement doit \xeatre r\xe9alis\xe9, le d\xe9porter sur un webservice d\xe9di\xe9"))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"Stockage")," :",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"Stocker les fichiers dans un emplacement impos\xe9, hors du document root, dans\nune partition d\xe9di\xe9e, ou en base de donn\xe9es"),(0,s.kt)("li",{parentName:"ul"},"Ne pas utiliser le nom fourni dans les en-t\xeates HTTP pour le stockage direct\ndu fichier (exemple : utiliser un ",(0,s.kt)("inlineCode",{parentName:"li"},"sha-256")," sal\xe9 sur le nom ou encore un\njeton d'acc\xe8s al\xe9atoire avec lequel la correspondance sera faite en base -\nne pas conserver l'extension)"))),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("strong",{parentName:"li"},"Download")," :",(0,s.kt)("ul",{parentName:"li"},(0,s.kt)("li",{parentName:"ul"},"Utilisation un contr\xf4leur qui induit un niveau d'abstraction entre la fa\xe7on\nde r\xe9cup\xe9rer le fichier et la situation r\xe9elle c\xf4t\xe9 serveur. (exemple : GET\n",(0,s.kt)("inlineCode",{parentName:"li"},"/download?[random_token]")," VS GET ",(0,s.kt)("inlineCode",{parentName:"li"},"/static/mnt/volume/fichier.pdf"),")"),(0,s.kt)("li",{parentName:"ul"},"Utiliser l'en-t\xeate ",(0,s.kt)("inlineCode",{parentName:"li"},"Content-Disposition: attachement")," afin de forcer le\nt\xe9l\xe9chargement"),(0,s.kt)("li",{parentName:"ul"},"Utiliser l'en-t\xeate ",(0,s.kt)("inlineCode",{parentName:"li"},"Content-Type")," avec la valeur \xe9mise lors de l'upload"),(0,s.kt)("li",{parentName:"ul"},"Utiliser l'en-t\xeate ",(0,s.kt)("inlineCode",{parentName:"li"},"X-Content-Type-Options: nosniff")," afin d'emp\xeacher le\nnavigateur d'inf\xe9rer le type du fichier et de lui demander de respecter le\nContent-Type que l'on aura positionn\xe9.")))),(0,s.kt)("h2",{id:"faq"},"FAQ"),(0,s.kt)("h3",{id:"mettre-\xe0-jour-les-headers-http-de-mes-applications"},"Mettre \xe0 jour les headers HTTP de mes applications"),(0,s.kt)("p",null,"Inspectez les headers HTTP de votre frontend avec\n",(0,s.kt)("a",{parentName:"p",href:"https://observatory.mozilla.org/"},"Mozilla HTTP Observatory"),". Vous pouvez\n\xe9galement les retrouver sur\n",(0,s.kt)("a",{parentName:"p",href:"https://dashlord-full.fabrique.social.gouv.fr/"},"DashLord"),"."),(0,s.kt)("p",null,"Plusieurs possibilit\xe9s pour corriger vos headers :"),(0,s.kt)("h4",{id:"directement-via-lingress"},"Directement via l'Ingress"),(0,s.kt)("p",null,"Il est possible d'ajouter des annotations pour forcer les headers directement\nsur la route de votre application."),(0,s.kt)("p",null,"Exemple avec kontinuous ou kube-workflow, dans le ",(0,s.kt)("inlineCode",{parentName:"p"},"values.yaml")," de votre\napplication :"),(0,s.kt)("pre",null,(0,s.kt)("code",{parentName:"pre",className:"language-yaml"},"app:\n ingress:\n annotations:\n nginx.ingress.kubernetes.io/configuration-snippet: |\n more_set_headers \"Content-Security-Policy: default-src 'none'; connect-src 'self' https://*.gouv.fr; font-src 'self'; img-src 'self'; prefetch-src 'self' https://*.gouv.fr; script-src 'self' https://*.gouv.fr; frame-src 'self' https://*.gouv.fr; style-src 'self' 'unsafe-inline'\";\n more_set_headers \"X-Frame-Options: deny\";\n more_set_headers \"X-XSS-Protection: 1; mode=block\";\n more_set_headers \"X-Content-Type-Options: nosniff\";\n")),(0,s.kt)("p",null,"La CSP est \xe0 adapter selon vos scripts externes; vous pouvez la d\xe9finir\nmanuellement ou avec l'extension\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/april/laboratory"},"CSP laboratory"),"."),(0,s.kt)("p",null,"Le repo ",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SocialGouv/template"},"template")," pr\xe9sente\nl'int\xe9gration dans un Next.js statique (branche ",(0,s.kt)("inlineCode",{parentName:"p"},"main"),") ou avec un serveur\n(branche ",(0,s.kt)("inlineCode",{parentName:"p"},"hasura"),")."),(0,s.kt)("h4",{id:"c\xf4t\xe9-applicatif"},"C\xf4t\xe9 applicatif"),(0,s.kt)("p",null,"Il est possible d'ajouter les headers c\xf4t\xe9 applicatif, par exemple avec\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/helmetjs/helmet"},"helmet"),"."),(0,s.kt)("h3",{id:"chiffrer-des-fichiers"},"Chiffrer des fichiers"),(0,s.kt)("p",null,"Si vous souhaitez chiffrer des fichiers c\xf4t\xe9 serveur, vous pouvez utiliser le\nmodule\n",(0,s.kt)("a",{parentName:"p",href:"https://github.com/SocialGouv/streaming-file-encryption"},"streaming-file-encryption"),"."),(0,s.kt)("p",null,"La s\xe9curit\xe9 de ce module repose sur la connaissance n\xe9cessaire de 3 informations\ndisctinctes pour pouvoir d\xe9chiffrer un fichier :"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"Le ",(0,s.kt)("inlineCode",{parentName:"li"},"mainSecret")," \xe0 d\xe9finir en tant que variable d'environnement c\xf4t\xe9 applicatif"),(0,s.kt)("li",{parentName:"ul"},"Le ",(0,s.kt)("inlineCode",{parentName:"li"},"context")," \xe0 stocker dans votre base de donn\xe9es et li\xe9 \xe0 votre fichier"),(0,s.kt)("li",{parentName:"ul"},"Le ",(0,s.kt)("inlineCode",{parentName:"li"},"ciphertext")," \xe0 stocker sur un volume disque persistant")),(0,s.kt)("p",null,"\u26a0\ufe0f il est essentiel de stocker ces donn\xe9es dans des espaces isol\xe9s."),(0,s.kt)("p",null,"Les fichiers chiffr\xe9s r\xe9pondent\xa0aux propri\xe9t\xe9s cryptographiques suivantes :"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 la falsification (modification des donn\xe9es)"),(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 la troncature (suppression des donn\xe9es \xe0 chaque extr\xe9mit\xe9 ou au\nmilieu)"),(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 l'extension (ajout de donn\xe9es \xe0 chaque extr\xe9mit\xe9 ou au milieu)"),(0,s.kt)("li",{parentName:"ul"},"R\xe9sistance \xe0 la r\xe9organisation (\xe9change de pages de donn\xe9es)")),(0,s.kt)("h2",{id:"r\xe9f\xe9rences"},"R\xe9f\xe9rences"),(0,s.kt)("h3",{id:"g\xe9n\xe9ral"},"G\xe9n\xe9ral"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.ssi.gouv.fr/uploads/2018/11/guide-securite-numerique-agile-anssi-pa-v1.pdf"},"guide ANSSI de la s\xe9curit\xe9 agile")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://cheatsheetseries.owasp.org/"},"https://cheatsheetseries.owasp.org/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.ssi.gouv.fr/guide/mot-de-passe/"},"https://www.ssi.gouv.fr/guide/mot-de-passe/")),(0,s.kt)("li",{parentName:"ul"},"Reset password best practices :\n",(0,s.kt)("a",{parentName:"li",href:"https://www.troyhunt.com/everything-you-ever-wanted-to-know/"},"https://www.troyhunt.com/everything-you-ever-wanted-to-know/"))),(0,s.kt)("h3",{id:"nodejs"},"NodeJS"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.sqreen.com/checklists/nodejs-security-handbook"},"https://www.sqreen.com/checklists/nodejs-security-handbook")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/goldbergyoni/nodebestpractices#6-security-best-practices"},"https://github.com/goldbergyoni/nodebestpractices#6-security-best-practices")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md"},"https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md"))),(0,s.kt)("h3",{id:"docker"},"Docker"),(0,s.kt)("ul",null,(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://www.ssi.gouv.fr/administration/publication/recommandations-de-securite-relatives-au-deploiement-de-conteneurs-docker/"},"https://www.ssi.gouv.fr/administration/publication/recommandations-de-securite-relatives-au-deploiement-de-conteneurs-docker/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://docs.docker.com/develop/develop-images/dockerfile_best-practices/"},"https://docs.docker.com/develop/develop-images/dockerfile_best-practices/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://snyk.io/blog/10-docker-image-security-best-practices/"},"https://snyk.io/blog/10-docker-image-security-best-practices/")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/OWASP/Docker-Security"},"https://github.com/OWASP/Docker-Security")),(0,s.kt)("li",{parentName:"ul"},(0,s.kt)("a",{parentName:"li",href:"https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Docker_Security_Cheat_Sheet.md"},"https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Docker_Security_Cheat_Sheet.md"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d33af5b6.79d5e054.js b/assets/js/d33af5b6.79d5e054.js new file mode 100644 index 00000000..aff2e4c6 --- /dev/null +++ b/assets/js/d33af5b6.79d5e054.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunksupport=self.webpackChunksupport||[]).push([[893],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});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 s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,k=c["".concat(l,".").concat(m)]||c[m]||d[m]||s;return n?a.createElement(k,i(i({ref:t},u),{},{components:n})):a.createElement(k,i({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,i=new Array(s);i[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[c]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const s={},i="Kubernetes (K8S)",o={unversionedId:"standards/kubernetes",id:"standards/kubernetes",title:"Kubernetes (K8S)",description:"big picture",source:"@site/docs/standards/kubernetes.md",sourceDirName:"standards",slug:"/standards/kubernetes",permalink:"/support/docs/standards/kubernetes",draft:!1,editUrl:"https://github.com/socialgouv/support/tree/master/docs/standards/kubernetes.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"S\xe9curit\xe9",permalink:"/support/docs/standards/securite"},next:{title:"Tests",permalink:"/support/docs/standards/tests"}},l={},p=[{value:"Best practices : 12 factors apps",id:"best-practices--12-factors-apps",level:2},{value:"Liveness et Readyness probes",id:"liveness-et-readyness-probes",level:3},{value:"Bien logger dans Docker et donc K8s",id:"bien-logger-dans-docker-et-donc-k8s",level:3},{value:"Exposer les m\xe9triques de mon application",id:"exposer-les-m\xe9triques-de-mon-application",level:3},{value:"Privatisation des m\xe9triques",id:"privatisation-des-m\xe9triques",level:4},{value:"Les outils pour utiliser kubernetes",id:"les-outils-pour-utiliser-kubernetes",level:2},{value:"Clients",id:"clients",level:3},{value:"Variable d'environnement dans Kubernetes",id:"variable-denvironnement-dans-kubernetes",level:2},{value:"ConfigMap : Variables de configuration",id:"configmap--variables-de-configuration",level:3},{value:"Ingress : routing vers vos applications",id:"ingress--routing-vers-vos-applications",level:3},{value:"Sealed-secrets : Variables secretes",id:"sealed-secrets--variables-secretes",level:3},{value:"Sceller un secret dans Kubernetes",id:"sceller-un-secret-dans-kubernetes",level:2},{value:"Tester la validit\xe9 d'un sealed-secret",id:"tester-la-validit\xe9-dun-sealed-secret",level:2},{value:"Synth\xe8se des attentes",id:"synth\xe8se-des-attentes",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...s}=e;return(0,r.kt)(c,(0,a.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"kubernetes-k8s"},"Kubernetes (K8S)"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"big picture",src:n(4134).Z,title:":size=800x400",width:"1400",height:"904"})),(0,r.kt)("p",null,"Une tr\xe8s bonne introduction \xe0 Kubernetes est lisible ici : ",(0,r.kt)("a",{parentName:"p",href:"https://sendilkumarn.com/blog/kubernetes-for-everyone/"},"https://sendilkumarn.com/blog/kubernetes-for-everyone/")),(0,r.kt)("h2",{id:"best-practices--12-factors-apps"},"Best practices : 12 factors apps"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Il s'agit de 12 principes d'architecture g\xe9n\xe9raux et de processus utiles pour faire tourner une application dans un environnement ",(0,r.kt)("em",{parentName:"p"},"cloud"),". \xc7a s'applique donc directement aux applications qui doivent tourner dans ",(0,r.kt)("em",{parentName:"p"},"K8s"),". Voir aussi ",(0,r.kt)("a",{parentName:"p",href:"https://12factor.net/fr/"},"https://12factor.net/fr/"))),(0,r.kt)("p",null,"Le code applicatif qui \xe0 terme sera d\xe9ploy\xe9 sur un cluster Kubernetes se doit de respecter un certain nombre de r\xe8gles."),(0,r.kt)("p",null,"Les principales recommandations sont:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Versionnement du code (GIT)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Exposition d\u2019une ",(0,r.kt)("em",{parentName:"strong"},"URL")," de ",(0,r.kt)("em",{parentName:"strong"},"healthcheck"))," sur ",(0,r.kt)("inlineCode",{parentName:"li"},"/healthz")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Application ",(0,r.kt)("em",{parentName:"strong"},"stateless"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Configuration par variables d\u2019environnement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"La sortie des logs sur la sortie standard ou la sortie d\u2019erreur")),(0,r.kt)("li",{parentName:"ul"},"Gestion du mode d\xe9grad\xe9."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Gestion des arr\xeats/relances de mani\xe8re propre."))),(0,r.kt)("p",null,"Pour aller plus loin : ",(0,r.kt)("a",{parentName:"p",href:"https://blog.octo.com/applications-node-js-a-12-facteurs-partie-1-une-base-de-code-saine/"},"https://blog.octo.com/applications-node-js-a-12-facteurs-partie-1-une-base-de-code-saine/")),(0,r.kt)("h3",{id:"liveness-et-readyness-probes"},(0,r.kt)("em",{parentName:"h3"},"Liveness")," et ",(0,r.kt)("em",{parentName:"h3"},"Readyness probes")),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Kubernetes")," met \xe0 disposisiton deux outils pour permettant aux application de lui signifier leur \xe9tat de sant\xe9 (OK / KO) ainsi que leur capacit\xe9 \xe0 traiter des requ\xeates ou non (Ready / Not Ready)."),(0,r.kt)("p",null,"Il est important que bien exposer une ",(0,r.kt)("em",{parentName:"p"},"URL")," de ",(0,r.kt)("em",{parentName:"p"},"healthcheck")," et de param\xe9trer ces deux ",(0,r.kt)("em",{parentName:"p"},"probes")," pour ne pas subir les fonctions de ",(0,r.kt)("em",{parentName:"p"},"K8S"),", et au contraire en tirer partie (",(0,r.kt)("em",{parentName:"p"},"self-healing"),", ",(0,r.kt)("em",{parentName:"p"},"rolling upgrade"),", etc.)"),(0,r.kt)("p",null,"Tout est expliqu\xe9 ici : ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/"},"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/")),(0,r.kt)("h3",{id:"bien-logger-dans-docker-et-donc-k8s"},"Bien logger dans ",(0,r.kt)("em",{parentName:"h3"},"Docker")," et donc ",(0,r.kt)("em",{parentName:"h3"},"K8s")),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Long story short")," :"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"tous les logs doivent \xeatre envoy\xe9s sur ",(0,r.kt)("inlineCode",{parentName:"li"},"STDOUT")," ou ",(0,r.kt)("inlineCode",{parentName:"li"},"STDERR")),(0,r.kt)("li",{parentName:"ul"},"D\xe8s que c'est possible, utiliser le format de format de sortie ",(0,r.kt)("inlineCode",{parentName:"li"},"JSON")," pour vos logs, et en ",(0,r.kt)("inlineCode",{parentName:"li"},"single-line"),". Ils seront plus facilement indexables dans ",(0,r.kt)("em",{parentName:"li"},"Elasticsearch"),", et donc plus faciles \xe0 exploiter.")),(0,r.kt)("p",null,"Voir \xe9galement ",(0,r.kt)("a",{parentName:"p",href:"/docs/standards/securite#logging"},"les recommandations de s\xe9cu au sujet des logs")),(0,r.kt)("h3",{id:"exposer-les-m\xe9triques-de-mon-application"},"Exposer les m\xe9triques de mon application"),(0,r.kt)("p",null,"Pour faire du profiling comme pour faire de l'analyse sur des donn\xe9es m\xe9tier, vous pouver exposer un endpoint ",(0,r.kt)("inlineCode",{parentName:"p"},"/metrics")," (ou avec un autre path mais c'est une convention) qui sera scrapp\xe9 par ",(0,r.kt)("em",{parentName:"p"},"Prometheus"),", la brique de collecte du cluster K8s."),(0,r.kt)("p",null,"Le format des donn\xe9es expos\xe9es sur ",(0,r.kt)("inlineCode",{parentName:"p"},"/metrics")," doit \xeatre en ",(0,r.kt)("em",{parentName:"p"},"Open Metrics"),", et c'est g\xe9n\xe9ralement dispo dans les ",(0,r.kt)("em",{parentName:"p"},"libs")," & ",(0,r.kt)("em",{parentName:"p"},"frameworks")," que vous utilisez d\xe9j\xe0. Un exemple de ce que l'on peut faire avec NodeJS : ",(0,r.kt)("a",{parentName:"p",href:"https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/"},"https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/")),(0,r.kt)("p",null,"Exemple de route ",(0,r.kt)("inlineCode",{parentName:"p"},"/metrics")," :"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"# HELP appname_users_count Nombre total d'utilisateurs\n# TYPE appname_users_count counter\nappname_users_count 7\n# HELP appname_users_7days_count Utilisateurs actifs sur les 7 derniers jours\n# TYPE appname_users_7days_count counter\nappname_active_users_7days_count 0\n# HELP appname_session_count Sessions ouvertes\n# TYPE appname_session_count gauge\nappname_session_count 0\n# HELP appname_publics_products_count Nombre de produits publics\n# TYPE appname_publics_products_count counter\nappname_publics_products_count 9\n# HELP appname_products_count Nombre de produits total\n# TYPE appname_products_count counter\nappname_products_count 13\n# HELP appname_auditlog_count Nombre d'events dans l'auditlog PG\n# TYPE appname_auditlog_count counter\nappname_auditlog_count 245\n")),(0,r.kt)("p",null,"Voir les ",(0,r.kt)("a",{parentName:"p",href:"https://prometheus.io/docs/practices/naming/"},"best practices pour les m\xe9triques Prometheus")),(0,r.kt)("h4",{id:"privatisation-des-m\xe9triques"},"Privatisation des m\xe9triques"),(0,r.kt)("p",null,"Si les m\xe9triques sont confidentielles, le endpoint doit \xeatre s\xe9curis\xe9. Pour cela, ajouter une annotation sur l'ingress nginx pour neutraliser l'acc\xe8s externe :"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"annotations:\n nginx.ingress.kubernetes.io/configuration-snippet: |\n location /metrics {\n deny all;\n return 403;\n }\n")),(0,r.kt)("h2",{id:"les-outils-pour-utiliser-kubernetes"},"Les outils pour utiliser kubernetes"),(0,r.kt)("h3",{id:"clients"},"Clients"),(0,r.kt)("p",null,"Le ",(0,r.kt)("a",{parentName:"p",href:"https://k9scli.io/"},"CLI k9s")," permet de monitorer ses d\xe9ploiements, consulter les logs, se connecter en shell \xe0 vos containers... ",(0,r.kt)("a",{parentName:"p",href:"https://rancher.fabrique.social.gouv.fr"},"Rancher")," est un \xe9quivalent en interface web."),(0,r.kt)("p",null,"Pour acc\xe9der \xe0 votre cluster :"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"installer ",(0,r.kt)("inlineCode",{parentName:"li"},"kubectl")," et ",(0,r.kt)("inlineCode",{parentName:"li"},"k9s")),(0,r.kt)("li",{parentName:"ul"},"r\xe9cup\xe9rer votre fichier ",(0,r.kt)("inlineCode",{parentName:"li"},"kubeconfig")," depuis Rancher et le positionner dans ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.kube/config")),(0,r.kt)("li",{parentName:"ul"},"lancer ",(0,r.kt)("inlineCode",{parentName:"li"},"k9s -A --namespace NAMESPACE")," pour acc\xe9der \xe0 votre namespace. enjoy :)")),(0,r.kt)("p",null,"Plus de d\xe9tails sur l'administration kube avec k9s sur la ",(0,r.kt)("a",{parentName:"p",href:"https://k9scli.io/topics/commands/"},"cheatsheet")," ou ",(0,r.kt)("a",{parentName:"p",href:"https://opensource.com/article/20/5/kubernetes-administration"},"cet article"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://grafana.fabrique.social.gouv.fr"},"Grafana")," permet de superviser finement tous les environnements, VMs et bases de donn\xe9es."),(0,r.kt)("p",null,"Vous pouvez \xe9galement consulter tous vos logs applicatifs dans Grafana avec Loki cf ",(0,r.kt)("a",{parentName:"p",href:"/docs/faq#grafana"},"faq")),(0,r.kt)("h2",{id:"variable-denvironnement-dans-kubernetes"},"Variable d'environnement dans Kubernetes"),(0,r.kt)("p",null,"On vous recommande de r\xe9cup\xe9rer vos variables d'environnement dans vos containers avec ",(0,r.kt)("inlineCode",{parentName:"p"},"envFrom"),". Ceci permet de r\xe9cup\xe9rer directement toutes les variables contenues dans une ConfigMap et/ou un Sealed-Secret."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"# [...]\nenvFrom:\n - configMapRef:\n name: app-env\n - secretRef:\n name: app-env\n")),(0,r.kt)("h3",{id:"configmap--variables-de-configuration"},"ConfigMap : Variables de configuration"),(0,r.kt)("p",null,"Les variables qui configurent le projet dans l'environnement d\xe9ploy\xe9. Ces variables sont pr\xe9dictibles et non-chiffr\xe9es. Example : ",(0,r.kt)("inlineCode",{parentName:"p"},"NODE_ENV=PRODUCTION")),(0,r.kt)("p",null,"Il est recommand\xe9 d'utiliser une ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables"},(0,r.kt)("em",{parentName:"a"},"ConfigMap")," par container")," et par environnement."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'# .k8s/environements/dev/app-env.configmap.yaml\nkind: ConfigMap\napiVersion: v1\nmetadata:\n name: app-env\ndata:\n NODE_ENV: "production"\n GRAPHQL_ENDPOINT: "http://hasura/v1/graphql"\n ACCOUNT_MAIL_SENDER: "contact@fabrique.social.gouv.fr"\n FRONTEND_PORT: "${PORT}"\n PRODUCTION: "false"\n')),(0,r.kt)("h3",{id:"ingress--routing-vers-vos-applications"},"Ingress : routing vers vos applications"),(0,r.kt)("p",null,"Nos clusters fournissent le routing et les certificats SSL vers vos applications via un ",(0,r.kt)("inlineCode",{parentName:"p"},"nginx ingress controller"),"."),(0,r.kt)("p",null,"Chaque service expos\xe9 de votre application doit d\xe9clarer une ",(0,r.kt)("inlineCode",{parentName:"p"},"ingress rule")," sp\xe9cifique qui peut comporter des annotations sp\xe9cifiques pour cont\xf4ler les param\xe8tres nginx (redirections, auth, rate-limiting...). cf ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations"},"annotation ingress nginx"),"."),(0,r.kt)("p",null,"Pour les noms de domaines externes, cf ",(0,r.kt)("a",{parentName:"p",href:"/docs/faq#noms-de-domaines-externes"},"faq")),(0,r.kt)("h3",{id:"sealed-secrets--variables-secretes"},"Sealed-secrets : Variables secretes"),(0,r.kt)("p",null,"Les variables de configuration secretes qui doivent \xeatre chiffr\xe9es. Example : ",(0,r.kt)("inlineCode",{parentName:"p"},"JWT_SECRET=xxxxxxx")),(0,r.kt)("p",null,"Il est recommand\xe9 d'utiliser un ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/bitnami-labs/sealed-secrets"},(0,r.kt)("em",{parentName:"a"},"SealedSecret")," par container")," et par environnement."),(0,r.kt)("p",null,"L'\xe9quipe SRE est en charge de la gestion des valeurs dans le ",(0,r.kt)("em",{parentName:"p"},"SealedSecret")," utilis\xe9s par notre projet en dev comme en prod. Les valeurs de dev sont consultables par les d\xe9veloppeurs de la startup en r\xe9cup\xe9rant le ",(0,r.kt)("em",{parentName:"p"},"Secret")," du m\xeame nom."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'# .k8s/environements/dev/hasura-env.configmap.yaml\nkind: SealedSecret\napiVersion: bitnami.com/v1alpha1\nmetadata:\n name: hasura-env\n creationTimestamp:\n annotations:\n sealedsecrets.bitnami.com/cluster-wide: "true"\nspec:\n template:\n metadata:\n name: hasura-env\n creationTimestamp:\n annotations:\n sealedsecrets.bitnami.com/cluster-wide: "true"\n type: Opaque\n encryptedData:\n ACCOUNT_EMAIL_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==\n HASURA_GRAPHQL_ADMIN_SECRET: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy==\n HASURA_GRAPHQL_JWT_SECRET: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz==\n')),(0,r.kt)("h2",{id:"sceller-un-secret-dans-kubernetes"},"Sceller un secret dans Kubernetes"),(0,r.kt)("p",null,"Pour sceller un nouveau secret pour votre application, vous pouvez utiliser l'interface ",(0,r.kt)("a",{parentName:"p",href:"https://socialgouv.github.io/sre-tools"},"WebSeal")),(0,r.kt)("p",null,"Cette application permet de chiffrer votre secret (client-side) pour mettre \xe0 jour vos fichiers de sealed-secrets"),(0,r.kt)("p",null,"Deux cas possibles :"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"D\xe9veloppement")," : le secret est d\xe9chiffrable cluster-wide"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Production")," : le secret est d\xe9chiffrable uniquement pour un ",(0,r.kt)("inlineCode",{parentName:"li"},"namespace")," donn\xe9.")),(0,r.kt)("p",null,"Pour la ",(0,r.kt)("em",{parentName:"p"},"production")," pensez \xe0 bien \xe0 v\xe9rifier le ",(0,r.kt)("inlineCode",{parentName:"p"},"namespace")," et le ",(0,r.kt)("inlineCode",{parentName:"p"},"secret name")," sp\xe9cifi\xe9. Le ",(0,r.kt)("inlineCode",{parentName:"p"},"secret name")," est le nom du secret li\xe9 \xe0 l'application, par exemple ",(0,r.kt)("inlineCode",{parentName:"p"},"app"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"api")," ou ",(0,r.kt)("inlineCode",{parentName:"p"},"app-sealed-secret")," ; on peut trouver ce nom dans le champ ",(0,r.kt)("inlineCode",{parentName:"p"},"metadata.name")," du fichier de secret. Ce nom peut-\xeatre indiqu\xe9 dans les d\xe9ploiements (par exemple dans le fichier ",(0,r.kt)("inlineCode",{parentName:"p"},".kube-workflow/values.yaml"),", dans la partie ",(0,r.kt)("inlineCode",{parentName:"p"},"envFrom.secretRef")," pour inclure les secrets d\xe9chiffr\xe9s dans l'environnement d'un container)."),(0,r.kt)("p",null,"Copiez-collez ensuite le secret chiffr\xe9 dans votre fichier de sealed-secrets pour le mettre \xe0 jour."),(0,r.kt)("p",null,"L'\xe9quipe SRE est \xe0 votre disposition pour vous aider dans cette d\xe9marche"),(0,r.kt)("h2",{id:"tester-la-validit\xe9-dun-sealed-secret"},"Tester la validit\xe9 d'un sealed-secret"),(0,r.kt)("p",null,"Avant d'envoyer un sealed-secret sur le cluster, il est utile de v\xe9rifier qu'il soit bien chiffr\xe9."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"kubectl --context dev apply -f ./environments/dev/some.sealed-secret.yml")),(0,r.kt)("p",null,"Ensuite, v\xe9rifier dans rancher ou k9s qu'un ",(0,r.kt)("inlineCode",{parentName:"p"},"Secret")," avec les bonnes valeurs a bien \xe9t\xe9 cr\xe9\xe9 dans le bon namespace."),(0,r.kt)("p",null,"\u26a0\ufe0f ceci va \xe9craser l'\xe9ventuel secret du meme namespace/nom existant. pensez \xe0 changer le nom du secret si besoin"),(0,r.kt)("p",null,"\u26a0\ufe0f La manip n'est pas forc\xe9ment possible en prod, car cela \xe9craserait le secret existant. une possibilit\xe9 est de renommer les cl\xe9s du secret pour ne pas impacter les cl\xe9s existantes."),(0,r.kt)("h2",{id:"synth\xe8se-des-attentes"},"Synth\xe8se des attentes"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"},"Niveau"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Recommandation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les logs sont envoy\xe9s vers les sorties standard ",(0,r.kt)("inlineCode",{parentName:"td"},"STDOUT")," ou ",(0,r.kt)("inlineCode",{parentName:"td"},"STDERR"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les logs sont envoy\xe9s au format ",(0,r.kt)("inlineCode",{parentName:"td"},"JSON")," et ",(0,r.kt)("inlineCode",{parentName:"td"},"single-line"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les valeurs de CPU ",(0,r.kt)("inlineCode",{parentName:"td"},"requests")," doivent \xeatre renseign\xe9es.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les valeurs de RAM ",(0,r.kt)("inlineCode",{parentName:"td"},"requests")," et ",(0,r.kt)("inlineCode",{parentName:"td"},"limits")," doivent \xeatre renseign\xe9es, avec un facteur ",(0,r.kt)("inlineCode",{parentName:"td"},"limits <= 2*requests")," en dev et ",(0,r.kt)("inlineCode",{parentName:"td"},"limits = requests")," en prod.")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Le HPA doit \xeatre activ\xe9 et param\xe9tr\xe9 avec des valeurs ",(0,r.kt)("inlineCode",{parentName:"td"},"min=1"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"max=10"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Au moins une route de healthcheck doit \xeatre impl\xe9ment\xe9e (ex: /healthz)")))))}d.isMDXComponent=!0},4134:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/kubernetes-big-picture-5408d8189624d4b27155b2bd4f607ebf.png"}}]); \ No newline at end of file diff --git a/assets/js/d33af5b6.ad69056a.js b/assets/js/d33af5b6.ad69056a.js deleted file mode 100644 index 334362de..00000000 --- a/assets/js/d33af5b6.ad69056a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunksupport=self.webpackChunksupport||[]).push([[893],{3905:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>k});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 s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),p=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=p(e.components);return a.createElement(l.Provider,{value:t},e.children)},c="mdxType",d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},m=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,s=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),c=p(n),m=r,k=c["".concat(l,".").concat(m)]||c[m]||d[m]||s;return n?a.createElement(k,i(i({ref:t},u),{},{components:n})):a.createElement(k,i({ref:t},u))}));function k(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var s=n.length,i=new Array(s);i[0]=m;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o[c]="string"==typeof e?e:r,i[1]=o;for(var p=2;p{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>p});var a=n(7462),r=(n(7294),n(3905));const s={},i="Kubernetes (K8S)",o={unversionedId:"standards/kubernetes",id:"standards/kubernetes",title:"Kubernetes (K8S)",description:"big picture",source:"@site/docs/standards/kubernetes.md",sourceDirName:"standards",slug:"/standards/kubernetes",permalink:"/support/docs/standards/kubernetes",draft:!1,editUrl:"https://github.com/socialgouv/support/tree/master/docs/standards/kubernetes.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"S\xe9curit\xe9",permalink:"/support/docs/standards/securite"},next:{title:"Tests",permalink:"/support/docs/standards/tests"}},l={},p=[{value:"Best practices : 12 factors apps",id:"best-practices--12-factors-apps",level:2},{value:"Liveness et Readyness probes",id:"liveness-et-readyness-probes",level:3},{value:"Bien logger dans Docker et donc K8s",id:"bien-logger-dans-docker-et-donc-k8s",level:3},{value:"Exposer les m\xe9triques de mon application",id:"exposer-les-m\xe9triques-de-mon-application",level:3},{value:"Privatisation des m\xe9triques",id:"privatisation-des-m\xe9triques",level:4},{value:"Les outils pour utiliser kubernetes",id:"les-outils-pour-utiliser-kubernetes",level:2},{value:"Clients",id:"clients",level:3},{value:"Variable d'environnement dans Kubernetes",id:"variable-denvironnement-dans-kubernetes",level:2},{value:"ConfigMap : Variables de configuration",id:"configmap--variables-de-configuration",level:3},{value:"Ingress : routing vers vos applications",id:"ingress--routing-vers-vos-applications",level:3},{value:"Sealed-secrets : Variables secretes",id:"sealed-secrets--variables-secretes",level:3},{value:"Sceller un secret dans Kubernetes",id:"sceller-un-secret-dans-kubernetes",level:2},{value:"Tester la validit\xe9 d'un sealed-secret",id:"tester-la-validit\xe9-dun-sealed-secret",level:2},{value:"Synth\xe8se des attentes",id:"synth\xe8se-des-attentes",level:2}],u={toc:p},c="wrapper";function d(e){let{components:t,...s}=e;return(0,r.kt)(c,(0,a.Z)({},u,s,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"kubernetes-k8s"},"Kubernetes (K8S)"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"big picture",src:n(4134).Z,title:":size=800x400",width:"1400",height:"904"})),(0,r.kt)("p",null,"Une tr\xe8s bonne introduction \xe0 Kubernetes est lisible ici : ",(0,r.kt)("a",{parentName:"p",href:"https://sendilkumarn.com/blog/kubernetes-for-everyone/"},"https://sendilkumarn.com/blog/kubernetes-for-everyone/")),(0,r.kt)("h2",{id:"best-practices--12-factors-apps"},"Best practices : 12 factors apps"),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Il s'agit de 12 principes d'architecture g\xe9n\xe9raux et de processus utiles pour faire tourner une application dans un environnement ",(0,r.kt)("em",{parentName:"p"},"cloud"),". \xc7a s'applique donc directement aux applications qui doivent tourner dans ",(0,r.kt)("em",{parentName:"p"},"K8s"),". Voir aussi ",(0,r.kt)("a",{parentName:"p",href:"https://12factor.net/fr/"},"https://12factor.net/fr/"))),(0,r.kt)("p",null,"Le code applicatif qui \xe0 terme sera d\xe9ploy\xe9 sur un cluster Kubernetes se doit de respecter un certain nombre de r\xe8gles."),(0,r.kt)("p",null,"Les principales recommandations sont:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Versionnement du code (GIT)"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Exposition d\u2019une ",(0,r.kt)("em",{parentName:"strong"},"URL")," de ",(0,r.kt)("em",{parentName:"strong"},"healthcheck"))," sur ",(0,r.kt)("inlineCode",{parentName:"li"},"/healthz")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Application ",(0,r.kt)("em",{parentName:"strong"},"stateless"))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Configuration par variables d\u2019environnement")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"La sortie des logs sur la sortie standard ou la sortie d\u2019erreur")),(0,r.kt)("li",{parentName:"ul"},"Gestion du mode d\xe9grad\xe9."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Gestion des arr\xeats/relances de mani\xe8re propre."))),(0,r.kt)("p",null,"Pour aller plus loin : ",(0,r.kt)("a",{parentName:"p",href:"https://blog.octo.com/applications-node-js-a-12-facteurs-partie-1-une-base-de-code-saine/"},"https://blog.octo.com/applications-node-js-a-12-facteurs-partie-1-une-base-de-code-saine/")),(0,r.kt)("h3",{id:"liveness-et-readyness-probes"},(0,r.kt)("em",{parentName:"h3"},"Liveness")," et ",(0,r.kt)("em",{parentName:"h3"},"Readyness probes")),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Kubernetes")," met \xe0 disposisiton deux outils pour permettant aux application de lui signifier leur \xe9tat de sant\xe9 (OK / KO) ainsi que leur capacit\xe9 \xe0 traiter des requ\xeates ou non (Ready / Not Ready)."),(0,r.kt)("p",null,"Il est important que bien exposer une ",(0,r.kt)("em",{parentName:"p"},"URL")," de ",(0,r.kt)("em",{parentName:"p"},"healthcheck")," et de param\xe9trer ces deux ",(0,r.kt)("em",{parentName:"p"},"probes")," pour ne pas subir les fonctions de ",(0,r.kt)("em",{parentName:"p"},"K8S"),", et au contraire en tirer partie (",(0,r.kt)("em",{parentName:"p"},"self-healing"),", ",(0,r.kt)("em",{parentName:"p"},"rolling upgrade"),", etc.)"),(0,r.kt)("p",null,"Tout est expliqu\xe9 ici : ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/"},"https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/")),(0,r.kt)("h3",{id:"bien-logger-dans-docker-et-donc-k8s"},"Bien logger dans ",(0,r.kt)("em",{parentName:"h3"},"Docker")," et donc ",(0,r.kt)("em",{parentName:"h3"},"K8s")),(0,r.kt)("p",null,(0,r.kt)("em",{parentName:"p"},"Long story short")," :"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"tous les logs doivent \xeatre envoy\xe9s sur ",(0,r.kt)("inlineCode",{parentName:"li"},"STDOUT")," ou ",(0,r.kt)("inlineCode",{parentName:"li"},"STDERR")),(0,r.kt)("li",{parentName:"ul"},"D\xe8s que c'est possible, utiliser le format de format de sortie ",(0,r.kt)("inlineCode",{parentName:"li"},"JSON")," pour vos logs, et en ",(0,r.kt)("inlineCode",{parentName:"li"},"single-line"),". Ils seront plus facilement indexables dans ",(0,r.kt)("em",{parentName:"li"},"Elasticsearch"),", et donc plus faciles \xe0 exploiter.")),(0,r.kt)("h3",{id:"exposer-les-m\xe9triques-de-mon-application"},"Exposer les m\xe9triques de mon application"),(0,r.kt)("p",null,"Pour faire du profiling comme pour faire de l'analyse sur des donn\xe9es m\xe9tier, vous pouver exposer un endpoint ",(0,r.kt)("inlineCode",{parentName:"p"},"/metrics")," (ou avec un autre path mais c'est une convention) qui sera scrapp\xe9 par ",(0,r.kt)("em",{parentName:"p"},"Prometheus"),", la brique de collecte du cluster K8s."),(0,r.kt)("p",null,"Le format des donn\xe9es expos\xe9es sur ",(0,r.kt)("inlineCode",{parentName:"p"},"/metrics")," doit \xeatre en ",(0,r.kt)("em",{parentName:"p"},"Open Metrics"),", et c'est g\xe9n\xe9ralement dispo dans les ",(0,r.kt)("em",{parentName:"p"},"libs")," & ",(0,r.kt)("em",{parentName:"p"},"frameworks")," que vous utilisez d\xe9j\xe0. Un exemple de ce que l'on peut faire avec NodeJS : ",(0,r.kt)("a",{parentName:"p",href:"https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/"},"https://blog.risingstack.com/node-js-performance-monitoring-with-prometheus/")),(0,r.kt)("p",null,"Exemple de route ",(0,r.kt)("inlineCode",{parentName:"p"},"/metrics")," :"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre"},"# HELP appname_users_count Nombre total d'utilisateurs\n# TYPE appname_users_count counter\nappname_users_count 7\n# HELP appname_users_7days_count Utilisateurs actifs sur les 7 derniers jours\n# TYPE appname_users_7days_count counter\nappname_active_users_7days_count 0\n# HELP appname_session_count Sessions ouvertes\n# TYPE appname_session_count gauge\nappname_session_count 0\n# HELP appname_publics_products_count Nombre de produits publics\n# TYPE appname_publics_products_count counter\nappname_publics_products_count 9\n# HELP appname_products_count Nombre de produits total\n# TYPE appname_products_count counter\nappname_products_count 13\n# HELP appname_auditlog_count Nombre d'events dans l'auditlog PG\n# TYPE appname_auditlog_count counter\nappname_auditlog_count 245\n")),(0,r.kt)("p",null,"Voir les ",(0,r.kt)("a",{parentName:"p",href:"https://prometheus.io/docs/practices/naming/"},"best practices pour les m\xe9triques Prometheus")),(0,r.kt)("h4",{id:"privatisation-des-m\xe9triques"},"Privatisation des m\xe9triques"),(0,r.kt)("p",null,"Si les m\xe9triques sont confidentielles, le endpoint doit \xeatre s\xe9curis\xe9. Pour cela, ajouter une annotation sur l'ingress nginx pour neutraliser l'acc\xe8s externe :"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"annotations:\n nginx.ingress.kubernetes.io/configuration-snippet: |\n location /metrics {\n deny all;\n return 403;\n }\n")),(0,r.kt)("h2",{id:"les-outils-pour-utiliser-kubernetes"},"Les outils pour utiliser kubernetes"),(0,r.kt)("h3",{id:"clients"},"Clients"),(0,r.kt)("p",null,"Le ",(0,r.kt)("a",{parentName:"p",href:"https://k9scli.io/"},"CLI k9s")," permet de monitorer ses d\xe9ploiements, consulter les logs, se connecter en shell \xe0 vos containers... ",(0,r.kt)("a",{parentName:"p",href:"https://rancher.fabrique.social.gouv.fr"},"Rancher")," est un \xe9quivalent en interface web."),(0,r.kt)("p",null,"Pour acc\xe9der \xe0 votre cluster :"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"installer ",(0,r.kt)("inlineCode",{parentName:"li"},"kubectl")," et ",(0,r.kt)("inlineCode",{parentName:"li"},"k9s")),(0,r.kt)("li",{parentName:"ul"},"r\xe9cup\xe9rer votre fichier ",(0,r.kt)("inlineCode",{parentName:"li"},"kubeconfig")," depuis Rancher et le positionner dans ",(0,r.kt)("inlineCode",{parentName:"li"},"~/.kube/config")),(0,r.kt)("li",{parentName:"ul"},"lancer ",(0,r.kt)("inlineCode",{parentName:"li"},"k9s -A --namespace NAMESPACE")," pour acc\xe9der \xe0 votre namespace. enjoy :)")),(0,r.kt)("p",null,"Plus de d\xe9tails sur l'administration kube avec k9s sur la ",(0,r.kt)("a",{parentName:"p",href:"https://k9scli.io/topics/commands/"},"cheatsheet")," ou ",(0,r.kt)("a",{parentName:"p",href:"https://opensource.com/article/20/5/kubernetes-administration"},"cet article"),"."),(0,r.kt)("p",null,(0,r.kt)("a",{parentName:"p",href:"https://grafana.fabrique.social.gouv.fr"},"Grafana")," permet de superviser finement tous les environnements, VMs et bases de donn\xe9es."),(0,r.kt)("p",null,"Vous pouvez \xe9galement consulter tous vos logs applicatifs dans Grafana avec Loki cf ",(0,r.kt)("a",{parentName:"p",href:"/docs/faq#grafana"},"faq")),(0,r.kt)("h2",{id:"variable-denvironnement-dans-kubernetes"},"Variable d'environnement dans Kubernetes"),(0,r.kt)("p",null,"On vous recommande de r\xe9cup\xe9rer vos variables d'environnement dans vos containers avec ",(0,r.kt)("inlineCode",{parentName:"p"},"envFrom"),". Ceci permet de r\xe9cup\xe9rer directement toutes les variables contenues dans une ConfigMap et/ou un Sealed-Secret."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},"# [...]\nenvFrom:\n - configMapRef:\n name: app-env\n - secretRef:\n name: app-env\n")),(0,r.kt)("h3",{id:"configmap--variables-de-configuration"},"ConfigMap : Variables de configuration"),(0,r.kt)("p",null,"Les variables qui configurent le projet dans l'environnement d\xe9ploy\xe9. Ces variables sont pr\xe9dictibles et non-chiffr\xe9es. Example : ",(0,r.kt)("inlineCode",{parentName:"p"},"NODE_ENV=PRODUCTION")),(0,r.kt)("p",null,"Il est recommand\xe9 d'utiliser une ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#configure-all-key-value-pairs-in-a-configmap-as-container-environment-variables"},(0,r.kt)("em",{parentName:"a"},"ConfigMap")," par container")," et par environnement."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'# .k8s/environements/dev/app-env.configmap.yaml\nkind: ConfigMap\napiVersion: v1\nmetadata:\n name: app-env\ndata:\n NODE_ENV: "production"\n GRAPHQL_ENDPOINT: "http://hasura/v1/graphql"\n ACCOUNT_MAIL_SENDER: "contact@fabrique.social.gouv.fr"\n FRONTEND_PORT: "${PORT}"\n PRODUCTION: "false"\n')),(0,r.kt)("h3",{id:"ingress--routing-vers-vos-applications"},"Ingress : routing vers vos applications"),(0,r.kt)("p",null,"Nos clusters fournissent le routing et les certificats SSL vers vos applications via un ",(0,r.kt)("inlineCode",{parentName:"p"},"nginx ingress controller"),"."),(0,r.kt)("p",null,"Chaque service expos\xe9 de votre application doit d\xe9clarer une ",(0,r.kt)("inlineCode",{parentName:"p"},"ingress rule")," sp\xe9cifique qui peut comporter des annotations sp\xe9cifiques pour cont\xf4ler les param\xe8tres nginx (redirections, auth, rate-limiting...). cf ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations"},"annotation ingress nginx"),"."),(0,r.kt)("p",null,"Pour les noms de domaines externes, cf ",(0,r.kt)("a",{parentName:"p",href:"/docs/faq#noms-de-domaines-externes"},"faq")),(0,r.kt)("h3",{id:"sealed-secrets--variables-secretes"},"Sealed-secrets : Variables secretes"),(0,r.kt)("p",null,"Les variables de configuration secretes qui doivent \xeatre chiffr\xe9es. Example : ",(0,r.kt)("inlineCode",{parentName:"p"},"JWT_SECRET=xxxxxxx")),(0,r.kt)("p",null,"Il est recommand\xe9 d'utiliser un ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/bitnami-labs/sealed-secrets"},(0,r.kt)("em",{parentName:"a"},"SealedSecret")," par container")," et par environnement."),(0,r.kt)("p",null,"L'\xe9quipe SRE est en charge de la gestion des valeurs dans le ",(0,r.kt)("em",{parentName:"p"},"SealedSecret")," utilis\xe9s par notre projet en dev comme en prod. Les valeurs de dev sont consultables par les d\xe9veloppeurs de la startup en r\xe9cup\xe9rant le ",(0,r.kt)("em",{parentName:"p"},"Secret")," du m\xeame nom."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-yaml"},'# .k8s/environements/dev/hasura-env.configmap.yaml\nkind: SealedSecret\napiVersion: bitnami.com/v1alpha1\nmetadata:\n name: hasura-env\n creationTimestamp:\n annotations:\n sealedsecrets.bitnami.com/cluster-wide: "true"\nspec:\n template:\n metadata:\n name: hasura-env\n creationTimestamp:\n annotations:\n sealedsecrets.bitnami.com/cluster-wide: "true"\n type: Opaque\n encryptedData:\n ACCOUNT_EMAIL_SECRET: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==\n HASURA_GRAPHQL_ADMIN_SECRET: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy==\n HASURA_GRAPHQL_JWT_SECRET: zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz==\n')),(0,r.kt)("h2",{id:"sceller-un-secret-dans-kubernetes"},"Sceller un secret dans Kubernetes"),(0,r.kt)("p",null,"Pour sceller un nouveau secret pour votre application, vous pouvez utiliser l'interface ",(0,r.kt)("a",{parentName:"p",href:"https://socialgouv.github.io/sre-tools"},"WebSeal")),(0,r.kt)("p",null,"Cette application permet de chiffrer votre secret (client-side) pour mettre \xe0 jour vos fichiers de sealed-secrets"),(0,r.kt)("p",null,"Deux cas possibles :"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"D\xe9veloppement")," : le secret est d\xe9chiffrable cluster-wide"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Production")," : le secret est d\xe9chiffrable uniquement pour un ",(0,r.kt)("inlineCode",{parentName:"li"},"namespace")," donn\xe9.")),(0,r.kt)("p",null,"Pour la ",(0,r.kt)("em",{parentName:"p"},"production")," pensez \xe0 bien \xe0 v\xe9rifier le ",(0,r.kt)("inlineCode",{parentName:"p"},"namespace")," et le ",(0,r.kt)("inlineCode",{parentName:"p"},"secret name")," sp\xe9cifi\xe9. Le ",(0,r.kt)("inlineCode",{parentName:"p"},"secret name")," est le nom du secret li\xe9 \xe0 l'application, par exemple ",(0,r.kt)("inlineCode",{parentName:"p"},"app"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"api")," ou ",(0,r.kt)("inlineCode",{parentName:"p"},"app-sealed-secret")," ; on peut trouver ce nom dans le champ ",(0,r.kt)("inlineCode",{parentName:"p"},"metadata.name")," du fichier de secret. Ce nom peut-\xeatre indiqu\xe9 dans les d\xe9ploiements (par exemple dans le fichier ",(0,r.kt)("inlineCode",{parentName:"p"},".kube-workflow/values.yaml"),", dans la partie ",(0,r.kt)("inlineCode",{parentName:"p"},"envFrom.secretRef")," pour inclure les secrets d\xe9chiffr\xe9s dans l'environnement d'un container)."),(0,r.kt)("p",null,"Copiez-collez ensuite le secret chiffr\xe9 dans votre fichier de sealed-secrets pour le mettre \xe0 jour."),(0,r.kt)("p",null,"L'\xe9quipe SRE est \xe0 votre disposition pour vous aider dans cette d\xe9marche"),(0,r.kt)("h2",{id:"tester-la-validit\xe9-dun-sealed-secret"},"Tester la validit\xe9 d'un sealed-secret"),(0,r.kt)("p",null,"Avant d'envoyer un sealed-secret sur le cluster, il est utile de v\xe9rifier qu'il soit bien chiffr\xe9."),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"kubectl --context dev apply -f ./environments/dev/some.sealed-secret.yml")),(0,r.kt)("p",null,"Ensuite, v\xe9rifier dans rancher ou k9s qu'un ",(0,r.kt)("inlineCode",{parentName:"p"},"Secret")," avec les bonnes valeurs a bien \xe9t\xe9 cr\xe9\xe9 dans le bon namespace."),(0,r.kt)("p",null,"\u26a0\ufe0f ceci va \xe9craser l'\xe9ventuel secret du meme namespace/nom existant. pensez \xe0 changer le nom du secret si besoin"),(0,r.kt)("p",null,"\u26a0\ufe0f La manip n'est pas forc\xe9ment possible en prod, car cela \xe9craserait le secret existant. une possibilit\xe9 est de renommer les cl\xe9s du secret pour ne pas impacter les cl\xe9s existantes."),(0,r.kt)("h2",{id:"synth\xe8se-des-attentes"},"Synth\xe8se des attentes"),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"left"},"Niveau"),(0,r.kt)("th",{parentName:"tr",align:"left"},"Recommandation"))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les logs sont envoy\xe9s vers les sorties standard ",(0,r.kt)("inlineCode",{parentName:"td"},"STDOUT")," ou ",(0,r.kt)("inlineCode",{parentName:"td"},"STDERR"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les logs sont envoy\xe9s au format ",(0,r.kt)("inlineCode",{parentName:"td"},"JSON")," et ",(0,r.kt)("inlineCode",{parentName:"td"},"single-line"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les m\xe9triques applicatives sont expos\xe9s sur un endpoint ",(0,r.kt)("inlineCode",{parentName:"td"},"/metrics"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les valeurs de CPU ",(0,r.kt)("inlineCode",{parentName:"td"},"requests")," et ",(0,r.kt)("inlineCode",{parentName:"td"},"limits")," doivent \xeatre renseign\xe9es")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Les valeurs de RAM ",(0,r.kt)("inlineCode",{parentName:"td"},"requests")," et ",(0,r.kt)("inlineCode",{parentName:"td"},"limits")," doivent \xeatre renseign\xe9es")),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Le HPA doit \xeatre activ\xe9 et param\xe9tr\xe9 avec des valeurs ",(0,r.kt)("inlineCode",{parentName:"td"},"min=1"),", ",(0,r.kt)("inlineCode",{parentName:"td"},"max=10"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"left"},"Obligation"),(0,r.kt)("td",{parentName:"tr",align:"left"},"Au moins une route de healthcheck doit \xeatre impl\xe9ment\xe9e (ex: /healthz)")))))}d.isMDXComponent=!0},4134:(e,t,n)=>{n.d(t,{Z:()=>a});const a=n.p+"assets/images/kubernetes-big-picture-5408d8189624d4b27155b2bd4f607ebf.png"}}]); \ No newline at end of file diff --git a/assets/js/main.1dbc2a26.js b/assets/js/main.6aadb150.js similarity index 99% rename from assets/js/main.1dbc2a26.js rename to assets/js/main.6aadb150.js index c9b44b81..2222d246 100644 --- a/assets/js/main.1dbc2a26.js +++ b/assets/js/main.6aadb150.js @@ -1,2 +1,2 @@ -/*! For license information please see main.1dbc2a26.js.LICENSE.txt */ -(self.webpackChunksupport=self.webpackChunksupport||[]).push([[179],{4334:(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";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";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,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"0480b142":[()=>n.e(836).then(n.bind(n,3584)),"@site/docs/faq.md",3584],17896441:[()=>Promise.all([n.e(532),n.e(918)]).then(n.bind(n,4700)),"@theme/DocItem",4700],"1a4e3797":[()=>Promise.all([n.e(532),n.e(920)]).then(n.bind(n,2027)),"@theme/SearchPage",2027],"1be78505":[()=>Promise.all([n.e(532),n.e(514)]).then(n.bind(n,9963)),"@theme/DocPage",9963],"1df93b7f":[()=>Promise.all([n.e(532),n.e(237)]).then(n.bind(n,2172)),"@site/src/pages/index.tsx",2172],"1fa8b2fe":[()=>n.e(141).then(n.bind(n,153)),"@site/docs/infrastructure/emails.md",153],"2781c96e":[()=>n.e(200).then(n.bind(n,4919)),"@site/docs/infrastructure/presentation.md",4919],"519775cc":[()=>n.e(404).then(n.bind(n,9693)),"@site/docs/infrastructure/pra.md",9693],"5b552386":[()=>n.e(482).then(n.bind(n,6122)),"@site/docs/standards/developpement.md",6122],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"732ae5b5":[()=>n.e(225).then(n.t.bind(n,3769,19)),"/home/runner/work/support/support/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"82bf77b1":[()=>n.e(671).then(n.bind(n,209)),"@site/docs/workshops/kubernetes.md",209],"90f56255":[()=>n.e(892).then(n.bind(n,2016)),"@site/docs/standards/docker.md",2016],"92618ec8":[()=>n.e(465).then(n.t.bind(n,2776,19)),"/home/runner/work/support/support/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",2776],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],a5a67c7b:[()=>n.e(771).then(n.bind(n,1243)),"@site/docs/standards/securite.md",1243],a92590ce:[()=>n.e(64).then(n.bind(n,4148)),"@site/docs/standards/accessibilite.md",4148],c5351b0c:[()=>n.e(719).then(n.bind(n,5862)),"@site/docs/init/accueil-produits.md",5862],ca00fb9f:[()=>n.e(91).then(n.bind(n,4061)),"@site/docs/standards/mobile.md",4061],d1347035:[()=>n.e(9).then(n.bind(n,1310)),"@site/docs/workshops/index.md",1310],d138369b:[()=>n.e(250).then(n.bind(n,4220)),"@site/docs/init/presentation.md",4220],d33af5b6:[()=>n.e(893).then(n.bind(n,1356)),"@site/docs/standards/kubernetes.md",1356],da1e00bf:[()=>n.e(763).then(n.bind(n,8131)),"@site/docs/standards/tests.md",8131],de081de7:[()=>n.e(312).then(n.bind(n,3175)),"@site/docs/init/fonctionnement.md",3175],f32e9934:[()=>n.e(147).then(n.bind(n,6411)),"@site/docs/standards/databases.md",6411],f6e0a9d3:[()=>n.e(529).then(n.t.bind(n,5745,19)),"/home/runner/work/support/support/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745]};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:"/support/search",component:f("/support/search","921"),exact:!0},{path:"/support/docs",component:f("/support/docs","ef4"),routes:[{path:"/support/docs/faq",component:f("/support/docs/faq","bc6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/infrastructure/emails",component:f("/support/docs/infrastructure/emails","7c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/infrastructure/pra",component:f("/support/docs/infrastructure/pra","090"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/infrastructure/presentation",component:f("/support/docs/infrastructure/presentation","039"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/init/accueil-produits",component:f("/support/docs/init/accueil-produits","8ca"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/init/fonctionnement",component:f("/support/docs/init/fonctionnement","3ac"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/init/presentation",component:f("/support/docs/init/presentation","f79"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/accessibilite",component:f("/support/docs/standards/accessibilite","c5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/databases",component:f("/support/docs/standards/databases","739"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/developpement",component:f("/support/docs/standards/developpement","544"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/docker",component:f("/support/docs/standards/docker","091"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/kubernetes",component:f("/support/docs/standards/kubernetes","9a4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/mobile",component:f("/support/docs/standards/mobile","63f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/securite",component:f("/support/docs/standards/securite","cd5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/standards/tests",component:f("/support/docs/standards/tests","143"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/workshops/",component:f("/support/docs/workshops/","e36"),exact:!0,sidebar:"tutorialSidebar"},{path:"/support/docs/workshops/kubernetes",component:f("/support/docs/workshops/kubernetes","24c"),exact:!0}]},{path:"/support/",component:f("/support/","9a1"),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)}},7221:(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(8780),S=n(197);function x(){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 _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,h.Z)(),{pathname:r}=(0,c.TH)();return e+(0,E.applyTrailingSlash)((0,g.Z)(r),{trailingSlash:n,baseUrl: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(_,null),r.createElement(x,null),r.createElement(S.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 L(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),P=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&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:a}),R("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=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}),O(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(N,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const D=I,M="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",B="__docusaurus-base-url-issue-banner-suggestion-container",j="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return`\nwindow['${j}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${j}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

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

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[j]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:M}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement($,null):null}function q(){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),G=n(2389);function Q(){const e=(0,G.Z)();return r.createElement(m.Z,null,r.createElement("html",{"data-has-hydrated":e}))}function Z(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(H.Z,null,r.createElement(P.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement(q,null),r.createElement(C,null),r.createElement(U,null),r.createElement(D,{location:L(t)},e)),r.createElement(Q,null))))}var V=n(6887);const W=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 K=n(9670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(V).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee);if(l.Z.canUseDOM){window.docusaurus=te;const e=a.hydrate;O(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(Z,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":"/support/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/support/docs","mainDocId":"init/presentation","docs":[{"id":"faq","path":"/support/docs/faq","sidebar":"tutorialSidebar"},{"id":"infrastructure/emails","path":"/support/docs/infrastructure/emails","sidebar":"tutorialSidebar"},{"id":"infrastructure/pra","path":"/support/docs/infrastructure/pra","sidebar":"tutorialSidebar"},{"id":"infrastructure/presentation","path":"/support/docs/infrastructure/presentation","sidebar":"tutorialSidebar"},{"id":"init/accueil-produits","path":"/support/docs/init/accueil-produits","sidebar":"tutorialSidebar"},{"id":"init/fonctionnement","path":"/support/docs/init/fonctionnement","sidebar":"tutorialSidebar"},{"id":"init/presentation","path":"/support/docs/init/presentation","sidebar":"tutorialSidebar"},{"id":"standards/accessibilite","path":"/support/docs/standards/accessibilite","sidebar":"tutorialSidebar"},{"id":"standards/databases","path":"/support/docs/standards/databases","sidebar":"tutorialSidebar"},{"id":"standards/developpement","path":"/support/docs/standards/developpement","sidebar":"tutorialSidebar"},{"id":"standards/docker","path":"/support/docs/standards/docker","sidebar":"tutorialSidebar"},{"id":"standards/kubernetes","path":"/support/docs/standards/kubernetes","sidebar":"tutorialSidebar"},{"id":"standards/mobile","path":"/support/docs/standards/mobile","sidebar":"tutorialSidebar"},{"id":"standards/securite","path":"/support/docs/standards/securite","sidebar":"tutorialSidebar"},{"id":"standards/tests","path":"/support/docs/standards/tests","sidebar":"tutorialSidebar"},{"id":"workshops/index","path":"/support/docs/workshops/","sidebar":"tutorialSidebar"},{"id":"workshops/kubernetes","path":"/support/docs/workshops/kubernetes"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/support/docs/init/presentation","label":"init/presentation"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"fr","locales":["fr"],"path":"i18n","currentLocale":"fr","localeConfigs":{"fr":{"label":"Fran\xe7ais","direction":"ltr","htmlLang":"fr","calendar":"gregory","path":"fr"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.4.3","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.4.3"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.4.3"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.4.3"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.4.3"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.4.3"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.40.1"}}}'),u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),a=n(412),o=n(5742),i=n(8780),l=n(5924);function s(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"}},r.createElement("h1",{style:{fontSize:"3rem"}},"This page crashed"),r.createElement("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"}},"Try again"),r.createElement(u,{error:t}))}function u(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{style:{whiteSpace:"pre-wrap"}},n)}function c(e){let{error:t,tryAgain:n}=e;return r.createElement(f,{fallback:()=>r.createElement(s,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(l.Z,null,r.createElement(s,{error:t,tryAgain:n})))}const d=e=>r.createElement(c,e);class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??d)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),u=n(412);const c=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){let{isNavLink:n,to:f,href:p,activeClassName:m,isActive: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 _=(0,s.Z)(x),C=x?.replace("pathname://","");let T=void 0!==C?(L=C,v&&(e=>e.startsWith("/"))(L)?k(L):L):void 0;var L;T&&_&&(T=(0,i.applyTrailingSlash)(T,{trailingSlash:y,baseUrl:w}));const A=(0,a.useRef)(!1),P=n?o.OL:o.rU,R=u.Z.canUseIntersectionObserver,N=(0,a.useRef)(),O=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,a.useEffect)((()=>(!R&&_&&null!=T&&window.docusaurus.prefetch(T),()=>{R&&N.current&&N.current.disconnect()})),[N,T,R,_]);const I=T?.startsWith("#")??!1,D=!T||!_||I;return D||g||E.collectLink(T),D?a.createElement("a",(0,r.Z)({ref:S,href:T},x&&!_&&{target:"_blank",rel:"noopener noreferrer"},b)):a.createElement(P,(0,r.Z)({},b,{onMouseEnter:O,onTouchStart:O,innerRef:e=>{S.current=e,R&&e&&_&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T},n&&{isActive:h,activeClassName:m}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),a=n(2263),o=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},8084:(e,t,n)=>{"use strict";n.d(t,{OD:()=>o,eZ:()=>i});var r=n(2263),a=n(9935);function o(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,r.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}function i(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=o(e),i=r?.[t];if(!i&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return i}},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)}},4104:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>p,gA:()=>c,_r:()=>s,Jo:()=>m,zh:()=>u,yW:()=>f,gB:()=>d});var r=n(6550),a=n(8084);const o=e=>e.versions.find((e=>e.isLast));function i(e,t){const n=function(e,t){const n=o(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 l={},s=()=>(0,a.OD)("docusaurus-plugin-content-docs")??l,u=e=>(0,a.eZ)("docusaurus-plugin-content-docs",e,{failfast:!0});function c(e){void 0===e&&(e={});const t=s(),{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 d(e){return u(e).versions}function f(e){const t=u(e);return o(t)}function p(e){const t=u(e),{pathname:n}=(0,r.TH)();return i(t,n)}function m(e){const t=u(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=o(e);return{latestDocSuggestion:i(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"}))}},5924:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ft});var r=n(7294),a=n(4334),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 _={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}}))}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:T.announcementBar,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:T.announcementBarPlaceholder}),r.createElement(C,{className:T.announcementBarContent}),i&&r.createElement(x,{onClick:n,className:T.announcementBarClose}))}var A=n(2961),P=n(2466);var R=n(902),N=n(3102);const O=r.createContext(null);function I(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,N.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,R.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 R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,N.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 $(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 U={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:o,onChange:i}=e;const l=(0,j.Z)(),s=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===o?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(U.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!l&&U.toggleButtonDisabled,n),type:"button",onClick:()=>i("dark"===o?"light":"dark"),disabled:!l,title:s,"aria-label":s,"aria-live":"polite"},r.createElement(z,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),r.createElement($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})))}const H=r.memo(q),G={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Q(e){let{className:t}=e;const n=(0,w.L)().navbar.style,a=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:i}=(0,B.I)();return a?null:r.createElement(H,{className:t,buttonClassName:"dark"===n?G.darkNavbarColorModeToggle:void 0,value:o,onChange:i})}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,A.e)();return r.createElement("button",{type:"button","aria-label":(0,u.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(E,{color:"var(--ifm-color-emphasis-600)"}))}function K(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(V,null),r.createElement(Q,{className:"margin-right--md"}),r.createElement(W,null))}var Y=n(9960),X=n(4996),J=n(3919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:u,prependBaseUrlToHref:c,...d}=e;const f=(0,X.Z)(a),p=(0,X.Z)(t),m=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,J.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(te.Z,u&&{width:12,height:12}))};return o?r.createElement(Y.Z,(0,l.Z)({href:c?m:o},d,g)):r.createElement(Y.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},d,g))}function re(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ne,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ae(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ne,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function oe(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ae:re;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var ie=n(6043),le=n(8596),se=n(2263);function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ce(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c})},r.createElement(ne,(0,l.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,t)=>r.createElement(Ke,(0,l.Z)({isDropdownItem:!0,activeClassName:"dropdown__link--active"},e,{key:t}))))))}function de(e){let{items:t,className:n,position:o,onClick:i,...u}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[c,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ne,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},u,{onClick:e=>{e.preventDefault(),p()}}),u.children??u.label),r.createElement(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Ke,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function fe(e){let{mobile:t=!1,...n}=e;const a=t?de:ce;return r.createElement(a,n)}var pe=n(4711);function me(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const he="iconLanguage_nlXk";var ge=n(1029),ve=n(1728),be=n(373),ye=n(8084);const we={},ke=()=>(0,ye.OD)("docusaurus-plugin-content-docs")??we;function Ee(e){void 0===e&&(e={});const t=ke(),{pathname:n}=(0,s.TH)();return function(e,t,n){void 0===n&&(n={});const r=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,s.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!a&&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 a}(t,n,e)}var Se=n(22),xe=n(8202),_e=n(3926),Ce=n(1073),Te=n(2539),Le=n(726);const Ae='',Pe='',Re='',Ne='',Oe='',Ie='',De='',Me={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Fe(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:l}=e;const s=0===n,u=1===n,c=[];i?c.push(Ie):l&&c.push(De);const d=c.map((e=>`${e}`)),f=`${s?Ae:u?Pe:Re}`,p=[`${(0,Le.o)(t.t,(0,Ce.m)(a,"t"),o)}`];if(!i&&!l&&ge.H6){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;p.push(`${(0,_e.e)(e??[])}`)}else s||p.push(`${(0,Te.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const m=`${Ne}`;return[...d,f,``,...p,"",m].join("")}function Be(){return`${Oe}${(0,u.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var je=n(311),ze=n(51);async function $e(){const e=await Promise.all([n.e(443),n.e(525)]).then(n.t.bind(n,8443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const Ue="_highlight";const qe=function(e){let{handleSearchBarToggle:t}=e;const n=(0,j.Z)(),{siteConfig:{baseUrl:a},i18n:{currentLocale:o}}=(0,se.Z)(),i=Ee();let l=a;try{const{preferredVersion:e}=(0,be.J)(i?.pluginId??ge.gQ);e&&!e.isLast&&(l=e.path+"/")}catch(M){if(ge.l9&&!(M instanceof R.i6))throw M}const c=(0,s.k6)(),d=(0,s.TH)(),f=(0,r.useRef)(null),p=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[h,g]=(0,r.useState)(!1),[v,b]=(0,r.useState)(!1),[y,w]=(0,r.useState)(""),k=(0,r.useRef)(null),E=(0,r.useRef)(""),[S,x]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(ge.Kc))return;let e="";if(d.pathname.startsWith(l)){const t=d.pathname.substring(l.length);let n;for(const e of ge.Kc){const r="string"==typeof e?e:e.path;if(t===r||t.startsWith(`${r}/`)){n=r;break}}n&&(e=n)}E.current!==e&&(p.current.delete(e),E.current=e),x(e)}),[d.pathname,l]);const _=!!ge.hG&&Array.isArray(ge.Kc)&&""===S,C=(0,r.useCallback)((async()=>{if(_||p.current.get(S))return;p.current.set(S,"loading"),k.current?.autocomplete.destroy(),g(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,Se.w)(l,S),$e()]);if(k.current=n(f.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ve.Z)(Me.searchBar,{[Me.searchBarLeft]:"left"===ge.pu}),noPrefix:!0,dropdownMenu:Me.dropdownMenu,input:Me.input,hint:Me.hint,suggestions:Me.suggestions,suggestion:Me.suggestion,cursor:Me.cursor,dataset:Me.dataset,empty:Me.empty}},[{source:(0,xe.v)(e,t,ge.qo),templates:{suggestion:Fe,empty:Be,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&(!S||!ge.pQ))return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),i=new URLSearchParams;let s;if(i.set("q",t),S){const e=S&&Array.isArray(ge.Kc)?ge.Kc.find((e=>"string"==typeof e?e===S:e.path===S)):S,t=e?(0,ze._)(e,o).label:S;s=ge.pQ&&n?(0,u.I)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:t}):(0,u.I)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:t})}else s=(0,u.I)({id:"theme.SearchBar.seeAll",message:"See all results"});if(!S||!Array.isArray(ge.Kc)||ge.pQ&&n||i.set("ctx",S),l!==a){if(!l.startsWith(a))throw new Error(`Version url '${l}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);i.set("version",l.substring(a.length))}const d=`${a}search?${i.toString()}`;return r.href=d,r.textContent=s,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),k.current?.autocomplete.close(),c.push(d))})),r})({query:t,isEmpty:n}),i=document.createElement("div");return i.className=Me.hitFooter,i.appendChild(r),i}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;f.current?.blur();let o=n;if(ge.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(Ue,t);o+=`?${e.toString()}`}r&&(o+=r),c.push(o)})).on("autocomplete:closed",(()=>{f.current?.blur()})),p.current.set(S,"done"),g(!1),m.current){const e=f.current;e.value&&k.current?.autocomplete.open(),e.focus()}}),[_,S,l,a,c]);(0,r.useEffect)((()=>{if(!ge.vc)return;const e=n?new URLSearchParams(d.search).getAll(Ue):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new ge.vc(t);n.unmark(),0!==e.length&&n.mark(e),w(e.join(" ")),k.current?.autocomplete.setVal(e.join(" "))}))}),[n,d.search,d.pathname]);const[T,L]=(0,r.useState)(!1),A=(0,r.useCallback)((()=>{m.current=!0,C(),L(!0),t?.(!0)}),[t,C]),P=(0,r.useCallback)((()=>{L(!1),t?.(!1)}),[t]),N=(0,r.useCallback)((()=>{C()}),[C]),O=(0,r.useCallback)((e=>{w(e.target.value),e.target.value&&b(!0)}),[]),I=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!ge.AY)return;const e=e=>{!(I?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),f.current?.focus(),A())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[I,A]);const D=(0,r.useCallback)((()=>{const e=new URLSearchParams(d.search);e.delete(Ue);const t=e.toString(),n=d.pathname+(""!=t?`?${t}`:"")+d.hash;n!=d.pathname+d.search+d.hash&&c.push(n),w(""),k.current?.autocomplete.setVal("")}),[d.pathname,d.search,d.hash,c]);return r.createElement("div",{className:(0,ve.Z)("navbar__search",Me.searchBarContainer,{[Me.searchIndexLoading]:h&&v,[Me.focused]:T}),hidden:_},r.createElement("input",{placeholder:(0,u.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:N,onFocus:A,onBlur:P,onChange:O,ref:f,value:y}),r.createElement(je.Z,{className:Me.searchBarLoadingRing}),ge.AY&&ge.t_&&(""!==y?r.createElement("button",{className:Me.searchClearButton,onClick:D},"\u2715"):n&&r.createElement("div",{className:Me.searchHintContainer},r.createElement("kbd",{className:Me.searchHint},I?"\u2318":"ctrl"),r.createElement("kbd",{className:Me.searchHint},"K"))))},He={searchBox:"searchBox_ZlJk"};function Ge(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,He.searchBox)},t)}var Qe=n(4104),Ze=n(2802);const Ve=e=>e.docs.find((t=>t.id===e.mainDocId));const We={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),f=(0,pe.l)(),{search:p,hash:m}=(0,s.TH)(),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(fe,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(me,{className:he}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Ge,{className:n},r.createElement(qe,null))},dropdown:fe,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Qe.Iw)(a),s=(0,Ze.vY)(t,a);return null===s?null:r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.path===s.path||!!i?.sidebar&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,Qe.Iw)(a),s=(0,Ze.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(oe,(0,l.Z)({exact:!0},o,{isActive:()=>i?.sidebar===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Ze.lO)(a)[0],s=t??i.label,u=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(oe,(0,l.Z)({},o,{label:s,to:u}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...c}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,Qe.Iw)(n),m=(0,Qe.gB)(n),{savePreferredVersionName:h}=(0,be.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??Ve(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],v=(0,Ze.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:Ve(v).path;return g.length<=1?r.createElement(oe,(0,l.Z)({},c,{mobile:t,label:b,to:y,isActive:a?()=>!1:void 0})):r.createElement(fe,(0,l.Z)({},c,{mobile:t,label:b,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Ke(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=We[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ye(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ke,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Xe(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 Je(){const e=0===(0,w.L)().navbar.items.length,t=M();return r.createElement(r.Fragment,null,!e&&r.createElement(Xe,{onClick:()=>t.hide()}),t.content)}function et(){const e=(0,A.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(F,{header:r.createElement(K,null),primaryMenu:r.createElement(Ye,null),secondaryMenu:r.createElement(Je,null)}):null}const tt={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function nt(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function rt(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,P.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,"aria-label":(0,u.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[tt.navbarHideable,!s&&tt.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(nt,{onClick:i.toggle}),r.createElement(et,null))}var at=n(8780);const ot={errorBoundaryError:"errorBoundaryError_a6uf"};function it(e){return r.createElement("button",(0,l.Z)({type:"button"},e),r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error"},"Try again"))}function lt(e){let{error:t}=e;const n=(0,at.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return r.createElement("p",{className:ot.errorBoundaryError},n)}class st extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const ut="right";function ct(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 dt(){const{toggle:e,shown:t}=(0,A.e)();return r.createElement("button",{onClick:e,"aria-label":(0,u.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(ct,null))}const ft={colorModeToggle:"colorModeToggle_DEke"};function pt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(st,{key:t,onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t})},r.createElement(Ke,e)))))}function mt(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 ht(){const e=(0,A.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??ut)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(mt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(dt,null),r.createElement(V,null),r.createElement(pt,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(pt,{items:a}),r.createElement(Q,{className:ft.colorModeToggle}),!o&&r.createElement(Ge,null,r.createElement(qe,null)))})}function gt(){return r.createElement(rt,null,r.createElement(ht,null))}function vt(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,u=(0,X.Z)(n),c=(0,X.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(Y.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?c:a}:{to:u},s),o,a&&!(0,J.Z)(a)&&r.createElement(te.Z,null))}function bt(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(vt,{item:t}))}function yt(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(bt,{key:t,item:e})))))}function wt(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(yt,{key:t,column:e}))))}function kt(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function Et(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(vt,{item:t})}function St(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(Et,{item:e}),t.length!==n+1&&r.createElement(kt,null))))))}function xt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(wt,{columns:t}):r.createElement(St,{links:t})}var _t=n(941);const Ct={footerLogoLink:"footerLogoLink_BH7S"};function Tt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(_t.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function Lt(e){let{logo:t}=e;return t.href?r.createElement(Y.Z,{href:t.href,className:Ct.footerLogoLink,target:t.target},r.createElement(Tt,{logo:t})):r.createElement(Tt,{logo:t})}function At(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Pt(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 Rt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Pt,{style:o,links:n&&n.length>0&&r.createElement(xt,{links:n}),logo:a&&r.createElement(Lt,{logo:a}),copyright:t&&r.createElement(At,{copyright:t})})}const Nt=r.memo(Rt),Ot=(0,R.Qc)([B.S,k.pl,P.OC,be.L5,i.VC,function(e){let{children:t}=e;return r.createElement(N.n2,null,r.createElement(A.M,null,r.createElement(I,null,t)))}]);function It(e){let{children:t}=e;return r.createElement(Ot,null,t)}function Dt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("div",{className:"margin-vert--lg"},r.createElement(it,{onClick:n,className:"button button--primary shadow--lw"})),r.createElement("hr",null),r.createElement("div",{className:"margin-vert--md"},r.createElement(lt,{error:t})))))}const Mt={mainWrapper:"mainWrapper_z2l0"};function Ft(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:u}=e;return(0,v.t)(),r.createElement(It,null,r.createElement(i.d,{title:s,description:u}),r.createElement(y,null),r.createElement(L,null),r.createElement(gt,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,Mt.mainWrapper,l)},r.createElement(o.Z,{fallback:e=>r.createElement(Dt,e)},t)),!n&&r.createElement(Nt,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(4334),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],c)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,z:()=>g});var r=n(7462),a=n(7294),o=n(412),i=n(1442);const l="ease-in-out";function s(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},c={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?u:c;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=r?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${r?.easing??l}`,height:`${t}px`}}function s(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return d(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function p(e){if(!o.Z.canUseDOM)return e?u:c}function m(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const u=(0,a.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),a.createElement(t,{ref:u,style:s?void 0:p(n),onTransitionEnd:e=>{"height"===e.propertyName&&(d(u.current,n),i?.(n))},className:l},r)}function h(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(m,(0,r.Z)({},n,{collapsed:l})):null}function g(e){let{lazy:t,...n}=e;const r=t?h:m;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.WA)("docusaurus.announcement.dismiss"),u=(0,o.WA)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>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.WA)(u),d={light:"light",dark:"dark"},f=e=>e===d.dark?d.dark:d.light,p=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{c.set(f(e))};function 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(4104),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.WA)(c(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(c(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(c(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const p=r.createContext(null);function m(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=d.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(d.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function 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(1688),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:{}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},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(4104),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(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).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(`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(7459),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,{WA:()=>s});n(7294),n(1688);const r="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function o(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,i||(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),i=!0),null}var t}let i=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function s(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(e);const n=o(t?.persistence);return null===n?l:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),a=n(6550),o=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),c=l===i?e:e.replace(`/${l}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},4143:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294),a=n(1728);const o={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};function i(e){let{className:t}=e;return r.createElement("div",{className:(0,a.Z)(o.loadingRing,t)},r.createElement("div",null),r.createElement("div",null),r.createElement("div",null),r.createElement("div",null))}},22:(e,t,n)=>{"use strict";n.d(t,{w:()=>l});var r=n(1336),a=n.n(r),o=n(1029);const i=new Map;function l(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),l=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(l)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},8202:(e,t,n)=>{"use strict";n.d(t,{v:()=>s});var r=n(1336),a=n.n(r);var o=n(1029);function i(e){return l(e).concat(l(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function l(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function s(e,t,n){return function(r,l){const s=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===s.length)return void l([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const l of t)if(r.substr(0,l.length)===l){const t={missed:a.missed,term:a.term.concat({value:l})};r.length>l.length?e(r.substr(l.length),t):n.push(t),i=!0}else for(let t=l.length-1;t>o;t-=1){const s=l.substr(0,t);if(r.substr(0,t)===s){o=t;const l={missed:a.missed,term:a.term.concat({value:s,trailing:!0})};r.length>t?e(r.substr(t),l):n.push(l),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let l;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);l=[];const t=[];for(const r of n){const n=e(r);l.push(n),n.length0&&t.push(n)}n.push(...t)}else l=n.slice();const s=[];for(const a of l)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)s.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(s))}(s,t),c=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(c.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},1690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},1073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},2539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(1690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const l=n+i.length;l${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},726:(e,t,n)=>{"use strict";n.d(t,{o:()=>s});var r=n(1690),a=n(2539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var l=n(1029);function s(e,t,n,o){void 0===o&&(o=l.Hk);const{chunkIndex:s,chunks:u}=function(e,t,n){const o=[];let l=0,s=0,u=-1;for(;ls){const t=i(e.substring(s,c)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===u&&(u=o.length),s=c+d,o.push({html:(0,a.C)(e.substring(c,s),n,!0),textLength:d})}}if(s({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:u,chunks:o}}(e,t,n),c=u.slice(0,s),d=u[s],f=[d.html],p=u.slice(s+1);let m=d.textLength,h=0,g=0,v=!1,b=!1;for(;m0){const e=c.pop();m+e.textLength<=o?(f.unshift(e.html),h+=e.textLength,m+=e.textLength):(v=!0,c.length=0)}else{if(!(p.length>0))break;{const e=p.shift();m+e.textLength<=o?(f.push(e.html),g+=e.textLength,m+=e.textLength):(b=!0,p.length=0)}}return(v||c.length>0)&&f.unshift("\u2026"),(b||p.length>0)&&f.push("\u2026"),f.join("")}},51:(e,t,n)=>{"use strict";function r(e,t){if("string"==typeof e)return{label:e,path:e};{const{label:n,path:r}=e;return"string"==typeof n?{label:n,path:r}:Object.prototype.hasOwnProperty.call(n,t)?{label:n[t],path:r}:{label:r,path:r}}}n.d(t,{_:()=>r})},1029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>l,gQ:()=>h,H6:()=>d,hG:()=>b,l9:()=>g,dK:()=>o,_k:()=>i,pu:()=>m,AY:()=>f,t_:()=>p,Kc:()=>v,J:()=>s,Hk:()=>c,qo:()=>u,pQ:()=>y});var r=n(1336),a=n.n(r);n(892)(a()),n(2724)(a()),n(4182)(a());const o=["en","fr"],i=!1,l=null,s="search-index{dir}.json?_=bf41adbf",u=8,c=50,d=!1,f=!0,p=!0,m="right",h=void 0,g=!0,v=null,b=!1,y=!1},9318:(e,t,n)=>{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(8776);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,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)}},2724:function(e,t,n){var r,a;void 0===(a="function"==typeof(r=function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var t,n,r;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-z\xaa\xba\xc0-\xd6\xd8-\xf6\xf8-\u02b8\u02e0-\u02e4\u1d00-\u1d25\u1d2c-\u1d5c\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1dbe\u1e00-\u1eff\u2071\u207f\u2090-\u209c\u212a\u212b\u2132\u214e\u2160-\u2188\u2c60-\u2c7f\ua722-\ua787\ua78b-\ua7ad\ua7b0-\ua7b7\ua7f7-\ua7ff\uab30-\uab5a\uab5c-\uab64\ufb00-\ufb06\uff21-\uff3a\uff41-\uff5a",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(t=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,r=new function(){var e,r,a,o=[new t("col",-1,-1),new t("par",-1,-1),new t("tap",-1,-1)],i=[new t("",-1,4),new t("I",0,1),new t("U",0,2),new t("Y",0,3)],l=[new t("iqU",-1,3),new t("abl",-1,3),new t("I\xe8r",-1,4),new t("i\xe8r",-1,4),new t("eus",-1,2),new t("iv",-1,1)],s=[new t("ic",-1,2),new t("abil",-1,1),new t("iv",-1,3)],u=[new t("iqUe",-1,1),new t("atrice",-1,2),new t("ance",-1,1),new t("ence",-1,5),new t("logie",-1,3),new t("able",-1,1),new t("isme",-1,1),new t("euse",-1,11),new t("iste",-1,1),new t("ive",-1,8),new t("if",-1,8),new t("usion",-1,4),new t("ation",-1,2),new t("ution",-1,4),new t("ateur",-1,2),new t("iqUes",-1,1),new t("atrices",-1,2),new t("ances",-1,1),new t("ences",-1,5),new t("logies",-1,3),new t("ables",-1,1),new t("ismes",-1,1),new t("euses",-1,11),new t("istes",-1,1),new t("ives",-1,8),new t("ifs",-1,8),new t("usions",-1,4),new t("ations",-1,2),new t("utions",-1,4),new t("ateurs",-1,2),new t("ments",-1,15),new t("ements",30,6),new t("issements",31,12),new t("it\xe9s",-1,7),new t("ment",-1,15),new t("ement",34,6),new t("issement",35,12),new t("amment",34,13),new t("emment",34,14),new t("aux",-1,10),new t("eaux",39,9),new t("eux",-1,1),new t("it\xe9",-1,7)],c=[new t("ira",-1,1),new t("ie",-1,1),new t("isse",-1,1),new t("issante",-1,1),new t("i",-1,1),new t("irai",4,1),new t("ir",-1,1),new t("iras",-1,1),new t("ies",-1,1),new t("\xeemes",-1,1),new t("isses",-1,1),new t("issantes",-1,1),new t("\xeetes",-1,1),new t("is",-1,1),new t("irais",13,1),new t("issais",13,1),new t("irions",-1,1),new t("issions",-1,1),new t("irons",-1,1),new t("issons",-1,1),new t("issants",-1,1),new t("it",-1,1),new t("irait",21,1),new t("issait",21,1),new t("issant",-1,1),new t("iraIent",-1,1),new t("issaIent",-1,1),new t("irent",-1,1),new t("issent",-1,1),new t("iront",-1,1),new t("\xeet",-1,1),new t("iriez",-1,1),new t("issiez",-1,1),new t("irez",-1,1),new t("issez",-1,1)],d=[new t("a",-1,3),new t("era",0,2),new t("asse",-1,3),new t("ante",-1,3),new t("\xe9e",-1,2),new t("ai",-1,3),new t("erai",5,2),new t("er",-1,2),new t("as",-1,3),new t("eras",8,2),new t("\xe2mes",-1,3),new t("asses",-1,3),new t("antes",-1,3),new t("\xe2tes",-1,3),new t("\xe9es",-1,2),new t("ais",-1,3),new t("erais",15,2),new t("ions",-1,1),new t("erions",17,2),new t("assions",17,3),new t("erons",-1,2),new t("ants",-1,3),new t("\xe9s",-1,2),new t("ait",-1,3),new t("erait",23,2),new t("ant",-1,3),new t("aIent",-1,3),new t("eraIent",26,2),new t("\xe8rent",-1,2),new t("assent",-1,3),new t("eront",-1,2),new t("\xe2t",-1,3),new t("ez",-1,2),new t("iez",32,2),new t("eriez",33,2),new t("assiez",33,3),new t("erez",32,2),new t("\xe9",-1,2)],f=[new t("e",-1,3),new t("I\xe8re",0,2),new t("i\xe8re",0,2),new t("ion",-1,1),new t("Ier",-1,2),new t("ier",-1,2),new t("\xeb",-1,4)],p=[new t("ell",-1,-1),new t("eill",-1,-1),new t("enn",-1,-1),new t("onn",-1,-1),new t("ett",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],h=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],g=new n;function v(e,t,n){return!(!g.eq_s(1,e)||(g.ket=g.cursor,!g.in_grouping(m,97,251))||(g.slice_from(t),g.cursor=n,0))}function b(e,t,n){return!!g.eq_s(1,e)&&(g.ket=g.cursor,g.slice_from(t),g.cursor=n,!0)}function y(){for(var e,t;;){if(e=g.cursor,g.in_grouping(m,97,251)){if(g.bra=g.cursor,t=g.cursor,v("u","U",e))continue;if(g.cursor=t,v("i","I",e))continue;if(g.cursor=t,b("y","Y",e))continue}if(g.cursor=e,g.bra=e,!v("y","Y",e)){if(g.cursor=e,g.eq_s(1,"q")&&(g.bra=g.cursor,b("u","U",e)))continue;if(g.cursor=e,e>=g.limit)return;g.cursor++}}}function w(){for(;!g.in_grouping(m,97,251);){if(g.cursor>=g.limit)return!0;g.cursor++}for(;!g.out_grouping(m,97,251);){if(g.cursor>=g.limit)return!0;g.cursor++}return!1}function k(){var t=g.cursor;if(a=g.limit,r=a,e=a,g.in_grouping(m,97,251)&&g.in_grouping(m,97,251)&&g.cursor=g.limit){g.cursor=a;break}g.cursor++}while(!g.in_grouping(m,97,251))}a=g.cursor,g.cursor=t,w()||(r=g.cursor,w()||(e=g.cursor))}function E(){for(var e,t;t=g.cursor,g.bra=t,e=g.find_among(i,4);)switch(g.ket=g.cursor,e){case 1:g.slice_from("i");break;case 2:g.slice_from("u");break;case 3:g.slice_from("y");break;case 4:if(g.cursor>=g.limit)return;g.cursor++}}function S(){return a<=g.cursor}function x(){return r<=g.cursor}function _(){return e<=g.cursor}function C(){var e,t;if(g.ket=g.cursor,e=g.find_among_b(u,43)){switch(g.bra=g.cursor,e){case 1:if(!_())return!1;g.slice_del();break;case 2:if(!_())return!1;g.slice_del(),g.ket=g.cursor,g.eq_s_b(2,"ic")&&(g.bra=g.cursor,_()?g.slice_del():g.slice_from("iqU"));break;case 3:if(!_())return!1;g.slice_from("log");break;case 4:if(!_())return!1;g.slice_from("u");break;case 5:if(!_())return!1;g.slice_from("ent");break;case 6:if(!S())return!1;if(g.slice_del(),g.ket=g.cursor,e=g.find_among_b(l,6))switch(g.bra=g.cursor,e){case 1:_()&&(g.slice_del(),g.ket=g.cursor,g.eq_s_b(2,"at")&&(g.bra=g.cursor,_()&&g.slice_del()));break;case 2:_()?g.slice_del():x()&&g.slice_from("eux");break;case 3:_()&&g.slice_del();break;case 4:S()&&g.slice_from("i")}break;case 7:if(!_())return!1;if(g.slice_del(),g.ket=g.cursor,e=g.find_among_b(s,3))switch(g.bra=g.cursor,e){case 1:_()?g.slice_del():g.slice_from("abl");break;case 2:_()?g.slice_del():g.slice_from("iqU");break;case 3:_()&&g.slice_del()}break;case 8:if(!_())return!1;if(g.slice_del(),g.ket=g.cursor,g.eq_s_b(2,"at")&&(g.bra=g.cursor,_()&&(g.slice_del(),g.ket=g.cursor,g.eq_s_b(2,"ic")))){g.bra=g.cursor,_()?g.slice_del():g.slice_from("iqU");break}break;case 9:g.slice_from("eau");break;case 10:if(!x())return!1;g.slice_from("al");break;case 11:if(_())g.slice_del();else{if(!x())return!1;g.slice_from("eux")}break;case 12:if(!x()||!g.out_grouping_b(m,97,251))return!1;g.slice_del();break;case 13:return S()&&g.slice_from("ant"),!1;case 14:return S()&&g.slice_from("ent"),!1;case 15:return t=g.limit-g.cursor,g.in_grouping_b(m,97,251)&&S()&&(g.cursor=g.limit-t,g.slice_del()),!1}return!0}return!1}function T(){var e,t;if(g.cursor=a){if(n=g.limit_backward,g.limit_backward=a,g.ket=g.cursor,e=g.find_among_b(f,7))switch(g.bra=g.cursor,e){case 1:if(_()){if(r=g.limit-g.cursor,!g.eq_s_b(1,"s")&&(g.cursor=g.limit-r,!g.eq_s_b(1,"t")))break;g.slice_del()}break;case 2:g.slice_from("i");break;case 3:g.slice_del();break;case 4:g.eq_s_b(2,"gu")&&g.slice_del()}g.limit_backward=n}}function P(){var e=g.limit-g.cursor;g.find_among_b(p,5)&&(g.cursor=g.limit-e,g.ket=g.cursor,g.cursor>g.limit_backward&&(g.cursor--,g.bra=g.cursor,g.slice_del()))}function R(){for(var e,t=1;g.out_grouping_b(m,97,251);)t--;if(t<=0){if(g.ket=g.cursor,e=g.limit-g.cursor,!g.eq_s_b(1,"\xe9")&&(g.cursor=g.limit-e,!g.eq_s_b(1,"\xe8")))return;g.bra=g.cursor,g.slice_from("e")}}function N(){if(!C()&&(g.cursor=g.limit,!T()&&(g.cursor=g.limit,!L())))return g.cursor=g.limit,void A();g.cursor=g.limit,g.ket=g.cursor,g.eq_s_b(1,"Y")?(g.bra=g.cursor,g.slice_from("i")):(g.cursor=g.limit,g.eq_s_b(1,"\xe7")&&(g.bra=g.cursor,g.slice_from("c")))}this.setCurrent=function(e){g.setCurrent(e)},this.getCurrent=function(){return g.getCurrent()},this.stem=function(){var e=g.cursor;return y(),g.cursor=e,k(),g.limit_backward=e,g.cursor=g.limit,N(),g.cursor=g.limit,P(),g.cursor=g.limit,R(),g.cursor=g.limit_backward,E(),!0}},function(e){return"function"==typeof e.update?e.update((function(e){return r.setCurrent(e),r.stem(),r.getCurrent()})):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci cel\xe0 ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux e\xfbmes e\xfbt e\xfbtes furent fus fusse fussent fusses fussiez fussions fut f\xfbmes f\xfbt f\xfbtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon m\xeame n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y \xe0 \xe9taient \xe9tais \xe9tait \xe9tant \xe9tiez \xe9tions \xe9t\xe9 \xe9t\xe9e \xe9t\xe9es \xe9t\xe9s \xeates".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}})?r.call(t,n,t,e):r)||(e.exports=a)},4182:function(e,t,n){var r,a;r=function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),n=t.join("-"),r="",a=[],o=[],i=0;i=n&&t[(a-=n)>>3]&1<<(7&a))return this.cursor++,!0}return!1},in_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var a=e.charCodeAt(this.cursor-1);if(a<=r&&a>=n&&t[(a-=n)>>3]&1<<(7&a))return this.cursor--,!0}return!1},out_grouping:function(t,n,r){if(this.cursorr||a>3]&1<<(7&a)))return this.cursor++,!0}return!1},out_grouping_b:function(t,n,r){if(this.cursor>this.limit_backward){var a=e.charCodeAt(this.cursor-1);if(a>r||a>3]&1<<(7&a)))return this.cursor--,!0}return!1},eq_s:function(t,n){if(this.limit-this.cursor>1),d=0,f=l0||a==r||u)break;u=!0}}for(;;){if(l>=(p=t[r]).s_size){if(this.cursor=o+p.s_size,!p.method)return p.result;var h=p.method();if(this.cursor=o+p.s_size,h)return p.result}if((r=p.substring_i)<0)return 0}},find_among_b:function(t,n){for(var r=0,a=n,o=this.cursor,i=this.limit_backward,l=0,s=0,u=!1;;){for(var c=r+(a-r>>1),d=0,f=l=0;p--){if(o-f==i){d=-1;break}if(d=e.charCodeAt(o-1-f)-m.s[p])break;f++}if(d<0?(a=c,s=f):(r=c,l=f),a-r<=1){if(r>0||a==r||u)break;u=!0}}for(;;){var m;if(l>=(m=t[r]).s_size){if(this.cursor=o-m.s_size,!m.method)return m.result;var h=m.method();if(this.cursor=o-m.s_size,h)return m.result}if((r=m.substring_i)<0)return 0}},replace_s:function(t,n,r){var a=r.length-(n-t),o=e.substring(0,t),i=e.substring(n);return e=o+r+i,this.limit+=a,this.cursor>=n?this.cursor+=a:this.cursor>t&&(this.cursor=t),a},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>e.length)throw"faulty slice operation"},slice_from:function(e){this.slice_check(),this.replace_s(this.bra,this.ket,e)},slice_del:function(){this.slice_from("")},insert:function(e,t,n){var r=this.replace_s(e,t,n);e<=this.bra&&(this.bra+=r),e<=this.ket&&(this.ket+=r)},slice_to:function(){return this.slice_check(),e.substring(this.bra,this.ket)},eq_v_b:function(e){return this.eq_s_b(e.length,e)}}}},e.trimmerSupport={generateTrimmer:function(e){var t=new RegExp("^[^"+e+"]+"),n=new RegExp("[^"+e+"]+$");return function(e){return"function"==typeof e.update?e.update((function(e){return e.replace(t,"").replace(n,"")})):e.replace(t,"").replace(n,"")}}}}})?r.call(t,n,t,e):r)||(e.exports=a)},1336:(e,t,n)=>{var r,a;!function(){var o,i,l,s,u,c,d,f,p,m,h,g,v,b,y,w,k,E,S,x,_,C,T,L,A,P,R,N,O,I,D=function(e){var t=new D.Builder;return t.pipeline.add(D.trimmer,D.stopWordFilter,D.stemmer),t.searchPipeline.add(D.stemmer),e.call(t,t),t.build()};D.version="2.3.9",D.utils={},D.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),D.utils.asString=function(e){return null==e?"":e.toString()},D.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var s=D.utils.clone(t)||{};s.position=[i,l],s.index=a.length,a.push(new D.Token(n.slice(i,o),s))}i=o+1}}return a},D.tokenizer.separator=/[\s\-]+/,D.Pipeline=function(){this._stack=[]},D.Pipeline.registeredFunctions=Object.create(null),D.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&D.utils.warn("Overwriting existing registered function: "+t),e.label=t,D.Pipeline.registeredFunctions[e.label]=e},D.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||D.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},D.Pipeline.load=function(e){var t=new D.Pipeline;return e.forEach((function(e){var n=D.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},D.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){D.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},D.Pipeline.prototype.after=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},D.Pipeline.prototype.before=function(e,t){D.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},D.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},D.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:ol?u+=2:i==l&&(t+=n[s+1]*r[u+1],s+=2,u+=2);return t},D.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},D.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new D.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new D.TokenSet;a.node.edges["*"]=l}if(0==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new D.TokenSet;a.node.edges["*"]=s}1==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new D.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},D.TokenSet.fromString=function(e){for(var t=new D.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},D.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},D.Index.prototype.search=function(e){return this.query((function(t){new D.QueryParser(e,t).parse()}))},D.Index.prototype.query=function(e){for(var t=new D.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),l=0;l1?1:e},D.Builder.prototype.k1=function(e){this._k1=e},D.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return D.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},D.QueryLexer.prototype.width=function(){return this.pos-this.start},D.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},D.QueryLexer.prototype.backup=function(){this.pos-=1},D.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=D.QueryLexer.EOS&&this.backup()},D.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(D.QueryLexer.TERM)),e.ignore(),e.more())return D.QueryLexer.lexText},D.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.EDIT_DISTANCE),D.QueryLexer.lexText},D.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(D.QueryLexer.BOOST),D.QueryLexer.lexText},D.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(D.QueryLexer.TERM)},D.QueryLexer.termSeparator=D.tokenizer.separator,D.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==D.QueryLexer.EOS)return D.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return D.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(D.QueryLexer.TERM),D.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(D.QueryLexer.PRESENCE),D.QueryLexer.lexText;if(t.match(D.QueryLexer.termSeparator))return D.QueryLexer.lexTerm}else e.escapeCharacter()}},D.QueryParser=function(e,t){this.lexer=new D.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},D.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=D.QueryParser.parseClause;e;)e=e(this);return this.query},D.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},D.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},D.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},D.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case D.QueryLexer.PRESENCE:return D.QueryParser.parsePresence;case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new D.QueryParseError(n,t.start,t.end)}},D.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=D.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=D.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new D.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new D.QueryParseError(n,t.start,t.end)}switch(r.type){case D.QueryLexer.FIELD:return D.QueryParser.parseField;case D.QueryLexer.TERM:return D.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new D.QueryParseError(n,r.start,r.end)}}},D.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new D.QueryParseError(r,t.start,t.end)}if(a.type===D.QueryLexer.TERM)return D.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}},D.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new D.QueryParseError(r,n.start,n.end)}else e.nextClause()}},D.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}else e.nextClause()}},D.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new D.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case D.QueryLexer.TERM:return e.nextClause(),D.QueryParser.parseTerm;case D.QueryLexer.FIELD:return e.nextClause(),D.QueryParser.parseField;case D.QueryLexer.EDIT_DISTANCE:return D.QueryParser.parseEditDistance;case D.QueryLexer.BOOST:return D.QueryParser.parseBoost;case D.QueryLexer.PRESENCE:return e.nextClause(),D.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new D.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return D})?r.call(t,n,t,e):r)||(e.exports=a)}()},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)},7410:(e,t,n)=>{"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=1;if(b){if(!(_=o(k,S,e,v))||_.index>=e.length)break;var T=_.index,L=_.index+_[0].length,A=S;for(A+=E.value.length;T>=A;)A+=(E=E.next).value.length;if(S=A-=E.value.length,E.value instanceof a)continue;for(var P=E;P!==t.tail&&(Ad.reach&&(d.reach=I);var D=E.prev;if(N&&(D=s(t,D,N),S+=N.length),u(t,D,C),E=s(t,D,new a(f,g?r.tokenize(R,g):R,y,R)),O&&s(t,E,O),C>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(3840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n