diff --git a/.eslintrc.js b/.eslintrc.js
index 94eed734ce9579f7d265a0980839df67646d1e8f..26eb980447ce8b478cbb5a394269a083783609c4 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,4 +1,12 @@
 module.exports = {
+  plugins: [
+    '@typescript-eslint',
+    'react',
+    'react-hooks',
+    'jest',
+    'jsx-a11y',
+    '@eslint-react/eslint-plugin',
+  ],
   extends: [
     'eslint:recommended',
     'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react
@@ -11,10 +19,12 @@ module.exports = {
     {
       extends: [
         'plugin:jsdoc/recommended',
+        // Functional rule configurations, for best best practices and code correctness
         'plugin:@typescript-eslint/recommended',
-        'plugin:@typescript-eslint/eslint-recommended', // Uses the recommended rules from @typescript-eslint/eslint-plugin
-        // This enables a lot of type checking
-        // 'plugin:@typescript-eslint/recommended-requiring-type-checking', // Uses the recommended rules from @typescript-eslint/eslint-plugin
+        // Stylistic rule configurations, for consistent and predictable syntax usage
+        'plugin:@typescript-eslint/stylistic-type-checked',
+        // Eslint React plugin
+        'plugin:@eslint-react/recommended-legacy',
       ],
       files: ['**/*.{ts,tsx}'],
       parserOptions: {
@@ -31,6 +41,18 @@ module.exports = {
         '@typescript-eslint/no-var-requires': 'off',
         '@typescript-eslint/no-unnecessary-type-assertion': 'error',
 
+        '@typescript-eslint/default-param-last': 'error',
+        '@typescript-eslint/prefer-for-of': 'warn',
+        '@typescript-eslint/prefer-includes': 'error',
+        '@typescript-eslint/prefer-string-starts-ends-with': 'error',
+        '@typescript-eslint/switch-exhaustiveness-check': 'error',
+
+        // causes a build error and has a lot of effects on components
+        '@typescript-eslint/prefer-nullish-coalescing': 'off',
+
+        // better readability by naming keys
+        '@typescript-eslint/consistent-indexed-object-style': 'off',
+
         // JSDOC extends overrides: disable some of extends rules
         // JSdoc is not always needed
         'jsdoc/require-jsdoc': 0,
@@ -45,6 +67,18 @@ module.exports = {
 
         // a11y label fix, nesting is enough
         'jsx-a11y/label-has-associated-control': 0,
+
+        // Note: you must disable the base rule as it can report incorrect errors
+        'require-await': 'off',
+        '@typescript-eslint/require-await': 'error',
+
+        // disable recommandations
+        '@eslint-react/hooks-extra/no-redundant-custom-hook': 0, // great rule but should not be run in tests files
+        '@eslint-react/hooks-extra/no-direct-set-state-in-use-effect': 0, // to enable in another MR will have a lot of impact
+        '@eslint-react/dom/no-dangerously-set-innerhtml': 0, // used for for injecting html tags
+        '@eslint-react/no-array-index-key': 0,
+        '@eslint-react/no-unused-class-component-members': 0, // disabled for ".d.ts" files
+        '@eslint-react/no-leaked-conditional-rendering': 'error', // important ! avoids rendering 0
       },
     },
     {
@@ -64,7 +98,6 @@ module.exports = {
       },
     },
   ],
-  plugins: ['@typescript-eslint', 'react', 'react-hooks', 'jest', 'jsx-a11y'],
   parser: '@typescript-eslint/parser', // Specifies the ESLint parser
   parserOptions: {
     ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features
@@ -85,6 +118,7 @@ module.exports = {
     'spaced-comment': ['error', 'always', { block: { exceptions: ['*'] } }],
     'react/self-closing-comp': 'warn',
     'react/jsx-curly-brace-presence': ['error'],
+    'react/jsx-no-useless-fragment': ['error'],
 
     // Rule to suggest using useAppDispatch instead of regular useDispatch
     'no-restricted-imports': 'off',
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f1c5d0d86033ebce080e2a382f14f3af7b25472a..59d9b3bd3e4bdef01f576afb19c90716d967c706 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,5 @@
 default:
-  image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:16.19.1-alpine
+  image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:20-alpine
   services:
     - name: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:20.10.9-dind
       alias: docker
@@ -46,6 +46,7 @@ build_stack:
 
 sonarqube-mr:
   stage: quality
+  needs: []
   only:
     - merge_requests
   image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4
@@ -71,6 +72,7 @@ sonarqube-mr:
 
 sonarqube:
   stage: quality
+  needs: []
   only:
     - dev
   image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/sonarsource/sonar-scanner-cli:4
@@ -96,6 +98,7 @@ sonarqube:
 
 test:
   stage: test
+  needs: []
   before_script:
     - apk add git
   script:
@@ -114,6 +117,7 @@ test:
 
 build-dev:
   stage: build
+  needs: []
   before_script:
     - apk add git
     - apk add bash
@@ -131,6 +135,7 @@ build-dev:
 
 build-prod:
   stage: build
+  needs: []
   before_script:
     - apk add git
     - apk add bash
@@ -151,11 +156,11 @@ deploy-dev:
     - apk add bash
   script:
     - yarn
-    - git config --global user.name build-pipeline
-    - git config --global user.email "$GIT_USER"
-    - git config --global user.password "$GIT_PWD"
-    - git config user.email "$GIT_USER"
-    - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git
+    - git config --global user.name build-token
+    - git config --global user.email build-token
+    - git config --global user.password "$BUILD_TOKEN"
+    - git config user.email build-token
+    - git remote set-url origin https://build-token:"$BUILD_TOKEN"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git
     - git config --global credential.helper store
     - yarn deploy-dev
   only:
@@ -173,11 +178,11 @@ deploy-test:
   script:
     - yarn
     - ls build
-    - git config --global user.name build-pipeline
-    - git config --global user.email "$GIT_USER"
-    - git config --global user.password "$GIT_PWD"
-    - git config user.email "$GIT_USER"
-    - git remote set-url origin https://"$GIT_USER":"$GIT_PWD"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git
+    - git config --global user.name build-token
+    - git config --global user.email build-token
+    - git config --global user.password "$BUILD_TOKEN"
+    - git config user.email build-token
+    - git remote set-url origin https://build-token:"$BUILD_TOKEN"@forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git
     - git config --global credential.helper store
     - yarn deploy-test
   only:
@@ -196,7 +201,7 @@ update-dev:
     - merge_requests
   environment:
     name: dev
-    url: https://ecolyo.dev.cozy.self-data.alpha.grandlyon.com/
+    url: https://dev-ecolyo.cozy.self-data.alpha.grandlyon.com/
   needs:
     - deploy-dev
 
@@ -223,7 +228,7 @@ update-demo:
     - dev
   environment:
     name: ecolyodemo
-    url: https://ecolyo.ecolyodemo.cozy.self-data.alpha.grandlyon.com/
+    url: https://ecolyodemo-dev.cozy.self-data.alpha.grandlyon.com/
   needs:
     - deploy-test
 
diff --git a/.gitlab/merge_request_templates/[QA] Ecolyo.md b/.gitlab/merge_request_templates/[QA] Ecolyo.md
index f4c5c09119c8829b7c475b4b3e13da48c9435ebf..f25ce9e92e801cfb3765fb56a30f45bc1d6f9ffc 100644
--- a/.gitlab/merge_request_templates/[QA] Ecolyo.md	
+++ b/.gitlab/merge_request_templates/[QA] Ecolyo.md	
@@ -4,70 +4,88 @@
 
 # Cahier de recette pour la version _x.x.x_
 
-## Tests de non régression sur la [Nouvelle instance](https://ecolyo.ecolyo-x-x.cozy.self-data.alpha.grandlyon.com/#/)
+## Tests de non régression sur la [Nouvelle instance](https://ecolyoXX-ecolyo.cozy.self-data.alpha.grandlyon.com/#/)
 
-1. **Onboarding**
-   - [ ] Le chargement de l'application fonctionne correctement
-   - [ ] La modal "Vous êtes à mis chemin" est présentée
-   - [ ] Les CGU sont demandées
+### 1. Onboarding
 
-2. **Comportement sans connecteur connecté**
-   - [ ] La page conso pousse à la connexion
-   - [ ] La page analyse pousse à la connexion
+- [ ] Le chargement de l'application fonctionne correctement
+- [ ] La modal "Vous êtes à mis chemin" est présentée
+- [ ] Les CGU sont demandées
 
-3. **Lancement des connecteurs**
-   - [ ] SGE
-   - [ ] EPGL
-   - [ ] GRDF
+### 2. **Comportement sans connecteur connecté**
 
-4. **Page Défis**
-   - [ ] L'utilisateur peut lancer le 1er défi
+- [ ] La page conso pousse à la connexion
+- [ ] La page analyse pousse à la connexion
 
-5. **Conso**
+### 3. **Lancement des connecteurs**
 
-**Premier lancement**
-   - [ ] La profondeur de données va jusqu'à 1 an dans la conso pour les pas de temps journalier
-   - [ ] La profondeur de données à la 1/2h (elec) va jusqu'à 1 semaine 
+- [ ] SGE
+- [ ] EPGL
+- [ ] GRDF
 
-**Le lendemain**
-   - [ ] La profondeur de données va jusqu'à 3 ans pour l'élec et le gaz
-   - [ ] La profondeur de données va jusqu'à novembre 2022 pour l'eau (à cause du passage en régie)
-   - [ ] La profondeur de données à la 1/2h (elec) va jusqu'à 1 mois
+### 4. **Page Défis**
 
-6. **Analyse** 
-   - [ ] La profondeur de données va jusqu'à 3 mois antérieur
-   - [ ] Les modules de l'analyse sont tous fonctionnels (à l'exception du special elec qui devra être déclenché par un service)
+- [ ] L'utilisateur peut lancer le 1er défi
 
-7. **Page Astuces**
-   - [ ] Chargement de la base des écogestes dans "Toutes"
-   - [ ] Lancement du module du choix des écogestes Ok
-   - [ ] Le profil raccourci est proposé si le profil complet n'est pas renseigné
+### 5. **Conso**
 
-8. **Page Options**
-   - [ ] L'utilisateur est inscrit par défaut à la newsletter
-   - [ ] L'utilisateur n'est pas exclu des statistiques d'usage MATOMO
-   - [ ] L'accès au SAU est fonctionnel
-   - [ ] Les mentions légales et les CGU sont accessibles
-   - [ ] La page d'accessibilité est accessible
-   - [ ] L'export de données fonctionne quand un connecteur est connecté
+#### Premier lancement
 
+- [ ] La profondeur de données va jusqu'à 1 an dans la conso pour les pas de temps journalier
+- [ ] La profondeur de données à la 1/2h (elec) va jusqu'à 1 semaine
 
-9. **Icône raccourci**
-   - [ ] L'utilisateur peut ajouter l'application en raccourci (pwa android)
-   - [ ] L'utilisateur peut ajouter l'application en raccourci (pwa iPhone)
+#### Le lendemain
 
-10. **Autres**
-   - [ ] Les informations de navigation remontent dans le matomo recette
-      > 💡 Aller consulter des écogestes en particulier, repérer leurs id et vérifier sur matomo dans "Comportement / Pages"
+- [ ] La profondeur de données va jusqu'à 3 ans pour l'élec et le gaz
+- [ ] La profondeur de données va jusqu'à novembre 2022 pour l'eau (à cause du passage en régie)
+- [ ] La profondeur de données à la 1/2h (elec) va jusqu'à 1 mois
 
+#### Prix
+
+- [ ] modifier le prix d'un des fluides (électricité ou gaz) dans le backoffice de recette, relancer les connecteurs pour mettre à jour les prix (= correspond à la quantité multipliée par le prix modifié). Attention à ne modifier des prix que sur la dernière année.
+- [ ] mettre à jour les prix par défaut de l'appli avec les derniers prix disponibles dans le back-office
+
+### 6. **Analyse**
+
+- [ ] La profondeur de données va jusqu'à 3 mois antérieur
+- [ ] Les modules de l'analyse sont tous fonctionnels (à l'exception du special elec qui devra être déclenché par un service)
+- [ ] Le module de comparaison des températures s'affiche dans la comparaison annuelle et mensuelle
+
+### 7. **Page Astuces**
+
+- [ ] Chargement de la base des astuces dans "Toutes"
+- [ ] Lancement du module du choix des astuces Ok
+- [ ] Le profil raccourci est proposé si le profil complet n'est pas renseigné
+
+### 8. **Page Options**
+
+- [ ] L'utilisateur n'est pas inscrit par défaut à la newsletter
+- [ ] L'utilisateur n'est pas exclu des statistiques d'usage MATOMO
+- [ ] L'accès au SAU est fonctionnel
+- [ ] Les mentions légales et les CGU sont accessibles
+- [ ] La page d'accessibilité est accessible
+- [ ] L'export de données fonctionne quand un connecteur est connecté
+
+### 9. **Icône raccourci**
+
+- [ ] L'utilisateur peut ajouter l'application en raccourci (pwa android)
+- [ ] L'utilisateur peut ajouter l'application en raccourci (pwa iPhone)
+
+### 10. **Autres**
+
+- [ ] Les informations de navigation remontent dans le matomo recette > 💡 Aller consulter des écogestes en particulier, repérer leurs id et vérifier sur matomo dans "Comportement / Pages"
 
 ## Tests des nouvelles fonctionnalités
 
-- [ ] 📝 _À mettre à jour selon les derniers développements_
+📝 _À mettre à jour selon les derniers développements_
+
+- [ ] ...
+
+## Migrations [Instance historique](https://ecolyodemo-ecolyo.cozy.self-data.alpha.grandlyon.com)
 
-## Migrations [Instance historique](https://ecolyo.ecolyodemo.cozy.self-data.alpha.grandlyon.com)
+📝 _Si une migration était nécessaire, vérifier quand c'est possible qu'elle a bien eu lieu_
 
-- [ ] Si une migration était nécessaire, vérifier quand c'est possible qu'elle a bien eu lieu
+- [ ] ...
 
 ## Autres évolutions associées
 
diff --git a/.node-version b/.node-version
new file mode 100644
index 0000000000000000000000000000000000000000..2edeafb09db0093bae6ff060e2dcd2166f5c9387
--- /dev/null
+++ b/.node-version
@@ -0,0 +1 @@
+20
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
index b3f02083321ce59814f15b98a5ef2b92aa387f21..7f58d87e15f258f564f44481ab3c81266743b713 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -54,6 +54,7 @@
     "barchart",
     "camelcase",
     "cicid",
+    "coeff",
     "CONSO",
     "cozybar",
     "cozycloud",
@@ -85,8 +86,10 @@
     "Enedis",
     "ENEDIS",
     "enedissgegrandlyon",
+    "energical",
     "Epgl",
     "esnext",
+    "Explo",
     "firstname",
     "fluidchart",
     "fluidchartslide",
@@ -138,10 +141,10 @@
     "PROFILETYPE",
     "pseudonymisées",
     "reduxjs",
-    "Reinit",
     "sendmail",
     "SHARAPOWATT",
     "shortcodes",
+    "Smartmeter",
     "splashscreen",
     "swipeable",
     "Swipeable",
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 89bf774603d7414a071f1b960bf21a70dfabcd8f..c4a3050ffea10e0921c9d23d91c5601b7ebd1f24 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,117 @@
 
 All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
 
+### [3.1.1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v3.1.0...v3.1.1) (2024-10-02)
+
+
+### Bug Fixes
+
+* **app:** remove console.group ([bbcf10f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bbcf10f308de9cbad3fbfc953c9bababf3339a45))
+
+## [3.1.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.8.0...v3.1.0) (2024-09-30)
+
+
+### âš  BREAKING CHANGES
+
+* **grdf:** update error messages
+
+### Features
+
+* **a11y:** Add a focus style to components ([bbfa418](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bbfa418c5ff74cbb7d80013a2bb722b821574f39))
+* **a11y:** Add a quick access link ([ab54126](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ab54126414c37233b3299b62e1d147be5944c344))
+* **a11y:** Optimize keyboard navigation between pages ([6dae9c4](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6dae9c439302ff10a688b81fc9acec73b5409d83))
+* **a11y:** Unlocked challenges focusable with keyboard ([6a787ef](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6a787efa3919f94a8443f6c37306232e37a91fe5))
+* **accessibility:** allow bars to handle keyboard focus ([7bd3d68](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7bd3d6854d7efcccc4f7c0ed5cb02e13449612b5))
+* add dynamic page titles ([506da0c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/506da0ce1b6bc1746896afa8ff8279779279396c))
+* **analysis:** add monthly average temperature comparison ([c64756f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c64756f1774957567c93cafa91da99034611d5a7))
+* **analysis:** change text order in modal ([c976b9b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c976b9b4ed546cece976bbb8758b42045a9aa4cc))
+* **analysis:** Make monthly summary button clickable ([4f966f6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4f966f60f54bf3cc0a9b68db35dcdfbb44941650))
+* **challenge:** change challenge description ([c82653c](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c82653c15145d8c9eca24199c01d09b19f560949))
+* **ecogesture/profile:** add "garden" equipment ([87e6ff1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87e6ff137131fb3d0461f4c315b5c9fed90cf425))
+* **ecogestures:** rework ecogesture order and add score ([f9d847e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f9d847e0291db0791ce8179bc28903b8aeb458c0))
+* **ecogestures:** unify ecogesture init modal components ([2a6928a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2a6928ab9e1797eb2e4e16180f1d24c0a76b026d))
+* fluidsPrices no longer apply prices ([7887b85](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7887b8540a559dc3fc975cc4113ffde335087aba))
+* GRDF consent email ([819af22](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/819af22356342b33c0e8dfbcc843caaa5ffc4f3a))
+* **grdf:** update error messages ([dfecbc3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dfecbc306aaac9dd8faca7e16be062aaa250c795))
+* **grdf:** update login method ([c0709f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c0709f7031caab19d41b49b50a3147b496f43666))
+* improve app load time ([2235acc](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2235acc72f33caa67a67650cdb9a7a4512fda50f))
+* init prices in scripts ([543eb79](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/543eb79b904b02839f9765253d3982cb087ab2e0))
+* newsletter is now opt-in ([2e78ec2](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/2e78ec262cefa4fe8382d09a335eff5205e05d2a))
+* **newsletter:** incite user to connect his compteur when no data ([bfecbae](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/bfecbaebc0a0da518aab3bcc4f9d00e6c7bb7d2d))
+* node 20 ([391d686](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/391d686728b9b62c9282fd6e8f5c23f5b0ab4121))
+* spread services execution ([a10b40b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a10b40bb7eb4d970a5f49b3ce5f4f8107e9fd964))
+* **titles:** change header titles to match page titles ([dd6ea8d](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dd6ea8d907e8067f621d8201e40508212ede1dd7))
+* **UI:** Use MaterialUI components for input fields ([71e3907](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/71e39078187079fef9b8fb680731cd9ede079dcc))
+* **water:** solidarity pricing ([7e85111](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7e851115d4fd3972a8f9823331d60ff6d688e0f6))
+
+
+### Bug Fixes
+
+* **a11y:** Adapt to small screens 320x256 ([ec2a8b8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ec2a8b859dcdc70e11289cb1acca19ffe33d6c48))
+* **a11y:** Add label and description to buttons ([dc57452](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dc5745235be19e598c6436b36595035e01399f1f))
+* **a11y:** Added aria roles to lists ([93d3b59](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/93d3b59c53f3c367655ca70ecfdcc3b8aaa7d11d))
+* **a11y:** Added autoComplete types to TextFields ([9373300](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9373300764049087800413ba4627f667eb202116))
+* **a11y:** Adds the required property to inputs ([c86b478](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c86b478369588c10d3b8aceae017a1e87f695033))
+* **a11y:** allow navigation on help link ([211c477](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/211c477a8abe499adc7b4410ad5d193b6711a1f7))
+* **a11y:** Checkboxes must be accessible ([6f72e8e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/6f72e8e5b6f42e33bfcb899d656fc43a2600213f))
+* **accessibility:** alt mentions for images ([7aab7ee](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7aab7ee75e0ec92fc76b09a9b6bff36cdafb76ab))
+* **accessibility:** remove graph shift when navigating with keyboard ([ec41d38](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ec41d38086797d3b7475d51c802f24a94f0d1f7c))
+* **accessibility:** SAU Link ([79d628a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/79d628a8cc0f755cb146d9b971904f758b60e36b))
+* add wait consent modal ([017eeeb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/017eeeb18ec5e5c3a745667ffe0fdca4c70bbeae))
+* **alt:** correct alt for logo des financeurs ([7d53753](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7d537539aac484ade9e1e12c3f8f06dc375bf0da))
+* **analysis:** adjust temperature loader ([ee0a721](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/ee0a72165c1c77351f126cbf6355f1b2de82b1ee))
+* **analysis:** apple prices for forecast ([3ec3dca](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3ec3dca37d92d38a79a4abe52df37364a5ff435c))
+* **analysis:** update order of "plus d'infos" modal ([c76d94b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c76d94beb1becb502f72b8ecf2f8c9f246da7967))
+* **challenges:** last card height ([3d725f1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/3d725f136303617666b5d98250e98d87b3756483))
+* **deps:** update dependency cozy-device-helper ([e76a275](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/e76a275a790b41e0c32dc6a0fd6a89189ee88ea3))
+* **deps:** update dependency cozy-flags ([f2dba38](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f2dba387ea4c4e4458705a8c77b4355deb34257c))
+* **deps:** update dependency cozy-intent ([7416184](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/741618415b2f03f2836215290a4a2844f2084789))
+* **deps:** update dependency cozy-keys-lib & cozy-ui ([4824e44](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4824e4437fc7e08f19c334b45617c2cc49497c76))
+* **deps:** update dependency cozy-realtime ([4d84114](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4d84114887d71d5565d4e67f95d6fc6f8465b15a))
+* **deps:** update dependency cozy-scripts ([a71ed93](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/a71ed93b96cbb1b73a96ae1578631bf62573283f))
+* **deps:** update dependency cozy-ui to v86 ([6073651](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60736513aafd1d29e4f49242701e9e13d1323675))
+* **dju:** use dju sum instead of average ([966a404](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/966a4040edfd708f5e9f9ad120e9f2ccb77482fe))
+* **electricity:** remove loader delay ([de28d30](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/de28d30382e5e20bbbb27ba09c670f869d844570))
+* **equipments:** rename "Garden" to "Extérieur" ([df55664](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df5566437798e09ea815a206a60dcc892a1d029b))
+* **quiz:** resolve black screen bug when customQuestion is not loaded ([9ae1a47](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/9ae1a47a76bbfdd6a0d7227b1a9b0bf32c339502))
+* render "0" on analysis view ([f311a7f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f311a7f87ca9b1459fefb00fada394525f32a01e))
+* transparent loader background ([19f27d8](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/19f27d84b85a0f7e98c76b4b80c226c0162f9596))
+* **UI:** center ecogesture content ([c48af14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c48af14054390a87b03be99202837cdc1db1c753))
+
+## [3.0.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.8.0...v3.0.0) (2024-05-29)
+
+
+### âš  BREAKING CHANGES
+
+* **grdf:** update login method ([c0709f7](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c0709f7031caab19d41b49b50a3147b496f43666))
+* **grdf:** update error messages
+
+### Features
+
+* **analysis:** add monthly average temperature comparison ([c64756f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c64756f1774957567c93cafa91da99034611d5a7))
+* **analysis:** change text order in modal ([c976b9b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c976b9b4ed546cece976bbb8758b42045a9aa4cc))
+* **analysis:** Make monthly summary button clickable ([4f966f6](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4f966f60f54bf3cc0a9b68db35dcdfbb44941650))
+* **ecogesture/profile:** add "garden" equipment ([87e6ff1](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/87e6ff137131fb3d0461f4c315b5c9fed90cf425))
+* **ecogestures:** rework ecogesture order and add score ([f9d847e](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f9d847e0291db0791ce8179bc28903b8aeb458c0))
+* GRDF consent email ([819af22](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/819af22356342b33c0e8dfbcc843caaa5ffc4f3a))
+* **grdf:** update error messages ([dfecbc3](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/dfecbc306aaac9dd8faca7e16be062aaa250c795))
+* **UI:** Use MaterialUI components for input fields ([71e3907](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/71e39078187079fef9b8fb680731cd9ede079dcc))
+
+
+### Bug Fixes
+
+* **accessibility:** SAU Link ([79d628a](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/79d628a8cc0f755cb146d9b971904f758b60e36b))
+* add wait consent modal ([017eeeb](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/017eeeb18ec5e5c3a745667ffe0fdca4c70bbeae))
+* **alt:** correct alt for logo des financeurs ([7d53753](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/7d537539aac484ade9e1e12c3f8f06dc375bf0da))
+* **analysis:** update order of "plus d'infos" modal ([c76d94b](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c76d94beb1becb502f72b8ecf2f8c9f246da7967))
+* **deps:** update dependency cozy-keys-lib & cozy-ui ([4824e44](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/4824e4437fc7e08f19c334b45617c2cc49497c76))
+* **deps:** update dependency cozy-ui to v86 ([6073651](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/60736513aafd1d29e4f49242701e9e13d1323675))
+* **dju:** use dju sum instead of average ([966a404](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/966a4040edfd708f5e9f9ad120e9f2ccb77482fe))
+* **electricity:** remove loader delay ([de28d30](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/de28d30382e5e20bbbb27ba09c670f869d844570))
+* **equipments:** rename "Garden" to "Extérieur" ([df55664](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/df5566437798e09ea815a206a60dcc892a1d029b))
+* render "0" on analysis view ([f311a7f](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/f311a7f87ca9b1459fefb00fada394525f32a01e))
+* **UI:** center ecogesture content ([c48af14](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/commit/c48af14054390a87b03be99202837cdc1db1c753))
+
 ## [2.8.0](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo/compare/v2.7.2...v2.8.0) (2024-02-28)
 
 
diff --git a/README.md b/README.md
index b25b56912533e54d1338a32e278e0107c0112791..8815278c5a9504a6982dca5867cd261d3a24b3ef 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,13 @@
 
 Ecolyo is a mobile-first app allowing citizens to visualise easily their energy consumption (electricity, gas, water ...). The app allows data visualisation but give also some tips on how to reduce energy consumption.
 
+## Ecolyo au-delà de la Métropole de Lyon
+
+<https://doc-self-data.apps.grandlyon.com/docs/ecolyo/share/>
+
 ## How does it works ?
 
-Ecolyo uses "konnectors" for fetching data. More on :
+Ecolyo uses "konnectors" for fetching data. More information on our [konnector documentation](https://doc-self-data.apps.grandlyon.com/docs/konnectors/introduction/). Repositories for our konnectors :
 
 - [enedis konnector](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/enedis-sge-konnector)
 - [grdf konnector](https://forge.grandlyon.com/web-et-numerique/factory/llle_project/grdf-konnector)
@@ -14,21 +18,11 @@ Ecolyo uses "konnectors" for fetching data. More on :
 
 ## Development
 
-For a more complete look at our project, check our [Self Data Docs](https://doc-self-data.apps.grandlyon.com/)
+For a more complete look at our project and our installation guide, check our **[Self Data Docs](https://doc-self-data.apps.grandlyon.com/)**
 
 _:pushpin: Note:_ we recommend to use [Yarn] instead of NPM for package management.
 
-Developing the Cozy Ecolyo app requires you to be familiar with [cozy's documentation](https://docs.cozy.io/en/).
-
-You can then clone the app repository and install dependencies:
-
-```sh
-git clone https://forge.grandlyon.com/web-et-numerique/factory/llle_project/ecolyo.git
-cd ecolyo
-yarn
-```
-
-Cozy's apps use a standard set of _npm scripts_ to run common tasks, like watch, lint, test, build…
+Developing the Cozy Ecolyo app requires you to be familiar with [cozy's documentation](https://docs.cozy.io/en/). Cozy's apps use a standard set of _scripts_ to run common tasks, like watch, lint, test, build…
 
 ### Run it inside a default Cozy using Docker
 
diff --git a/docker-compose.yml b/docker-compose.yml
index 433d83f83864603c200994c79a92e1c500e84789..bf9faec8eeae8987ecd1070e1001e5e43067d24f 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,4 +1,3 @@
-version: '3.7'
 services:
   stack:
     image: registry.forge.grandlyon.com/web-et-numerique/factory/llle_project/cozy-stack:1.5.8
@@ -16,7 +15,7 @@ services:
       - ./docker/cozy.yaml:/etc/cozy/cozy.yaml
 
   cozy-db:
-    image: couchdb:3.2.2
+    image: couchdb:3.3.3
     container_name: cozy-db
     volumes:
       - ./data/db:/opt/couchdb/data
diff --git a/docker/docker-compose.matomo.yml b/docker/docker-compose.matomo.yml
index a0a90254efbabe79f3c8bc443e950f93537fd7e4..0b2ecaaf3cbe87b8b1fb1ee8d7e441a7a49dfa86 100644
--- a/docker/docker-compose.matomo.yml
+++ b/docker/docker-compose.matomo.yml
@@ -1,5 +1,3 @@
-version: '3.8'
-
 services:
   db:
     image: mariadb
diff --git a/jest.config.js b/jest.config.js
index f8fbe1db986d3b9223e1a84dfb17e6d80d5c14db..1364b9ca85f51f665ce9d3fe8f634bcff95928e3 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -9,6 +9,8 @@ const config = {
     '\\.(png|gif|jpe?g|svg|hbs)$': '<rootDir>/tests/__mocks__/fileMock.js',
     // identity-obj-proxy module is installed by cozy-scripts
     '\\.(css|styl|sass|scss)$': 'identity-obj-proxy',
+    d3: '<rootDir>/node_modules/d3/dist/d3.min.js',
+    '^d3-(.*)$': '<rootDir>/node_modules/d3-$1/dist/d3-$1.min.js',
   },
   transformIgnorePatterns: [
     'node_modules/(?!(cozy-ui|cozy-harvest-lib|cozy-client))',
diff --git a/manifest.webapp b/manifest.webapp
index 9b8765136d8184fcee9df429554880e53eea2980..009d27918cea52d33148e947d1ae607b517c77cd 100644
--- a/manifest.webapp
+++ b/manifest.webapp
@@ -3,7 +3,7 @@
   "slug": "ecolyo",
   "icon": "public/icon.svg",
   "categories": ["energy"],
-  "version": "2.8.0",
+  "version": "3.1.1",
   "licence": "AGPL-3.0",
   "editor": "Métropole de Lyon",
   "default_locale": "fr",
@@ -109,13 +109,13 @@
           "description": "Required for the correct functioning of the energy and water connectors."
         },
         "terms": {
-          "description": "Required for the correct managment of CGU."
+          "description": "Required for the correct management of CGU."
         },
         "apps": {
           "description": "Required to display the icons of installed applications in the Cozy bar."
         },
         "settings": {
-          "description": "Required for the application's consents managment"
+          "description": "Required for the application's consents management"
         },
         "ecolyo-dju": {
           "description": "Required to gather udd data (Unified Degree Days), a meteorological data allowing the app to adjust our energical consumption model. "
@@ -177,12 +177,12 @@
     "enedisHalfHourMonthlyAnalysis": {
       "type": "node",
       "file": "services/enedisHalfHourMonthlyAnalysis/ecolyo.js",
-      "trigger": "@cron 0 0 8 3 * *"
+      "trigger": "@monthly on the 3 between 10am and 12pm"
     },
     "monthlyReportNotification": {
       "type": "node",
       "file": "services/monthlyReportNotification/ecolyo.js",
-      "trigger": "@cron 0 0 10 3 * *"
+      "trigger": "@monthly on the 3 between 12pm and 2pm"
     },
     "consumptionAlert": {
       "type": "node",
@@ -244,7 +244,7 @@
       "verbs": ["GET"]
     },
     "ecolyo-avg-temperature": {
-      "type": "org.ecolyo.avg-temperature",
+      "type": "org.ecolyo.avg_temperature",
       "verbs": ["GET"]
     },
     "dacc": {
diff --git a/package.json b/package.json
index da32adc2408193b265d19b8529951d8f0e94d3c6..8977adc0a4627b9f3a187e1fa574f7f78620f021 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
   "name": "ecolyo",
-  "version": "2.8.0",
+  "version": "3.1.1",
   "engines": {
-    "node": "16"
+    "node": "20"
   },
   "scripts": {
     "build": "yarn run build:css && yarn run build:browser",
@@ -25,7 +25,12 @@
     "test": "cs test --verbose --coverage",
     "tx": "tx pull --all || true",
     "watch": "yarn watch:browser",
-    "watch:browser": "cs watch --browser"
+    "watch:browser": "cs watch --browser",
+    "clean": "rm -rf ./data",
+    "data:create": "npx tsx scripts/createDayDataFiles.ts",
+    "data:import": "./scripts/importData.sh",
+    "data:seed": "yarn data:create && yarn data:import",
+    "data:connections": "npx tsx scripts/createConnections.ts"
   },
   "repository": {
     "type": "git",
@@ -44,51 +49,48 @@
     "@cozy/minilog": "^1.0.0",
     "@material-ui/core": "~4.12.0",
     "@material-ui/styles": "^4.11.3",
-    "@reduxjs/toolkit": "^1.9.5",
-    "@sentry/react": "^7.21.1",
-    "@sentry/tracing": "^7.21.1",
-    "@simbathesailor/use-what-changed": "^2.0.0",
-    "classnames": "^2.3.2",
-    "cozy-bar": "8.15.0",
-    "cozy-client": "40.6.0",
-    "cozy-device-helper": ">=2.1.0",
-    "cozy-flags": ">2.8.6",
+    "@reduxjs/toolkit": "^2.2.7",
+    "@sentry/react": "^8.26.0",
+    "classnames": "^2.5.1",
+    "cozy-bar": "10.0.0",
+    "cozy-client": "49.1.1",
+    "cozy-device-helper": "3.1.0",
+    "cozy-flags": "4.0.0",
     "cozy-harvest-lib": "9.26.14",
-    "cozy-intent": "^2.13.0",
-    "cozy-keys-lib": ">=4.1.9",
+    "cozy-intent": "^2.23.0",
+    "cozy-keys-lib": ">=6.0.0",
     "cozy-logger": ">1.7.0",
-    "cozy-realtime": "4.2.8",
-    "cozy-scripts": "8.1",
-    "cozy-ui": "^86.0.0",
-    "d3": "^6.0.0",
-    "detect-browser": "^5.1.1",
+    "cozy-realtime": "5.0.1",
+    "cozy-scripts": "8.3",
+    "cozy-ui": "^111.9.0",
+    "d3": "^7.9.0",
     "file-saver": "^2.0.5",
     "global": "^4.4.0",
-    "handlebars": "^4.7.7",
-    "handlebars-loader": "^1.7.1",
+    "handlebars": "^4.7.8",
+    "handlebars-loader": "^1.7.3",
     "history": "^5.3.0",
     "lodash": "^4.17.15",
-    "mjml-browser": "^4.10.2",
+    "mjml-browser": "^4.15.3",
     "null-loader": "^4.0.1",
     "object-hash": "^3.0.0",
     "react": "18.2.0",
     "react-dom": "18.2.0",
     "react-inspector": "^5.1",
-    "react-redux": "^8.1.2",
+    "react-redux": "^9.1.2",
     "react-router-dom": "^6.6.1",
     "react-swipeable-views": "0.14.0",
     "redux-devtools-extension": "^2.13.8",
     "redux-logger": "^3.0.6",
-    "redux-thunk": "^2.4.2",
     "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@babel/preset-typescript": "^7.7.4",
+    "@eslint-react/eslint-plugin": "^1.14.3",
     "@testing-library/dom": "^9.3.3",
     "@testing-library/jest-dom": "^6.4.2",
     "@testing-library/react": "^14.3.0",
     "@testing-library/user-event": "^14.5.2",
-    "@types/d3": "^6.0.0",
+    "@types/d3": "^7.4.3",
     "@types/file-saver": "^2.0.5",
     "@types/history": "^5.0.0",
     "@types/jest": "^29.4.0",
@@ -99,9 +101,9 @@
     "@types/react": "^18.2.25",
     "@types/react-dom": "^18.2.11",
     "@types/react-lottie": "^1.2.3",
-    "@types/redux-mock-store": "^1.0.2",
-    "@typescript-eslint/eslint-plugin": "^5.56.0",
-    "@typescript-eslint/parser": "^5.56.0",
+    "@types/redux-mock-store": "^1.0.6",
+    "@typescript-eslint/eslint-plugin": "^6.0.0",
+    "@typescript-eslint/parser": "^6.0.0",
     "axios": "^1.3.0",
     "babel-polyfill": "^6.26.0",
     "babel-preset-cozy-app": "2.1.0",
@@ -110,12 +112,12 @@
     "cozy-jobs-cli": "^2.0.0",
     "eslint": "^8.49.0",
     "eslint-config-prettier": "^9.0.0",
-    "eslint-plugin-jest": "^27.2.3",
-    "eslint-plugin-jsdoc": "^47.0.2",
-    "eslint-plugin-jsx-a11y": "^6.8.0",
+    "eslint-plugin-jest": "^28.8.3",
+    "eslint-plugin-jsdoc": "^50.4.1",
+    "eslint-plugin-jsx-a11y": "^6.10.0",
     "eslint-plugin-prettier": "^5.0.0",
-    "eslint-plugin-react": "7.33.2",
-    "eslint-plugin-react-hooks": "^4.6.0",
+    "eslint-plugin-react": "7.37.1",
+    "eslint-plugin-react-hooks": "^5.0.0",
     "eslint-plugin-testing-library": "^6.2.2",
     "git-directory-deploy": "1.5.1",
     "jest-canvas-mock": "^2.4.0",
diff --git a/scripts/createConnections.js b/scripts/createConnections.ts
similarity index 62%
rename from scripts/createConnections.js
rename to scripts/createConnections.ts
index 80a42cca29c97e4b56491e2be571224144e4e3ff..e8b11a1ba34e7b96444bce58ddfe38277e8c8944 100644
--- a/scripts/createConnections.js
+++ b/scripts/createConnections.ts
@@ -1,6 +1,7 @@
 /* eslint-disable camelcase */
-const axios = require('axios')
-const config = require('./config')
+import axios from 'axios'
+import { Account, Trigger } from 'models'
+import config from './config'
 
 const headers = {
   Accept: 'application/json',
@@ -12,7 +13,7 @@ const headers = {
 const COZY_PREFIX = 'cozy35ba44d2d1749e6f21646edce51e7190'
 
 const ENEDIS_ACCOUNT_ID = '70e68b8450cee09fe2f077610901094d'
-const dataEnedisAccount = JSON.stringify({
+const ENEDIS_ACCOUNT: Partial<Account> = {
   id: ENEDIS_ACCOUNT_ID,
   account_type: 'enedissgegrandlyon',
   name: '',
@@ -31,10 +32,11 @@ const dataEnedisAccount = JSON.stringify({
   },
   identifier: 'address',
   state: null,
-})
+}
+const dataEnedisAccount = JSON.stringify(ENEDIS_ACCOUNT)
 
 const GRDF_ACCOUNT_ID = '89e68b8450cee09fe2f077610901094d'
-const dataGrdfAccount = JSON.stringify({
+const GRDF_ACCOUNT: Partial<Account> = {
   id: GRDF_ACCOUNT_ID,
   account_type: 'grdfgrandlyon',
   auth: {
@@ -44,10 +46,11 @@ const dataGrdfAccount = JSON.stringify({
   },
   identifier: 'login',
   state: null,
-})
+}
+const dataGrdfAccount = JSON.stringify(GRDF_ACCOUNT)
 
 const EGL_ACCOUNT_ID = '90e68b8450cee09fe2f077610901094d'
-const dataEglAccount = JSON.stringify({
+const EGL_ACCOUNT: Partial<Account> = {
   id: EGL_ACCOUNT_ID,
   account_type: 'eglgrandlyon',
   auth: {
@@ -57,83 +60,87 @@ const dataEglAccount = JSON.stringify({
   },
   identifier: 'login',
   state: null,
-})
+}
+const dataEglAccount = JSON.stringify(EGL_ACCOUNT)
 
+const ENEDIS_TRIGGER: Trigger = {
+  _id: '3ed832cec67e6e0b2c6382edd30df11c',
+  domain: 'cozy.tools:8080',
+  prefix: COZY_PREFIX,
+  type: '@cron',
+  worker: 'konnector',
+  arguments: '0 47 8 * * *',
+  debounce: '',
+  options: null,
+  message: {
+    account: ENEDIS_ACCOUNT_ID,
+    konnector: 'enedissgegrandlyon',
+  },
+  cozyMetadata: {
+    doctypeVersion: '1',
+    metadataVersion: 1,
+    createdAt: '2020-10-09T08:00:00.6092798Z',
+    createdByApp: 'ecolyo',
+    updatedAt: '2020-10-09T08:00:00.6092798Z',
+  },
+}
 const dataEnedisTrigger = JSON.stringify({
   data: {
-    attributes: {
-      _id: '3ed832cec67e6e0b2c6382edd30df11c',
-      domain: 'cozy.tools:8080',
-      prefix: COZY_PREFIX,
-      type: '@cron',
-      worker: 'konnector',
-      arguments: '0 47 8 * * *',
-      debounce: '',
-      options: null,
-      message: {
-        account: ENEDIS_ACCOUNT_ID,
-        konnector: 'enedissgegrandlyon',
-      },
-      cozyMetadata: {
-        doctypeVersion: '1',
-        metadataVersion: 1,
-        createdAt: '2020-10-09T08:00:00.6092798Z',
-        createdByApp: 'ecolyo',
-        updatedAt: '2020-10-09T08:00:00.6092798Z',
-      },
-    },
+    attributes: ENEDIS_TRIGGER,
   },
 })
 
+const GRDF_TRIGGER: Trigger = {
+  _id: '4ed832cec67e6e0b2c6382edd30df11c',
+  domain: 'cozy.tools:8080',
+  prefix: COZY_PREFIX,
+  type: '@cron',
+  worker: 'konnector',
+  arguments: '0 47 8 * * *',
+  debounce: '',
+  options: null,
+  message: {
+    account: GRDF_ACCOUNT_ID,
+    konnector: 'grdfgrandlyon',
+  },
+  cozyMetadata: {
+    doctypeVersion: '1',
+    metadataVersion: 1,
+    createdAt: '2020-10-09T08:00:00.6092798Z',
+    createdByApp: 'ecolyo',
+    updatedAt: '2020-10-09T08:00:00.6092798Z',
+  },
+}
 const dataGrdfTrigger = JSON.stringify({
   data: {
-    attributes: {
-      _id: '4ed832cec67e6e0b2c6382edd30df11c',
-      domain: 'cozy.tools:8080',
-      prefix: COZY_PREFIX,
-      type: '@cron',
-      worker: 'konnector',
-      arguments: '0 47 8 * * *',
-      debounce: '',
-      options: null,
-      message: {
-        account: GRDF_ACCOUNT_ID,
-        konnector: 'grdfgrandlyon',
-      },
-      cozyMetadata: {
-        doctypeVersion: '1',
-        metadataVersion: 1,
-        createdAt: '2020-10-09T08:00:00.6092798Z',
-        createdByApp: 'ecolyo',
-        updatedAt: '2020-10-09T08:00:00.6092798Z',
-      },
-    },
+    attributes: GRDF_TRIGGER,
   },
 })
 
+const EGL_TRIGGER: Trigger = {
+  _id: '5ed832cec67e6e0b2c6382edd30df11c',
+  domain: 'cozy.tools:8080',
+  prefix: COZY_PREFIX,
+  type: '@cron',
+  worker: 'konnector',
+  arguments: '0 47 8 * * *',
+  debounce: '',
+  options: null,
+  message: {
+    account: EGL_ACCOUNT_ID,
+    konnector: 'eglgrandlyon',
+  },
+  cozyMetadata: {
+    doctypeVersion: '1',
+    metadataVersion: 1,
+    createdAt: '2020-10-09T08:00:00.6092798Z',
+    createdByApp: 'ecolyo',
+    updatedAt: '2020-10-09T08:00:00.6092798Z',
+  },
+}
 const dataEglTrigger = JSON.stringify({
   data: {
-    attributes: {
-      _id: '5ed832cec67e6e0b2c6382edd30df11c',
-      domain: 'cozy.tools:8080',
-      prefix: COZY_PREFIX,
-      type: '@cron',
-      worker: 'konnector',
-      arguments: '0 47 8 * * *',
-      debounce: '',
-      options: null,
-      message: {
-        account: EGL_ACCOUNT_ID,
-        konnector: 'eglgrandlyon',
-      },
-      cozyMetadata: {
-        doctypeVersion: '1',
-        metadataVersion: 1,
-        createdAt: '2020-10-09T08:00:00.6092798Z',
-        createdByApp: 'ecolyo',
-        updatedAt: '2020-10-09T08:00:00.6092798Z',
-      },
-    },
+    attributes: EGL_TRIGGER,
   },
 })
 
diff --git a/scripts/createDayDataFiles.js b/scripts/createDayDataFiles.ts
similarity index 75%
rename from scripts/createDayDataFiles.js
rename to scripts/createDayDataFiles.ts
index 1302b0384c784baaba9e3df4b934989f1e2c5f3b..5e3870b7393739b1df9013ebdf392cb311d94ad3 100644
--- a/scripts/createDayDataFiles.js
+++ b/scripts/createDayDataFiles.ts
@@ -1,20 +1,31 @@
+import { FluidType } from 'enums'
+import fs from 'fs'
+import { DateTime } from 'luxon'
+import { DataloadEntity } from 'models'
+import config from './config'
+const fluidConfig = require('../src/constants/config.json').fluidConfig
+
 /*
  * Create dummy data files for each fluid.
  * Hourly data is not generated
  */
-const fs = require('fs')
-const { DateTime } = require('luxon')
-const config = require('./config')
 
-function getRandomNumber(min, max) {
-  // Generate a random float between min and max
+type IMockData = Omit<DataloadEntity, 'id'>
+
+/** Generate a random float between min and max */
+function getRandomNumber(min: number, max: number) {
   let randomFloat = Math.random() * (max - min) + min
   // Round to two decimal places
   randomFloat = Math.round(randomFloat * 100) / 100
   return randomFloat
 }
 
-const generateHalfAnHourData = (startingDate, endingDate, min, max) => {
+const generateHalfAnHourData = (
+  startingDate: DateTime,
+  endingDate: DateTime,
+  min: number,
+  max: number
+) => {
   let parsingDate = DateTime.local(
     startingDate.year,
     startingDate.month,
@@ -22,7 +33,7 @@ const generateHalfAnHourData = (startingDate, endingDate, min, max) => {
     0,
     0
   )
-  const halfAnHourDumpArray = []
+  const halfAnHourDumpArray: IMockData[] = []
   while (parsingDate <= endingDate) {
     const load = getRandomNumber(min, max)
     halfAnHourDumpArray.push({
@@ -32,19 +43,26 @@ const generateHalfAnHourData = (startingDate, endingDate, min, max) => {
       day: parsingDate.day,
       hour: parsingDate.hour,
       minute: parsingDate.minute,
+      price: load * fluidConfig[0].coefficient,
     })
     parsingDate = parsingDate.plus({ minute: 30 })
   }
   return halfAnHourDumpArray
 }
 
-const generateData = (startingDate, endingDate, min, max) => {
+const generateData = (
+  startingDate: DateTime,
+  endingDate: DateTime,
+  min: number,
+  max: number,
+  fluidType: FluidType
+) => {
   let parsingDate = DateTime.local(
     startingDate.year,
     startingDate.month,
     startingDate.day
   )
-  const dayDumpArray = []
+  const dayDumpArray: IMockData[] = []
   while (parsingDate <= endingDate) {
     const load = getRandomNumber(min, max)
     dayDumpArray.push({
@@ -54,17 +72,18 @@ const generateData = (startingDate, endingDate, min, max) => {
       day: parsingDate.day,
       hour: 0,
       minute: 0,
+      price: load * fluidConfig[fluidType].coefficient,
     })
     parsingDate = parsingDate.plus({ days: 1 })
   }
   return dayDumpArray
 }
 
-// Function to aggregate load data for a specific period
-function aggregateLoadData(data, period) {
-  const aggregatedData = {}
+/** Function to aggregate load data for a specific period */
+function aggregateLoadData(data: IMockData[], period: string) {
+  const aggregatedData: Record<string, IMockData> = {}
   data.forEach(entry => {
-    let key
+    let key = ''
     const entryCopy = { ...entry }
     switch (period) {
       case 'day':
@@ -94,11 +113,16 @@ function aggregateLoadData(data, period) {
         day: entryCopy.day,
         hour: entryCopy.hour,
         minute: entryCopy.minute,
+        price: entryCopy.price,
       }
     } else {
       aggregatedData[key].load += entryCopy.load
+      if (aggregatedData[key].price !== undefined) {
+        aggregatedData[key].price = 0
+      }
     }
   })
+
   return Object.values(aggregatedData)
 }
 
@@ -125,17 +149,18 @@ const elecGeneratedDayData = generateData(
   startingDate,
   halfHourStartingDate.minus({ days: 1 }),
   4,
-  8
+  8,
+  0
 )
 const elecDayData = [...elecAggregatedDayData, ...elecGeneratedDayData]
 const elecMonthData = aggregateLoadData(elecDayData, 'month')
 const elecYearData = aggregateLoadData(elecMonthData, 'year')
 
-const gasDayData = generateData(startingDate, endingDate, 16, 68)
+const gasDayData = generateData(startingDate, endingDate, 16, 68, 2)
 const gasMonthData = aggregateLoadData(gasDayData, 'month')
 const gasYearData = aggregateLoadData(gasMonthData, 'year')
 
-const waterDayData = generateData(startingDate, endingDate, 200, 300)
+const waterDayData = generateData(startingDate, endingDate, 200, 300, 1)
 const waterMonthData = aggregateLoadData(waterDayData, 'month')
 const waterYearData = aggregateLoadData(waterMonthData, 'year')
 
@@ -156,6 +181,6 @@ const dump = {
 
 const dumpString = JSON.stringify(dump)
 
-fs.writeFile('data/loads.json', dumpString, function (err) {
+fs.writeFile('data/loads.json', dumpString, function (err: unknown) {
   if (err) console.log('error', err)
 })
diff --git a/src/assets/icons/email/multifluidNoConsumption.png b/src/assets/icons/email/multifluidNoConsumption.png
new file mode 100644
index 0000000000000000000000000000000000000000..198a532c5c340555f63f29be6479eeb7752eede4
Binary files /dev/null and b/src/assets/icons/email/multifluidNoConsumption.png differ
diff --git a/src/assets/icons/ico/euro-crossed.svg b/src/assets/icons/ico/euro-crossed.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1118c616aca1f8a7a5fbc99c89630040d375bc82
--- /dev/null
+++ b/src/assets/icons/ico/euro-crossed.svg
@@ -0,0 +1,7 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect x="0.5" y="0.5" width="11" height="11" rx="5.5" stroke="#1B1C22" />
+  <path d="M9.5 8.5L4 3" stroke="#1B1C22" stroke-linecap="round" />
+  <path fill-rule="evenodd" clip-rule="evenodd"
+    d="M4.29445 4.70867C4.2492 4.80317 4.20873 4.90039 4.17333 5H3.33333C3.15 5 3 5.15 3 5.33333C3 5.51667 3.15 5.66667 3.33333 5.66667H4.02C4.00667 5.77667 4 5.88667 4 6C4 6.11333 4.00667 6.22333 4.02 6.33333H3.33333C3.15 6.33333 3 6.48333 3 6.66667C3 6.85 3.15 7 3.33333 7H4.17333C4.58667 8.16333 5.69333 9 7 9C7.46345 9 7.90137 8.89571 8.29333 8.70755L7.65291 8.06712C7.44768 8.13205 7.22878 8.16667 7 8.16667C6.16333 8.16667 5.44 7.69333 5.08 7H6.58579L5.91912 6.33333H4.86C4.84333 6.22333 4.83333 6.11333 4.83333 6C4.83333 5.88667 4.84333 5.77667 4.86 5.66667H5.25245L4.29445 4.70867ZM6.34784 3.93363C6.5538 3.86847 6.77294 3.83333 7 3.83333C7.41667 3.83333 7.80667 3.95333 8.14 4.15667C8.30667 4.26 8.52333 4.24333 8.66333 4.10333C8.85667 3.91 8.81333 3.59333 8.58 3.45C8.12 3.16667 7.57667 3 7 3C6.53657 3 6.0983 3.10524 5.70719 3.29298L6.34784 3.93363Z"
+    fill="#1B1C22" />
+</svg>
\ No newline at end of file
diff --git a/src/assets/icons/ico/euro-icon.svg b/src/assets/icons/ico/euro-gold.svg
similarity index 100%
rename from src/assets/icons/ico/euro-icon.svg
rename to src/assets/icons/ico/euro-gold.svg
diff --git a/src/assets/icons/ico/euro.svg b/src/assets/icons/ico/euro.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e09b58243a9749c6ac218d98d9af43d235c706d0
--- /dev/null
+++ b/src/assets/icons/ico/euro.svg
@@ -0,0 +1,6 @@
+<svg width="12" height="12" viewBox="0 0 12 12" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <rect x="0.5" y="0.5" width="11" height="11" rx="5.5" stroke="currentColor" />
+  <path
+    d="M7 8.16667C6.16333 8.16667 5.44 7.69333 5.08 7H6.66667C6.85 7 7 6.85 7 6.66667C7 6.48333 6.85 6.33333 6.66667 6.33333H4.86C4.84333 6.22333 4.83333 6.11333 4.83333 6C4.83333 5.88667 4.84333 5.77667 4.86 5.66667H6.66667C6.85 5.66667 7 5.51667 7 5.33333C7 5.15 6.85 5 6.66667 5H5.08C5.44 4.30667 6.16667 3.83333 7 3.83333C7.41667 3.83333 7.80667 3.95333 8.14 4.15667C8.30667 4.26 8.52333 4.24333 8.66333 4.10333C8.85667 3.91 8.81333 3.59333 8.58 3.45C8.12 3.16667 7.57667 3 7 3C5.69333 3 4.58667 3.83667 4.17333 5H3.33333C3.15 5 3 5.15 3 5.33333C3 5.51667 3.15 5.66667 3.33333 5.66667H4.02C4.00667 5.77667 4 5.88667 4 6C4 6.11333 4.00667 6.22333 4.02 6.33333H3.33333C3.15 6.33333 3 6.48333 3 6.66667C3 6.85 3.15 7 3.33333 7H4.17333C4.58667 8.16333 5.69333 9 7 9C7.58 9 8.12 8.83667 8.58 8.55C8.81 8.40667 8.85333 8.08667 8.66 7.89333C8.52 7.75333 8.30333 7.73667 8.13667 7.84333C7.80667 8.05 7.42 8.16667 7 8.16667Z"
+    fill="currentColor" />
+</svg>
\ No newline at end of file
diff --git a/src/components/Action/ActionBegin/ActionBegin.spec.tsx b/src/components/Action/ActionBegin/ActionBegin.spec.tsx
index 99bab9320fa6c3606ad87e4aa26ae48d12fb5808..1b9a39cd673a8469b693c38b939c7dc41aaaac36 100644
--- a/src/components/Action/ActionBegin/ActionBegin.spec.tsx
+++ b/src/components/Action/ActionBegin/ActionBegin.spec.tsx
@@ -36,6 +36,7 @@ describe('ActionBegin component', () => {
           action={defaultEcogestureData[1]}
           setShowList={jest.fn()}
           userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
@@ -58,6 +59,7 @@ describe('ActionBegin component', () => {
           action={mockedEcogesturesData[1]}
           setShowList={jest.fn()}
           userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
@@ -76,6 +78,7 @@ describe('ActionBegin component', () => {
           action={defaultEcogestureData[1]}
           setShowList={jest.fn()}
           userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
diff --git a/src/components/Action/ActionBegin/ActionBegin.tsx b/src/components/Action/ActionBegin/ActionBegin.tsx
index 50281d6965e06d6d98e6d0653ae37a159d685318..e99da54cbc2576c39c568ded52efce2c841d7576 100644
--- a/src/components/Action/ActionBegin/ActionBegin.tsx
+++ b/src/components/Action/ActionBegin/ActionBegin.tsx
@@ -4,9 +4,9 @@ import ActionModal from 'components/Action/ActionModal/ActionModal'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import StarsContainer from 'components/CommonKit/StarsContainer/StarsContainer'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { Ecogesture, UserChallenge } from 'models'
-import React, { useCallback, useEffect, useState } from 'react'
+import React, { useEffect, useState } from 'react'
 import ActionService from 'services/action.service'
 import { useAppSelector } from 'store/hooks'
 import { importIconById } from 'utils/utils'
@@ -16,12 +16,14 @@ interface ActionBeginProps {
   action?: Ecogesture
   setShowList: React.Dispatch<React.SetStateAction<boolean>>
   userChallenge: UserChallenge
+  setFocus: () => void
 }
 
 const ActionBegin = ({
   action,
   setShowList,
   userChallenge,
+  setFocus,
 }: ActionBeginProps) => {
   const { t } = useI18n()
   const client = useClient()
@@ -33,25 +35,26 @@ const ActionBegin = ({
   const [actionIcon, setActionIcon] = useState<string>('')
   const [openLaunchModal, setOpenLaunchModal] = useState<boolean>(false)
 
-  const toggleLaunchModal = useCallback(() => {
-    setOpenLaunchModal(prev => !prev)
-  }, [])
-
   useEffect(() => {
     let subscribed = true
     const getAction = async () => {
-      if (action) {
-        if (subscribed) setCurrentAction(action)
-      } else {
-        const actionService = new ActionService(client)
-        let actions: Ecogesture[] = []
-        if (isProfileTypeCompleted) {
-          actions = await actionService.getCustomActions(fluidTypes)
+      if (subscribed) {
+        if (action) {
+          setCurrentAction(action)
+          const icon = await importIconById(action.id, 'ecogesture')
+          setActionIcon(icon || defaultIcon)
         } else {
-          actions = await actionService.getDefaultActions()
-        }
-        if (subscribed) {
+          const actionService = new ActionService(client)
+          let actions: Ecogesture[] = []
+          if (isProfileTypeCompleted) {
+            actions = await actionService.getCustomActions(fluidTypes)
+          } else {
+            actions = await actionService.getDefaultActions()
+          }
+
           setCurrentAction(actions[0])
+          const icon = await importIconById(actions[0].id, 'ecogesture')
+          setActionIcon(icon || defaultIcon)
         }
       }
     }
@@ -61,16 +64,6 @@ const ActionBegin = ({
     }
   }, [action, client, fluidTypes, isProfileTypeCompleted])
 
-  useEffect(() => {
-    async function handleEcogestureIcon() {
-      if (currentAction) {
-        const icon = await importIconById(currentAction.id, 'ecogesture')
-        setActionIcon(icon || defaultIcon)
-      }
-    }
-    handleEcogestureIcon()
-  }, [currentAction])
-
   return (
     <div className="action-begin">
       {currentAction && (
@@ -97,7 +90,10 @@ const ActionBegin = ({
               {currentAction.actionName}
             </div>
             <div className="action-buttons">
-              <Button onClick={toggleLaunchModal} className="btnSecondary">
+              <Button
+                onClick={() => setOpenLaunchModal(true)}
+                className="btnSecondary"
+              >
                 {t('action.apply')}
               </Button>
               <Button
@@ -111,8 +107,9 @@ const ActionBegin = ({
           <ActionModal
             open={openLaunchModal}
             action={currentAction}
-            handleCloseClick={toggleLaunchModal}
+            handleCloseClick={() => setOpenLaunchModal(false)}
             userChallenge={userChallenge}
+            setFocus={setFocus}
           />
         </div>
       )}
diff --git a/src/components/Action/ActionBegin/actionBegin.scss b/src/components/Action/ActionBegin/actionBegin.scss
index 36f0ca97ff68e2ce8b7532a227d8643b709b8abc..f43c66285b2b55829bbd8d225d7f53b54274567b 100644
--- a/src/components/Action/ActionBegin/actionBegin.scss
+++ b/src/components/Action/ActionBegin/actionBegin.scss
@@ -25,7 +25,6 @@
   background: $grey-linear-gradient-background;
   height: auto;
   gap: 1.5rem;
-  max-height: 63svh;
   text-align: center;
   position: relative;
   padding: 5rem 1rem 1rem 1rem;
diff --git a/src/components/Action/ActionCard/ActionCard.spec.tsx b/src/components/Action/ActionCard/ActionCard.spec.tsx
index 44a22ec8a316dfd5f773800f83fed2f55f3d8fb8..ff72792f0fd47ce97480d55aa72e01fc4533066e 100644
--- a/src/components/Action/ActionCard/ActionCard.spec.tsx
+++ b/src/components/Action/ActionCard/ActionCard.spec.tsx
@@ -3,13 +3,17 @@ import { userEvent } from '@testing-library/user-event'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { defaultEcogestureData } from 'tests/__mocks__/actionData.mock'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockChallengeState,
+} from 'tests/__mocks__/store'
 import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
 import ActionCard from './ActionCard'
 
 describe('ActionCard component', () => {
   const store = createMockEcolyoStore({
     challenge: {
+      ...mockChallengeState,
       currentChallenge: userChallengeData[1],
     },
   })
@@ -20,6 +24,7 @@ describe('ActionCard component', () => {
           setShowList={jest.fn()}
           setSelectedAction={jest.fn()}
           action={defaultEcogestureData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
@@ -33,6 +38,7 @@ describe('ActionCard component', () => {
           setShowList={jest.fn()}
           setSelectedAction={jest.fn()}
           action={defaultEcogestureData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
diff --git a/src/components/Action/ActionCard/ActionCard.tsx b/src/components/Action/ActionCard/ActionCard.tsx
index b14f909d5324041a112bc3a0538d48ef63028282..a4aea07a27a27b2f67ce6b0d06e316cc081ef6fc 100644
--- a/src/components/Action/ActionCard/ActionCard.tsx
+++ b/src/components/Action/ActionCard/ActionCard.tsx
@@ -11,24 +11,24 @@ interface ActionCardProps {
   action: Ecogesture
   setSelectedAction: React.Dispatch<React.SetStateAction<Ecogesture | null>>
   setShowList: React.Dispatch<React.SetStateAction<boolean>>
+  setFocus: () => void
 }
 
 const ActionCard = ({
   action,
   setSelectedAction,
   setShowList,
+  setFocus,
 }: ActionCardProps) => {
   const [actionIcon, setActionIcon] = useState<string>('')
   const [openEcogestureModal, setOpenEcogestureModal] = useState<boolean>(false)
-  const toggleModal = useCallback(() => {
-    setOpenEcogestureModal(prev => !prev)
-  }, [])
 
   const selectEcogesture = useCallback(() => {
     setSelectedAction(action)
     setShowList(false)
-    toggleModal()
-  }, [setSelectedAction, setShowList, action, toggleModal])
+    setOpenEcogestureModal(false)
+    setFocus()
+  }, [setSelectedAction, action, setShowList, setFocus])
 
   useEffect(() => {
     async function handleEcogestureIcon() {
@@ -41,7 +41,11 @@ const ActionCard = ({
   return (
     <>
       {action && (
-        <Button key={action.id} className="action-card" onClick={toggleModal}>
+        <Button
+          key={action.id}
+          className="action-card"
+          onClick={() => setOpenEcogestureModal(true)}
+        >
           <StyledIcon className="action-icon" icon={actionIcon} size={100} />
           <div className="action-title text-18-bold">{action.shortName}</div>
         </Button>
@@ -51,7 +55,7 @@ const ActionCard = ({
           open={openEcogestureModal}
           ecogesture={action}
           isAction={true}
-          handleCloseClick={toggleModal}
+          handleCloseClick={() => setOpenEcogestureModal(false)}
           selectEcogesture={selectEcogesture}
         />
       )}
diff --git a/src/components/Action/ActionChoose/ActionChoose.scss b/src/components/Action/ActionChoose/ActionChoose.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a7ab9a15adc0714e1882ca294a9d9250563d6844
--- /dev/null
+++ b/src/components/Action/ActionChoose/ActionChoose.scss
@@ -0,0 +1,5 @@
+.action-content-view {
+  width: 100%;
+  margin: auto;
+  outline: none;
+}
diff --git a/src/components/Action/ActionChoose/ActionChoose.spec.tsx b/src/components/Action/ActionChoose/ActionChoose.spec.tsx
index 936d23c5f8b50519f15a656dd8338415d5fde881..4f556e86b365cccc6c3c1a0ec7349f66527c4972 100644
--- a/src/components/Action/ActionChoose/ActionChoose.spec.tsx
+++ b/src/components/Action/ActionChoose/ActionChoose.spec.tsx
@@ -12,7 +12,6 @@ import {
 import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
 import ActionChoose from './ActionChoose'
 
-// jest.mock('components/Action/ActionBegin/ActionBegin', () => 'mock-ActionBegin')
 jest.mock('components/Action/ActionList/ActionList', () => 'mock-ActionList')
 
 jest.mock('services/ecogesture.service', () => {
@@ -43,7 +42,10 @@ describe('ActionChoose component', () => {
     ])
     const { container } = render(
       <Provider store={store}>
-        <ActionChoose userChallenge={userChallengeData[1]} />
+        <ActionChoose
+          userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
+        />
       </Provider>
     )
     await waitFor(() => null, { container })
@@ -65,7 +67,10 @@ describe('ActionChoose component', () => {
 
     const { container } = render(
       <Provider store={store}>
-        <ActionChoose userChallenge={userChallengeData[1]} />
+        <ActionChoose
+          userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
+        />
       </Provider>
     )
     await waitFor(() => null, { container })
diff --git a/src/components/Action/ActionChoose/ActionChoose.tsx b/src/components/Action/ActionChoose/ActionChoose.tsx
index b1e7d3ad7da0a3e597a1281a0b25a2121b73d474..d6fb6cb23363f73fbc8dd2040e87aa6b293803b2 100644
--- a/src/components/Action/ActionChoose/ActionChoose.tsx
+++ b/src/components/Action/ActionChoose/ActionChoose.tsx
@@ -2,26 +2,35 @@ import { Ecogesture, UserChallenge } from 'models'
 import React, { useState } from 'react'
 import ActionBegin from '../ActionBegin/ActionBegin'
 import ActionList from '../ActionList/ActionList'
+import './ActionChoose.scss'
 
-const ActionChoose = ({ userChallenge }: { userChallenge: UserChallenge }) => {
+const ActionChoose = ({
+  userChallenge,
+  setFocus,
+}: {
+  userChallenge: UserChallenge
+  setFocus: () => void
+}) => {
   const [selectedAction, setSelectedAction] = useState<Ecogesture | null>(null)
   const [showList, setShowList] = useState<boolean>(false)
 
   return (
-    <>
+    <div className="action-content-view">
       {!showList ? (
         <ActionBegin
           action={selectedAction ?? undefined}
           setShowList={setShowList}
           userChallenge={userChallenge}
+          setFocus={setFocus}
         />
       ) : (
         <ActionList
           setSelectedAction={setSelectedAction}
           setShowList={setShowList}
+          setFocus={setFocus}
         />
       )}
-    </>
+    </div>
   )
 }
 
diff --git a/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap b/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap
index 07ca33e2f1dac1835822ac668fee8ee5fbe887ed..8d568d329feda6361e1e509315a0d4ea85071cc4 100644
--- a/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap
+++ b/src/components/Action/ActionChoose/__snapshots__/ActionChoose.spec.tsx.snap
@@ -3,120 +3,124 @@
 exports[`ActionChoose component should render correctly 1`] = `
 <div>
   <div
-    class="action-begin"
+    class="action-content-view"
   >
     <div
-      class="action-container"
+      class="action-begin"
     >
       <div
-        class="action-begin-container"
+        class="action-container"
       >
         <div
-          class="icon-container"
+          class="action-begin-container"
         >
-          <svg
-            aria-hidden="true"
-            class="action-icon styles__icon___23x3R"
-            height="100"
-            width="100"
+          <div
+            class="icon-container"
           >
-            <use
-              xlink:href="#"
-            />
-          </svg>
-        </div>
-        <div
-          class="stars"
-        >
-          <svg
-            aria-hidden="true"
-            class="star styles__icon___23x3R"
-            height="25"
-            width="25"
-          >
-            <use
-              xlink:href="#test-file-stub"
-            />
-          </svg>
-          <svg
-            aria-hidden="true"
-            class="star styles__icon___23x3R"
-            height="25"
-            width="25"
-          >
-            <use
-              xlink:href="#test-file-stub"
-            />
-          </svg>
-          <svg
-            aria-hidden="true"
-            class="star styles__icon___23x3R"
-            height="25"
-            width="25"
+            <svg
+              aria-hidden="true"
+              class="action-icon styles__icon___23x3R"
+              height="100"
+              width="100"
+            >
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+          </div>
+          <div
+            class="stars"
           >
-            <use
-              xlink:href="#test-file-stub"
-            />
-          </svg>
-          <svg
-            aria-hidden="true"
-            class="star styles__icon___23x3R"
-            height="25"
-            width="25"
+            <svg
+              aria-hidden="true"
+              class="star styles__icon___23x3R"
+              height="25"
+              width="25"
+            >
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+            <svg
+              aria-hidden="true"
+              class="star styles__icon___23x3R"
+              height="25"
+              width="25"
+            >
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+            <svg
+              aria-hidden="true"
+              class="star styles__icon___23x3R"
+              height="25"
+              width="25"
+            >
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+            <svg
+              aria-hidden="true"
+              class="star styles__icon___23x3R"
+              height="25"
+              width="25"
+            >
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+            <svg
+              aria-hidden="true"
+              class="star styles__icon___23x3R"
+              height="25"
+              width="25"
+            >
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+          </div>
+          <h1
+            class="text-20-bold"
           >
-            <use
-              xlink:href="#test-file-stub"
-            />
-          </svg>
-          <svg
-            aria-hidden="true"
-            class="star styles__icon___23x3R"
-            height="25"
-            width="25"
+            Bonhomme de neige
+          </h1>
+          <div
+            class="action-duration text-18"
           >
-            <use
-              xlink:href="#test-file-stub"
-            />
-          </svg>
-        </div>
-        <h1
-          class="text-20-bold"
-        >
-          Bonhomme de neige
-        </h1>
-        <div
-          class="action-duration text-18"
-        >
-          action.duration
-        </div>
-        <div
-          class="action-text text-18-bold"
-        />
-        <div
-          class="action-buttons"
-        >
-          <button
-            class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
-            tabindex="0"
-            type="button"
+            action.duration
+          </div>
+          <div
+            class="action-text text-18-bold"
+          />
+          <div
+            class="action-buttons"
           >
-            <span
-              class="MuiButton-label"
+            <button
+              class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
+              tabindex="0"
+              type="button"
             >
-              action.apply
-            </span>
-          </button>
-          <button
-            class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
-            tabindex="0"
-            type="button"
-          >
-            <span
-              class="MuiButton-label"
+              <span
+                class="MuiButton-label"
+              >
+                action.apply
+              </span>
+            </button>
+            <button
+              class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
+              tabindex="0"
+              type="button"
             >
-              action.other
-            </span>
-          </button>
+              <span
+                class="MuiButton-label"
+              >
+                action.other
+              </span>
+            </button>
+          </div>
         </div>
       </div>
     </div>
diff --git a/src/components/Action/ActionDone/ActionDone.spec.tsx b/src/components/Action/ActionDone/ActionDone.spec.tsx
index 038a6dd206fee247504430ae81e435a579e305b0..f377200ae1ac9975b1c0611ae2401f70bda628eb 100644
--- a/src/components/Action/ActionDone/ActionDone.spec.tsx
+++ b/src/components/Action/ActionDone/ActionDone.spec.tsx
@@ -16,7 +16,7 @@ jest.mock('services/challenge.service', () => {
 
 describe('ActionDone component', () => {
   const store = createMockEcolyoStore()
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <ActionDone currentChallenge={userChallengeData[1]} />
diff --git a/src/components/Action/ActionDone/ActionDone.tsx b/src/components/Action/ActionDone/ActionDone.tsx
index 40c5a4b4897192c73f977faa62537933d5707e79..218c2dec90673f51948c373ae05ffe1d66cb49aa 100644
--- a/src/components/Action/ActionDone/ActionDone.tsx
+++ b/src/components/Action/ActionDone/ActionDone.tsx
@@ -2,7 +2,7 @@ import { Button } from '@material-ui/core'
 import starFilled from 'assets/icons/visu/challenge/starFilled.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { UserChallenge } from 'models'
 import React, { useCallback } from 'react'
diff --git a/src/components/Action/ActionList/ActionList.spec.tsx b/src/components/Action/ActionList/ActionList.spec.tsx
index d18557624a55ff37a41dd51094a74d6b838c5c8e..3fd43aeb1af9a3083bb8b5139d3ad6aa6043418a 100644
--- a/src/components/Action/ActionList/ActionList.spec.tsx
+++ b/src/components/Action/ActionList/ActionList.spec.tsx
@@ -5,6 +5,7 @@ import { defaultEcogestureData } from 'tests/__mocks__/actionData.mock'
 import {
   createMockEcolyoStore,
   mockChallengeState,
+  mockGlobalState,
   mockProfileState,
 } from 'tests/__mocks__/store'
 import ActionList from './ActionList'
@@ -22,12 +23,16 @@ describe('ActionList component', () => {
     mockGetDefaultActions.mockResolvedValueOnce(defaultEcogestureData)
     const store = createMockEcolyoStore({
       challenge: { ...mockChallengeState },
-      global: { fluidTypes: [0, 1, 2] },
+      global: { ...mockGlobalState, fluidTypes: [0, 1, 2] },
       profile: mockProfileState,
     })
     const { container } = render(
       <Provider store={store}>
-        <ActionList setSelectedAction={jest.fn()} setShowList={jest.fn()} />
+        <ActionList
+          setSelectedAction={jest.fn()}
+          setShowList={jest.fn()}
+          setFocus={jest.fn()}
+        />
       </Provider>
     )
     await waitFor(() => null, { container })
diff --git a/src/components/Action/ActionList/ActionList.tsx b/src/components/Action/ActionList/ActionList.tsx
index b79e28bc2c2ebf569577c2506278007f063d01a9..0b35b952d93524d2e2ed610aa5cc8f6ab820e89c 100644
--- a/src/components/Action/ActionList/ActionList.tsx
+++ b/src/components/Action/ActionList/ActionList.tsx
@@ -9,9 +9,14 @@ import './actionList.scss'
 interface ActionListProps {
   setSelectedAction: React.Dispatch<React.SetStateAction<Ecogesture | null>>
   setShowList: React.Dispatch<React.SetStateAction<boolean>>
+  setFocus: () => void
 }
 
-const ActionList = ({ setSelectedAction, setShowList }: ActionListProps) => {
+const ActionList = ({
+  setSelectedAction,
+  setShowList,
+  setFocus,
+}: ActionListProps) => {
   const client = useClient()
   const {
     global: { fluidTypes },
@@ -29,34 +34,31 @@ const ActionList = ({ setSelectedAction, setShowList }: ActionListProps) => {
       } else {
         actionList = await actionService.getDefaultActions()
       }
-      if (subscribed) {
-        setActions(actionList)
-      }
+      setActions(actionList)
     }
-    getActions()
+    subscribed && getActions()
     return () => {
       subscribed = false
     }
   }, [client, isProfileTypeCompleted, fluidTypes])
 
-  return (
-    <>
-      {actions && (
-        <div className="action-list-container">
-          {actions.map(action => {
-            return (
-              <ActionCard
-                key={action.id}
-                action={action}
-                setSelectedAction={setSelectedAction}
-                setShowList={setShowList}
-              />
-            )
-          })}
-        </div>
-      )}
-    </>
-  )
+  if (actions) {
+    return (
+      <div className="action-list-container">
+        {actions.map(action => (
+          <ActionCard
+            key={action.id}
+            action={action}
+            setSelectedAction={setSelectedAction}
+            setShowList={setShowList}
+            setFocus={setFocus}
+          />
+        ))}
+      </div>
+    )
+  }
+
+  return null
 }
 
 export default ActionList
diff --git a/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap b/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap
index e1772af32ac582ed39669e5e3220281fed659749..3d7043616ac3dc6220045b31bd66a2b9b5fa74f5 100644
--- a/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap
+++ b/src/components/Action/ActionList/__snapshots__/ActionList.spec.tsx.snap
@@ -13,16 +13,6 @@ exports[`ActionList component should match snapshot and render correctly 3 butto
       <span
         class="MuiButton-label"
       >
-        <svg
-          aria-hidden="true"
-          class="action-icon styles__icon___23x3R"
-          height="100"
-          width="100"
-        >
-          <use
-            xlink:href="#"
-          />
-        </svg>
         <div
           class="action-title text-18-bold"
         >
@@ -38,16 +28,6 @@ exports[`ActionList component should match snapshot and render correctly 3 butto
       <span
         class="MuiButton-label"
       >
-        <svg
-          aria-hidden="true"
-          class="action-icon styles__icon___23x3R"
-          height="100"
-          width="100"
-        >
-          <use
-            xlink:href="#"
-          />
-        </svg>
         <div
           class="action-title text-18-bold"
         >
@@ -63,16 +43,6 @@ exports[`ActionList component should match snapshot and render correctly 3 butto
       <span
         class="MuiButton-label"
       >
-        <svg
-          aria-hidden="true"
-          class="action-icon styles__icon___23x3R"
-          height="100"
-          width="100"
-        >
-          <use
-            xlink:href="#"
-          />
-        </svg>
         <div
           class="action-title text-18-bold"
         >
diff --git a/src/components/Action/ActionModal/ActionModal.spec.tsx b/src/components/Action/ActionModal/ActionModal.spec.tsx
index 138d005c3e36aa4cecbea8a50376afe0ac90490b..37e94eda6c1e803758c3574930f5a831d1fb9a30 100644
--- a/src/components/Action/ActionModal/ActionModal.spec.tsx
+++ b/src/components/Action/ActionModal/ActionModal.spec.tsx
@@ -17,7 +17,7 @@ jest.mock('services/challenge.service', () => {
 
 describe('ActionModal component', () => {
   const store = createMockEcolyoStore()
-  it('should render correctly', async () => {
+  it('should render correctly', () => {
     const { baseElement } = render(
       <Provider store={store}>
         <ActionModal
@@ -25,6 +25,7 @@ describe('ActionModal component', () => {
           handleCloseClick={jest.fn()}
           action={defaultEcogestureData[1]}
           userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
@@ -44,6 +45,7 @@ describe('ActionModal component', () => {
           handleCloseClick={jest.fn()}
           action={defaultEcogestureData[1]}
           userChallenge={userChallengeData[1]}
+          setFocus={jest.fn()}
         />
       </Provider>
     )
diff --git a/src/components/Action/ActionModal/ActionModal.tsx b/src/components/Action/ActionModal/ActionModal.tsx
index 8cd832e88df0deb8dbaf0598c1f83e2fbe282f69..ac703d65cb3577afc5757d66cfc3530098e178a5 100644
--- a/src/components/Action/ActionModal/ActionModal.tsx
+++ b/src/components/Action/ActionModal/ActionModal.tsx
@@ -1,9 +1,9 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
 import chronoMini from 'assets/icons/visu/action/chrono-mini.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { Ecogesture, UserChallenge } from 'models'
 import React, { useCallback } from 'react'
@@ -17,6 +17,7 @@ interface ActionModalProps {
   action: Ecogesture
   handleCloseClick: () => void
   userChallenge: UserChallenge
+  setFocus: () => void
 }
 
 const ActionModal = ({
@@ -24,6 +25,7 @@ const ActionModal = ({
   action,
   handleCloseClick,
   userChallenge,
+  setFocus,
 }: ActionModalProps) => {
   const client = useClient()
   const { t } = useI18n()
@@ -38,7 +40,8 @@ const ActionModal = ({
       action
     )
     dispatch(updateUserChallengeList(updatedChallenge))
-  }, [action, client, dispatch, userChallenge])
+    setFocus()
+  }, [action, client, dispatch, setFocus, userChallenge])
 
   return (
     <Dialog
@@ -54,7 +57,7 @@ const ActionModal = ({
         {t('action_modal.accessibility.window_title')}
       </div>
       <div className="action-modal">
-        <Icon icon={chronoMini} size={75} />
+        <StyledIcon icon={chronoMini} size={75} />
         <div className="action-title text-16-normal">
           {t('action.duration', {
             smartCount: action.actionDuration,
diff --git a/src/components/Action/ActionModal/__snapshots__/ActionModal.spec.tsx.snap b/src/components/Action/ActionModal/__snapshots__/ActionModal.spec.tsx.snap
index 2825edc3a9a03ccf4537cc5e822eafeab09ec7d3..fb6e52597e2479213b713a43fa9883b8e8f7719c 100644
--- a/src/components/Action/ActionModal/__snapshots__/ActionModal.spec.tsx.snap
+++ b/src/components/Action/ActionModal/__snapshots__/ActionModal.spec.tsx.snap
@@ -41,6 +41,7 @@ exports[`ActionModal component should render correctly 1`] = `
           class="action-modal"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="75"
             width="75"
diff --git a/src/components/Action/ActionOnGoing/ActionOnGoing.tsx b/src/components/Action/ActionOnGoing/ActionOnGoing.tsx
index 81d15d6abb3eaec8e75a98ac99d64f00f6799e3b..1fcff5c0dae00c18538f6c79fb2fc2ae2c9d3186 100644
--- a/src/components/Action/ActionOnGoing/ActionOnGoing.tsx
+++ b/src/components/Action/ActionOnGoing/ActionOnGoing.tsx
@@ -2,8 +2,7 @@ import { Button } from '@material-ui/core'
 import ClockIcon from 'assets/icons/visu/action/duration-clock.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import EcogestureModal from 'components/Ecogesture/EcogestureModal/EcogestureModal'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import { DateTime } from 'luxon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserAction } from 'models'
 import React, { useCallback, useState } from 'react'
 import './actionOnGoing.scss'
@@ -12,10 +11,6 @@ const ActionOnGoing = ({ userAction }: { userAction: UserAction }) => {
   const { t } = useI18n()
   const [openEcogestureModal, setOpenEcogestureModal] = useState<boolean>(false)
 
-  const toggleEcogestureModal = useCallback(() => {
-    setOpenEcogestureModal(prev => !prev)
-  }, [setOpenEcogestureModal])
-
   const setGradient = useCallback(() => {
     if (!userAction.startDate || !userAction.ecogesture) return null
 
@@ -55,9 +50,9 @@ const ActionOnGoing = ({ userAction }: { userAction: UserAction }) => {
 
   const getResultDate = useCallback(() => {
     if (userAction.startDate && userAction.ecogesture) {
-      const startDate: DateTime = userAction.startDate
-      const durationInHours: number = userAction.ecogesture.actionDuration * 24
-      const resultDate: string = startDate
+      const startDate = userAction.startDate
+      const durationInHours = userAction.ecogesture.actionDuration * 24
+      const resultDate = startDate
         .plus({ hours: durationInHours })
         .setLocale('fr')
         .toFormat('cccc dd LLLL')
@@ -88,14 +83,17 @@ const ActionOnGoing = ({ userAction }: { userAction: UserAction }) => {
           </div>
           <div className="result-title text-18-bold"> {t('action.result')}</div>
           <div className="result-date text-24-bold">{getResultDate()}</div>
-          <Button className="btnSecondary" onClick={toggleEcogestureModal}>
+          <Button
+            className="btnSecondary"
+            onClick={() => setOpenEcogestureModal(true)}
+          >
             {t('action.details')}
           </Button>
           <EcogestureModal
             open={openEcogestureModal}
             ecogesture={userAction.ecogesture}
             isAction={false}
-            handleCloseClick={toggleEcogestureModal}
+            handleCloseClick={() => setOpenEcogestureModal(false)}
           />
         </>
       )}
diff --git a/src/components/Action/ActionView.spec.tsx b/src/components/Action/ActionView.spec.tsx
index 22933cb1b1df0c435f1afc00b8aaf0e5d3458bfe..a6d116988944097f46dbc9fcf1b80896b0fdc12e 100644
--- a/src/components/Action/ActionView.spec.tsx
+++ b/src/components/Action/ActionView.spec.tsx
@@ -3,7 +3,10 @@ import ActionView from 'components/Action/ActionView'
 import { UserActionState } from 'enums'
 import React from 'react'
 import { Provider } from 'react-redux'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockChallengeState,
+} from 'tests/__mocks__/store'
 import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
 
 jest.mock('components/Header/CozyBar', () => 'mock-cozybar')
@@ -23,9 +26,10 @@ jest.mock(
 )
 
 describe('ActionView component', () => {
-  it('should render match snapshot with "Unstarted" state', async () => {
+  it('should render match snapshot with "Unstarted" state', () => {
     const store = createMockEcolyoStore({
       challenge: {
+        ...mockChallengeState,
         currentChallenge: {
           ...userChallengeData[1],
           action: {
@@ -42,9 +46,10 @@ describe('ActionView component', () => {
     )
     expect(container).toMatchSnapshot()
   })
-  it('should render match snapshot with "onGoing" state', async () => {
+  it('should render match snapshot with "onGoing" state', () => {
     const store = createMockEcolyoStore({
       challenge: {
+        ...mockChallengeState,
         currentChallenge: {
           ...userChallengeData[1],
           action: {
@@ -61,9 +66,10 @@ describe('ActionView component', () => {
     )
     expect(container).toMatchSnapshot()
   })
-  it('should render match snapshot with "Notification" state', async () => {
+  it('should render match snapshot with "Notification" state', () => {
     const store = createMockEcolyoStore({
       challenge: {
+        ...mockChallengeState,
         currentChallenge: {
           ...userChallengeData[1],
           action: {
@@ -80,9 +86,10 @@ describe('ActionView component', () => {
     )
     expect(container).toMatchSnapshot()
   })
-  it('should render match snapshot with default case', async () => {
+  it('should render match snapshot with default case', () => {
     const store = createMockEcolyoStore({
       challenge: {
+        ...mockChallengeState,
         currentChallenge: {
           ...userChallengeData[1],
           action: {
diff --git a/src/components/Action/ActionView.tsx b/src/components/Action/ActionView.tsx
index 7b5fbab5d6852111c2d6781d1045870ecc459227..9c04e57df0f28df38b7c475cd27857948e77be46 100644
--- a/src/components/Action/ActionView.tsx
+++ b/src/components/Action/ActionView.tsx
@@ -3,25 +3,34 @@ import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
 import { UserActionState } from 'enums'
 import { UserChallenge } from 'models'
-import React from 'react'
+import React, { useRef } from 'react'
 import { useAppSelector } from 'store/hooks'
 import ActionChoose from './ActionChoose/ActionChoose'
 import ActionDone from './ActionDone/ActionDone'
 import ActionOnGoing from './ActionOnGoing/ActionOnGoing'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/challenges/action
+ */
 const ActionView = () => {
   const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
 
+  const mainContentRef = useRef<HTMLDivElement>(null)
+  const focusMainContent = () => {
+    setTimeout(() => mainContentRef.current?.focus(), 0)
+  }
+
   const renderAction = (challenge: UserChallenge) => {
     switch (challenge.action.state) {
-      case UserActionState.UNSTARTED:
-        return <ActionChoose userChallenge={challenge} />
       case UserActionState.ONGOING:
         return <ActionOnGoing userAction={challenge.action} />
       case UserActionState.NOTIFICATION:
         return <ActionDone currentChallenge={challenge} />
+      case UserActionState.UNSTARTED:
       default:
-        return <ActionChoose userChallenge={challenge} />
+        return (
+          <ActionChoose userChallenge={challenge} setFocus={focusMainContent} />
+        )
     }
   }
 
@@ -29,7 +38,15 @@ const ActionView = () => {
     <>
       <CozyBar titleKey="common.title_action" displayBackArrow={true} />
       <Header desktopTitleKey="common.title_action" displayBackArrow={true} />
-      <Content>{currentChallenge && renderAction(currentChallenge)}</Content>
+      <Content>
+        <div
+          ref={mainContentRef}
+          style={{ outline: 'none', margin: 'auto' }}
+          tabIndex={-1}
+        >
+          {currentChallenge && renderAction(currentChallenge)}
+        </div>
+      </Content>
     </>
   )
 }
diff --git a/src/components/Action/__snapshots__/ActionView.spec.tsx.snap b/src/components/Action/__snapshots__/ActionView.spec.tsx.snap
index cd7ed71bda2e62a0f90c8c17df8c29aee1794b1d..d36bcbeeb7ea41baf27eb56d256fb6ecdc54c90c 100644
--- a/src/components/Action/__snapshots__/ActionView.spec.tsx.snap
+++ b/src/components/Action/__snapshots__/ActionView.spec.tsx.snap
@@ -11,9 +11,14 @@ exports[`ActionView component should render match snapshot with "Notification" s
     displaybackarrow="true"
   />
   <mock-content>
-    <mock-action-done
-      currentchallenge="[object Object]"
-    />
+    <div
+      style="outline: none; margin: auto;"
+      tabindex="-1"
+    >
+      <mock-action-done
+        currentchallenge="[object Object]"
+      />
+    </div>
   </mock-content>
 </div>
 `;
@@ -29,9 +34,14 @@ exports[`ActionView component should render match snapshot with "Unstarted" stat
     displaybackarrow="true"
   />
   <mock-content>
-    <mock-action-choose
-      userchallenge="[object Object]"
-    />
+    <div
+      style="outline: none; margin: auto;"
+      tabindex="-1"
+    >
+      <mock-action-choose
+        userchallenge="[object Object]"
+      />
+    </div>
   </mock-content>
 </div>
 `;
@@ -47,9 +57,14 @@ exports[`ActionView component should render match snapshot with "onGoing" state
     displaybackarrow="true"
   />
   <mock-content>
-    <mock-action-ongoing
-      useraction="[object Object]"
-    />
+    <div
+      style="outline: none; margin: auto;"
+      tabindex="-1"
+    >
+      <mock-action-ongoing
+        useraction="[object Object]"
+      />
+    </div>
   </mock-content>
 </div>
 `;
@@ -65,9 +80,14 @@ exports[`ActionView component should render match snapshot with default case 1`]
     displaybackarrow="true"
   />
   <mock-content>
-    <mock-action-choose
-      userchallenge="[object Object]"
-    />
+    <div
+      style="outline: none; margin: auto;"
+      tabindex="-1"
+    >
+      <mock-action-choose
+        userchallenge="[object Object]"
+      />
+    </div>
   </mock-content>
 </div>
 `;
diff --git a/src/components/Analysis/AnalysisView.spec.tsx b/src/components/Analysis/AnalysisView.spec.tsx
index 6be3d34fd982adc52708f5ae0ee4bb254aecb820..e59782947415c2ee73769306f896030c337d7cc4 100644
--- a/src/components/Analysis/AnalysisView.spec.tsx
+++ b/src/components/Analysis/AnalysisView.spec.tsx
@@ -9,6 +9,7 @@ import {
   createMockEcolyoStore,
   mockAnalysisState,
   mockChartState,
+  mockGlobalState,
   mockProfileState,
 } from 'tests/__mocks__/store'
 
@@ -52,7 +53,7 @@ describe('AnalysisView component', () => {
     const store = createMockEcolyoStore({
       analysis: mockAnalysisState,
       chart: mockChartState,
-      global: { analysisNotification: true },
+      global: { ...mockGlobalState, analysisNotification: true },
       profile: { ...mockProfileState, haveSeenLastAnalysis: true },
     })
     mockAppDispatch.mockReturnValue(jest.fn())
diff --git a/src/components/Analysis/AnalysisView.tsx b/src/components/Analysis/AnalysisView.tsx
index 85e543aca28f0ce4ed04e8fab04ce12505fd3326..34230d6ca8220b8c498fbabfc902936058c1d28c 100644
--- a/src/components/Analysis/AnalysisView.tsx
+++ b/src/components/Analysis/AnalysisView.tsx
@@ -17,6 +17,9 @@ import { updateProfile } from 'store/profile/profile.slice'
 import { isLastDateReached } from 'utils/date'
 import './analysisView.scss'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/analysis
+ */
 const AnalysisView = () => {
   const client = useClient()
   const {
diff --git a/src/components/Analysis/Comparison/Comparison.spec.tsx b/src/components/Analysis/Comparison/Comparison.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..da099dfcb1f40306c8d74b9599a1157a8317477f
--- /dev/null
+++ b/src/components/Analysis/Comparison/Comparison.spec.tsx
@@ -0,0 +1,124 @@
+import { act, render, screen, waitFor } from '@testing-library/react'
+import userEvent from '@testing-library/user-event'
+import { FluidType } from 'enums'
+import { PerformanceIndicator } from 'models'
+import React from 'react'
+import { Provider } from 'react-redux'
+import { setPeriod } from 'store/analysis/analysis.slice'
+import {
+  createMockEcolyoStore,
+  mockAnalysisState,
+  mockGlobalState,
+} from 'tests/__mocks__/store'
+import Comparison from './Comparison'
+
+jest.mock(
+  'components/Analysis/Comparison/TemperatureComparison.tsx',
+  () => 'mock-temperature-comparison'
+)
+
+jest.mock('services/consumption.service', () => {
+  return jest.fn().mockImplementation(() => ({
+    fetchAvgTemperature: jest.fn().mockResolvedValue(25.3),
+    getPerformanceIndicators: jest.fn().mockResolvedValue([]),
+  }))
+})
+
+const mockFluidsWithData = [
+  FluidType.ELECTRICITY,
+  FluidType.WATER,
+  FluidType.GAS,
+]
+
+const mockPerformanceIndicators: PerformanceIndicator[] = [
+  {
+    compareValue: 203.49,
+    percentageVariation: 0.12261044768784712,
+    value: 178.54,
+  },
+  {
+    compareValue: 7926.82,
+    percentageVariation: 0.020542916327102145,
+    value: 7763.98,
+  },
+  {
+    compareValue: 1316.46,
+    percentageVariation: -0.0009191316105312541,
+    value: 1317.67,
+  },
+]
+
+describe('Comparison component', () => {
+  it('renders loading state', async () => {
+    render(
+      <Provider store={createMockEcolyoStore()}>
+        <Comparison fluidsWithData={[]} monthPerformanceIndicators={[]} />
+      </Provider>
+    )
+
+    await waitFor(() => {
+      expect(screen.getByRole('progressbar')).toBeInTheDocument()
+    })
+  })
+
+  it('switches between monthly and yearly periods', async () => {
+    const store = createMockEcolyoStore({
+      analysis: { ...mockAnalysisState, period: 'month' },
+      global: {
+        ...mockGlobalState,
+        fluidTypes: mockFluidsWithData,
+      },
+    })
+
+    const mockDispatch = jest.fn()
+    jest.spyOn(store, 'dispatch').mockImplementation(mockDispatch)
+
+    render(
+      <Provider store={store}>
+        <Comparison
+          fluidsWithData={mockFluidsWithData}
+          monthPerformanceIndicators={mockPerformanceIndicators}
+        />
+      </Provider>
+    )
+
+    const yearlyButton = await screen.findByRole('tab', {
+      name: `analysis.compare.year_tab`,
+    })
+    const monthlyButton = await screen.findByRole('tab', {
+      name: `analysis.compare.month_tab`,
+    })
+
+    await act(async () => {
+      await userEvent.click(yearlyButton)
+      expect(mockDispatch).toHaveBeenCalledWith(setPeriod('year'))
+    })
+
+    await act(async () => {
+      await userEvent.click(monthlyButton)
+      expect(mockDispatch).toHaveBeenCalledWith(setPeriod('month'))
+    })
+  })
+
+  it('renders performance indicators', async () => {
+    const store = createMockEcolyoStore({
+      analysis: { ...mockAnalysisState },
+      global: {
+        ...mockGlobalState,
+        fluidTypes: mockFluidsWithData,
+      },
+    })
+
+    render(
+      <Provider store={store}>
+        <Comparison
+          fluidsWithData={mockFluidsWithData}
+          monthPerformanceIndicators={mockPerformanceIndicators}
+        />
+      </Provider>
+    )
+
+    const indicators = await screen.findAllByRole('listitem')
+    expect(indicators.length).toBe(mockFluidsWithData.length)
+  })
+})
diff --git a/src/components/Analysis/Comparison/Comparison.tsx b/src/components/Analysis/Comparison/Comparison.tsx
index afa648f2e30a0f14085aaa7d0678d0ca748840d9..b16f5c94ea0c3c21406a2f3f5416310d180e3e2a 100644
--- a/src/components/Analysis/Comparison/Comparison.tsx
+++ b/src/components/Analysis/Comparison/Comparison.tsx
@@ -1,14 +1,12 @@
 import { Button } from '@material-ui/core'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep } from 'enums'
 import { PerformanceIndicator } from 'models'
 import React, { useEffect, useMemo, useState } from 'react'
-import { useNavigate } from 'react-router-dom'
 import ConsumptionService from 'services/consumption.service'
 import { setPeriod } from 'store/analysis/analysis.slice'
-import { setCurrentTimeStep, setShowCompare } from 'store/chart/chart.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
 import FluidPerformanceIndicator from './FluidPerformanceIndicator'
 import TemperatureComparison from './TemperatureComparison'
@@ -23,12 +21,11 @@ const Comparison = ({
 }) => {
   const { t } = useI18n()
   const client = useClient()
-  const navigate = useNavigate()
+  const dispatch = useAppDispatch()
   const {
     global: { fluidTypes },
     analysis: { period, analysisMonth },
   } = useAppSelector(state => state.ecolyo)
-  const dispatch = useAppDispatch()
   const [yearPerformanceIndicators, setYearPerformanceIndicators] = useState<
     PerformanceIndicator[]
   >([])
@@ -60,32 +57,30 @@ const Comparison = ({
     fluidsWithData.length * 84 +
     (fluidsWithData.length - 1) * 10 +
     NAVIGATION_HEIGHT
-
   useEffect(() => {
     let subscribed = true
     async function populateData() {
-      if (subscribed) {
-        const fetchedYearIndicators =
-          await consumptionService.getPerformanceIndicators(
-            periods.monthPeriod,
-            TimeStep.MONTH,
-            fluidsWithData,
-            periods.previousYearPeriod
+      const fetchedYearIndicators =
+        await consumptionService.getPerformanceIndicators(
+          periods.monthPeriod,
+          TimeStep.MONTH,
+          fluidsWithData,
+          periods.previousYearPeriod
+        )
+      if (fetchedYearIndicators) {
+        setYearPerformanceIndicators(fetchedYearIndicators)
+        if (
+          fetchedYearIndicators.some(
+            indicator => indicator.value !== 0 || indicator.compareValue !== 0
           )
-        if (fetchedYearIndicators) {
-          setYearPerformanceIndicators(fetchedYearIndicators)
-          if (
-            fetchedYearIndicators.some(
-              indicator => indicator.value !== 0 || indicator.compareValue !== 0
-            )
-          ) {
-            dispatch(setPeriod('year'))
-          }
+        ) {
+          dispatch(setPeriod('year'))
         }
-        setIsLoading(false)
       }
+      setIsLoading(false)
     }
-    populateData()
+
+    subscribed && populateData()
     return () => {
       subscribed = false
     }
@@ -100,44 +95,19 @@ const Comparison = ({
     dispatch,
   ])
 
-  const handleFluidClick = (fluid: FluidType) => {
-    let fluidTypeText: string
-
-    switch (fluid) {
-      case FluidType.ELECTRICITY:
-        fluidTypeText = 'electricity'
-        break
-      case FluidType.WATER:
-        fluidTypeText = 'water'
-        break
-      case FluidType.GAS:
-        fluidTypeText = 'gas'
-        break
-      default:
-        fluidTypeText = 'unknown'
-    }
-
-    const url = `/consumption/${fluidTypeText}`
-    dispatch(setCurrentTimeStep(TimeStep.MONTH))
-    if (period === 'year') {
-      dispatch(setShowCompare(true))
-    } else {
-      dispatch(setShowCompare(false))
-    }
-    navigate(url)
-  }
-
   return (
     <div className="comparison">
       {!isLoading && (
-        <div className="tabs">
+        <div role="tablist" className="tabs">
           <Button
+            role="tab"
             className={period === 'year' ? 'active' : ''}
             onClick={() => dispatch(setPeriod('year'))}
           >
             {t(`analysis.compare.year_tab`)}
           </Button>
           <Button
+            role="tab"
             className={period === 'month' ? 'active' : ''}
             onClick={() => dispatch(setPeriod('month'))}
           >
@@ -146,7 +116,8 @@ const Comparison = ({
         </div>
       )}
 
-      <div className="performanceIndicators">
+      <div role="list" className="performanceIndicators">
+        <TemperatureComparison />
         {isLoading && (
           <div
             style={{
@@ -158,7 +129,6 @@ const Comparison = ({
             <Loader />
           </div>
         )}
-        {!isLoading && <TemperatureComparison />}
         {/* Placeholder when no data is found */}
         {!isLoading &&
           fluidsWithData.length === 0 &&
@@ -189,7 +159,6 @@ const Comparison = ({
                   ? periods.previousMonthPeriod.startDate
                   : periods.previousYearPeriod.startDate
               }
-              onClickHandler={() => handleFluidClick(fluid)}
             />
           ))}
       </div>
diff --git a/src/components/Analysis/Comparison/FluidPerformanceIndicator.spec.tsx b/src/components/Analysis/Comparison/FluidPerformanceIndicator.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..32487e9d45ea6dad7f55f3a589e9c9df973449b4
--- /dev/null
+++ b/src/components/Analysis/Comparison/FluidPerformanceIndicator.spec.tsx
@@ -0,0 +1,138 @@
+import { AnyAction } from '@reduxjs/toolkit'
+import { act, render, screen } from '@testing-library/react'
+import userEvent from '@testing-library/user-event'
+import { FluidType } from 'enums'
+import { DateTime } from 'luxon'
+import { PerformanceIndicator } from 'models'
+import React from 'react'
+import { Provider } from 'react-redux'
+import { createMockEcolyoStore, mockAnalysisState } from 'tests/__mocks__/store'
+import FluidPerformanceIndicator from './FluidPerformanceIndicator'
+
+const monthlyStore = createMockEcolyoStore()
+const yearlyStore = createMockEcolyoStore({
+  analysis: { ...mockAnalysisState, period: 'year' },
+})
+const mockedNavigate = jest.fn()
+jest.mock('react-router-dom', () => ({
+  ...jest.requireActual('react-router-dom'),
+  useNavigate: () => mockedNavigate,
+}))
+
+const elecPerformanceIndicator: PerformanceIndicator = {
+  value: 100,
+  compareValue: 90,
+  percentageVariation: 0.1,
+}
+
+const waterPerformanceIndicator: PerformanceIndicator = {
+  value: 140,
+  compareValue: 150,
+  percentageVariation: -0.1,
+}
+
+const comparisonDate = DateTime.local(2024, 4, 15)
+
+describe('FluidPerformanceIndicator component', () => {
+  it('should render elec indicators correctly and navigate on click', async () => {
+    const dispatchSpy = jest.spyOn(monthlyStore, 'dispatch')
+    const setShowCompareMock = jest.fn()
+    dispatchSpy.mockImplementation((action: AnyAction) => {
+      if (action.type === 'chart/setShowCompare') {
+        setShowCompareMock(action.payload)
+      }
+      return action
+    })
+
+    const { container } = render(
+      <Provider store={monthlyStore}>
+        <FluidPerformanceIndicator
+          performanceIndicator={elecPerformanceIndicator}
+          fluidType={FluidType.ELECTRICITY}
+          comparisonDate={comparisonDate}
+        />
+      </Provider>
+    )
+
+    expect(screen.getByTestId('fluid-type-ELECTRICITY')).toHaveTextContent(
+      'ELECTRICITY'
+    )
+    expect(screen.getByTestId('fluid-value-ELECTRICITY')).toHaveTextContent(
+      '100'
+    )
+    expect(
+      screen.getByTestId('fluid-comparison-ELECTRICITY')
+    ).toHaveTextContent('+10,00 % / avril 2024')
+
+    await act(async () => {
+      await userEvent.click(screen.getByRole('listitem'))
+    })
+
+    expect(mockedNavigate).toHaveBeenCalledWith('/consumption/electricity')
+    expect(dispatchSpy).toHaveBeenCalledWith({
+      type: 'chart/setShowCompare',
+      payload: false,
+    })
+
+    expect(container).toMatchSnapshot()
+  })
+
+  it('should render water indicators correctly and dispatch setShowCompare year on click', async () => {
+    const dispatchSpy = jest.spyOn(yearlyStore, 'dispatch')
+    const setShowCompareMock = jest.fn()
+    dispatchSpy.mockImplementation((action: AnyAction) => {
+      if (action.type === 'chart/setShowCompare') {
+        setShowCompareMock(action.payload)
+      }
+      return action
+    })
+
+    render(
+      <Provider store={yearlyStore}>
+        <FluidPerformanceIndicator
+          performanceIndicator={waterPerformanceIndicator}
+          fluidType={FluidType.WATER}
+          comparisonDate={comparisonDate}
+        />
+      </Provider>
+    )
+
+    expect(screen.getByTestId('fluid-type-WATER')).toHaveTextContent('WATER')
+    expect(screen.getByTestId('fluid-value-WATER')).toHaveTextContent('140')
+    expect(screen.getByTestId('fluid-comparison-WATER')).toHaveTextContent(
+      '-10,00 % / avril 2024'
+    )
+
+    await act(async () => {
+      await userEvent.click(screen.getByRole('listitem'))
+    })
+
+    expect(mockedNavigate).toHaveBeenCalledWith('/consumption/water')
+    expect(dispatchSpy).toHaveBeenCalledWith({
+      type: 'chart/setShowCompare',
+      payload: true,
+    })
+  })
+
+  it('should render "no data" message when value is not available', () => {
+    const performanceIndicator: PerformanceIndicator = {
+      value: null,
+      compareValue: null,
+      percentageVariation: null,
+    }
+    const { container } = render(
+      <Provider store={monthlyStore}>
+        <FluidPerformanceIndicator
+          performanceIndicator={performanceIndicator}
+          fluidType={FluidType.WATER}
+          comparisonDate={comparisonDate}
+        />
+      </Provider>
+    )
+
+    expect(container).toMatchSnapshot()
+    expect(
+      screen.getByText('performance_indicator.fpi.no_data')
+    ).toBeInTheDocument()
+  })
+})
diff --git a/src/components/Analysis/Comparison/FluidPerformanceIndicator.tsx b/src/components/Analysis/Comparison/FluidPerformanceIndicator.tsx
index 7a61814c8d58830e2a4af945dc641bb1cdac8beb..22817c415083cea430f3a1b3ed1241df5915a5d2 100644
--- a/src/components/Analysis/Comparison/FluidPerformanceIndicator.tsx
+++ b/src/components/Analysis/Comparison/FluidPerformanceIndicator.tsx
@@ -1,27 +1,33 @@
+import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import { FluidType } from 'enums'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import { FluidType, TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import { PerformanceIndicator } from 'models'
 import React from 'react'
+import { useNavigate } from 'react-router-dom'
+import { setCurrentTimeStep, setShowCompare } from 'store/chart/chart.slice'
+import { useAppDispatch, useAppSelector } from 'store/hooks'
 import { getPicto } from 'utils/picto'
-import { formatNumberValues, getMonthName } from 'utils/utils'
+import { formatNumberValues, getFluidName, getMonthName } from 'utils/utils'
 import './fluidPerformanceIndicator.scss'
 
 interface FluidPerformanceIndicatorProps {
   performanceIndicator: PerformanceIndicator
   fluidType: FluidType
   comparisonDate: DateTime
-  onClickHandler?: () => void
 }
 
 const FluidPerformanceIndicator = ({
   performanceIndicator,
   fluidType,
   comparisonDate,
-  onClickHandler,
 }: FluidPerformanceIndicatorProps) => {
   const { t } = useI18n()
+  const navigate = useNavigate()
+  const dispatch = useAppDispatch()
+  const { period } = useAppSelector(state => state.ecolyo.analysis)
+
   const iconType = getPicto(fluidType)
   const displayedValue = performanceIndicator?.value
     ? formatNumberValues(performanceIndicator.value).toString()
@@ -37,10 +43,29 @@ const FluidPerformanceIndicator = ({
     }
   }
 
+  const handleFluidClick = (fluid: FluidType) => {
+    const fluidName = getFluidName(fluid)
+    const url = `/consumption/${fluidName}`
+    dispatch(setCurrentTimeStep(TimeStep.MONTH))
+    if (period === 'year') {
+      dispatch(setShowCompare(true))
+    } else {
+      dispatch(setShowCompare(false))
+    }
+    navigate(url)
+  }
+
   return (
-    <button className="fpi" onClick={onClickHandler}>
+    <StyledCard
+      role="listitem"
+      className="fpi"
+      onClick={() => handleFluidClick(fluidType)}
+    >
       <StyledIcon icon={iconType} size={50} />
-      <div className="fpi-content">
+      <div
+        data-testid={`fluid-type-${FluidType[fluidType]}`}
+        className="fpi-content"
+      >
         {!displayedValue && (
           <div className="fpi-content-no-data">
             <span>{t('performance_indicator.fpi.no_data')}</span>
@@ -48,7 +73,10 @@ const FluidPerformanceIndicator = ({
         )}
         {displayedValue && (
           <>
-            <div className="fpi-value">
+            <div
+              data-testid={`fluid-value-${FluidType[fluidType]}`}
+              className="fpi-value"
+            >
               <span className="fpi-load">{displayedValue}</span>
               <span className="fpi-unit">
                 {t(`FLUID.${FluidType[fluidType]}.UNIT`)}
@@ -60,7 +88,10 @@ const FluidPerformanceIndicator = ({
               </span>
             )}
             {performanceIndicator?.percentageVariation !== null && (
-              <div className="fpi-comparison">
+              <div
+                data-testid={`fluid-comparison-${FluidType[fluidType]}`}
+                className="fpi-comparison"
+              >
                 <span
                   className={`percent ${positive ? 'positive' : 'negative'}`}
                 >
@@ -74,7 +105,7 @@ const FluidPerformanceIndicator = ({
           </>
         )}
       </div>
-    </button>
+    </StyledCard>
   )
 }
 
diff --git a/src/components/Analysis/Comparison/TemperatureComparison.spec.tsx b/src/components/Analysis/Comparison/TemperatureComparison.spec.tsx
index 8d3383f30fbf92a4b590a9677db2eb2d621d8408..4be5c05413861145c8ed46d2b6a3d9cdeba5d0a6 100644
--- a/src/components/Analysis/Comparison/TemperatureComparison.spec.tsx
+++ b/src/components/Analysis/Comparison/TemperatureComparison.spec.tsx
@@ -22,9 +22,21 @@ describe('TemperatureComparison component', () => {
   afterEach(() => {
     jest.clearAllMocks()
   })
-  it('should be rendered correctly with hot result', async () => {
-    mockFetchAvgTemperature.mockResolvedValueOnce(1)
-    mockFetchAvgTemperature.mockResolvedValueOnce(2)
+
+  it('should render a loader', async () => {
+    render(
+      <Provider store={store}>
+        <TemperatureComparison />
+      </Provider>
+    )
+    await waitFor(() => {
+      expect(screen.getByRole('progressbar')).toBeInTheDocument()
+    })
+  })
+
+  it('should be rendered correctly with no data', async () => {
+    mockFetchAvgTemperature.mockResolvedValueOnce(null)
+    mockFetchAvgTemperature.mockResolvedValueOnce(0)
     const { container } = render(
       <Provider store={store}>
         <TemperatureComparison />
@@ -33,9 +45,9 @@ describe('TemperatureComparison component', () => {
     await waitFor(() => null, { container })
     expect(container).toMatchSnapshot()
   })
-  it('should be rendered correctly with cold result', async () => {
-    mockFetchAvgTemperature.mockResolvedValueOnce(2)
+  it('should be rendered correctly with hot result', async () => {
     mockFetchAvgTemperature.mockResolvedValueOnce(1)
+    mockFetchAvgTemperature.mockResolvedValueOnce(2)
     const { container } = render(
       <Provider store={store}>
         <TemperatureComparison />
@@ -43,10 +55,13 @@ describe('TemperatureComparison component', () => {
     )
     await waitFor(() => null, { container })
     expect(container).toMatchSnapshot()
+    expect(
+      await screen.findByText('analysis.temperature_comparison.unit')
+    ).toBeInTheDocument()
   })
-  it('should be rendered correctly with no data', async () => {
-    mockFetchAvgTemperature.mockResolvedValueOnce(null)
-    mockFetchAvgTemperature.mockResolvedValueOnce(0)
+  it('should be rendered correctly with cold result', async () => {
+    mockFetchAvgTemperature.mockResolvedValueOnce(2)
+    mockFetchAvgTemperature.mockResolvedValueOnce(1)
     const { container } = render(
       <Provider store={store}>
         <TemperatureComparison />
diff --git a/src/components/Analysis/Comparison/TemperatureComparison.tsx b/src/components/Analysis/Comparison/TemperatureComparison.tsx
index 393df4a980a3608affd5c0d06b2510daf6ea8221..8d1a82caacfd2f31ace94604b804186bd96ef76a 100644
--- a/src/components/Analysis/Comparison/TemperatureComparison.tsx
+++ b/src/components/Analysis/Comparison/TemperatureComparison.tsx
@@ -1,7 +1,8 @@
 import ExclamationMarkIcon from 'assets/icons/ico/exclamationMark.svg'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useEffect, useMemo, useState } from 'react'
 import ConsumptionService from 'services/consumption.service'
 import { useAppSelector } from 'store/hooks'
@@ -15,14 +16,16 @@ const TemperatureComparison = () => {
     state => state.ecolyo.analysis
   )
 
-  const [temperatureDifference, setTemperatureDifference] = useState<string>()
-  const [positive, setPositive] = useState<boolean>(true)
-  const [openTemperatureComparisonModal, setOpenTemperatureComparisonModal] =
-    useState<boolean>(false)
+  const [temperatureDifference, setTemperatureDifference] = useState<string>('')
+  const [openDetailsModal, setOpenDetailsModal] = useState<boolean>(false)
+  const [isLoading, setIsLoading] = useState<boolean>(true)
+  const positive = Number(temperatureDifference) >= 0
+
   const consumptionService = useMemo(
     () => new ConsumptionService(client),
     [client]
   )
+
   const comparisonDates = useMemo(() => {
     const endMonth = analysisMonth.minus({ month: 1 }).startOf('month')
     return {
@@ -35,23 +38,22 @@ const TemperatureComparison = () => {
 
   useEffect(() => {
     async function handleTemperatureComparison() {
-      const startMonthTemperature =
-        await consumptionService.fetchAvgTemperature(
+      const [startTemperature, endTemperature] = await Promise.all([
+        consumptionService.fetchAvgTemperature(
           comparisonDates.startMonth.year,
           comparisonDates.startMonth.month
-        )
+        ),
+        consumptionService.fetchAvgTemperature(
+          comparisonDates.endMonth.year,
+          comparisonDates.endMonth.month
+        ),
+      ])
 
-      const endMonthTemperature = await consumptionService.fetchAvgTemperature(
-        comparisonDates.endMonth.year,
-        comparisonDates.endMonth.month
-      )
-
-      if (startMonthTemperature !== null && endMonthTemperature !== null) {
-        const temperatureDifference =
-          endMonthTemperature - startMonthTemperature
+      if (startTemperature !== null && endTemperature !== null) {
+        const temperatureDifference = endTemperature - startTemperature
         setTemperatureDifference(temperatureDifference.toFixed(1))
-        setPositive(temperatureDifference >= 0)
       }
+      setIsLoading(false)
     }
     handleTemperatureComparison()
   }, [
@@ -62,49 +64,57 @@ const TemperatureComparison = () => {
     comparisonDates.startMonth.year,
   ])
 
-  return (
-    <>
-      {temperatureDifference && (
-        <div className={`temperatureComparison ${positive ? 'hot' : 'cold'}`}>
-          <div className="tc-content">
-            <div>
-              <span className="text-28-bold">
-                {positive ? '+' : ''}
-                {temperatureDifference}&nbsp;
-              </span>
-              <span className="text-18">
-                {t('analysis.temperature_comparison.unit')}
-              </span>
-            </div>
-            <div>
-              <span className="tc-text text-12">
-                {t('analysis.temperature_comparison.comparison')}
-              </span>
-              <span className="tc-period text-12-bold">
-                &nbsp;
-                {comparisonDates.startMonth.toLocaleString({
-                  month: 'long',
-                  year: 'numeric',
-                })}
-              </span>
-            </div>
-          </div>
+  if (isLoading) {
+    return (
+      <div className="temperatureComparison loading">
+        <Loader />
+      </div>
+    )
+  }
 
-          <StyledIconButton
-            icon={ExclamationMarkIcon}
-            sized={16}
-            onClick={() => setOpenTemperatureComparisonModal(true)}
-            aria-label={t('analysis.temperature_comparison.info_button')}
-            className="info-icon"
-          />
+  if (!temperatureDifference) return null
 
-          <TemperatureComparisonModal
-            open={openTemperatureComparisonModal}
-            handleCloseClick={() => setOpenTemperatureComparisonModal(false)}
-          />
+  return (
+    <div className={`temperatureComparison ${positive ? 'hot' : 'cold'}`}>
+      <div className="tc-content">
+        <div>
+          <span className="text-28-bold">
+            {positive ? '+' : ''}
+            {temperatureDifference}&nbsp;
+          </span>
+          <span className="text-18">
+            {t('analysis.temperature_comparison.unit')}
+          </span>
+        </div>
+        <div>
+          <span className="text-12">
+            {t('analysis.temperature_comparison.comparison')}
+          </span>
+          <span className="text-12-bold">
+            &nbsp;
+            {comparisonDates.startMonth.toLocaleString({
+              month: 'long',
+              year: 'numeric',
+            })}
+          </span>
         </div>
-      )}
-    </>
+      </div>
+
+      <div className="buttonContainer">
+        <StyledIconButton
+          icon={ExclamationMarkIcon}
+          sized={16}
+          onClick={() => setOpenDetailsModal(true)}
+          aria-label={t('analysis.temperature_comparison.info_button')}
+          className="info-icon"
+        />
+      </div>
+
+      <TemperatureComparisonModal
+        open={openDetailsModal}
+        handleCloseClick={() => setOpenDetailsModal(false)}
+      />
+    </div>
   )
 }
 
diff --git a/src/components/Analysis/Comparison/TemperatureComparisonModal/TemperatureComparisonModal.tsx b/src/components/Analysis/Comparison/TemperatureComparisonModal/TemperatureComparisonModal.tsx
index b165c9936433fcd09c2a469195455cd29b56b0cb..8971c0b4b3b456519a6fc8bf346c8ace3d990728 100644
--- a/src/components/Analysis/Comparison/TemperatureComparisonModal/TemperatureComparisonModal.tsx
+++ b/src/components/Analysis/Comparison/TemperatureComparisonModal/TemperatureComparisonModal.tsx
@@ -1,8 +1,7 @@
-import { IconButton } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useAppSelector } from 'store/hooks'
 import './temperatureComparisonModal.scss'
@@ -30,13 +29,13 @@ const TemperatureComparisonModal = ({
       }}
     >
       <div className="modal-start-root">
-        <IconButton
+        <StyledIconButton
+          icon={CloseIcon}
+          sized={18}
+          onClick={handleCloseClick}
           aria-label={t('analysis.temperature_comparison.modal.close')}
           className="modal-paper-close-button"
-          onClick={handleCloseClick}
-        >
-          <Icon icon={CloseIcon} size={18} />
-        </IconButton>
+        />
         <div className="content">
           <div className="text-20-bold subtitle">
             {t('analysis.temperature_comparison.modal.title')}
diff --git a/src/components/Analysis/Comparison/TemperatureComparisonModal/__snapshots__/TemperatureComparisonModal.spec.tsx.snap b/src/components/Analysis/Comparison/TemperatureComparisonModal/__snapshots__/TemperatureComparisonModal.spec.tsx.snap
index 19f0c60c854b994a7206326d40398cf10636f3bd..ae38608769b3585d68ab1cbec8cc1f5769fcbafb 100644
--- a/src/components/Analysis/Comparison/TemperatureComparisonModal/__snapshots__/TemperatureComparisonModal.spec.tsx.snap
+++ b/src/components/Analysis/Comparison/TemperatureComparisonModal/__snapshots__/TemperatureComparisonModal.spec.tsx.snap
@@ -45,6 +45,7 @@ exports[`TemperatureComparisonModal component should be rendered correctly 1`] =
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="18"
                 width="18"
diff --git a/src/components/Analysis/Comparison/__snapshots__/FluidPerformanceIndicator.spec.tsx.snap b/src/components/Analysis/Comparison/__snapshots__/FluidPerformanceIndicator.spec.tsx.snap
new file mode 100644
index 0000000000000000000000000000000000000000..cd33f838a0aa60ee4ba4f9e03d8b45f8fd023f28
--- /dev/null
+++ b/src/components/Analysis/Comparison/__snapshots__/FluidPerformanceIndicator.spec.tsx.snap
@@ -0,0 +1,112 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`FluidPerformanceIndicator component should render "no data" message when value is not available 1`] = `
+<div>
+  <button
+    class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-5 fpi"
+    role="listitem"
+    tabindex="0"
+    type="button"
+  >
+    <div
+      class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-6"
+    >
+      <svg
+        aria-hidden="true"
+        class="styles__icon___23x3R"
+        height="50"
+        width="50"
+      >
+        <use
+          xlink:href="#test-file-stub"
+        />
+      </svg>
+      <div
+        class="fpi-content"
+        data-testid="fluid-type-WATER"
+      >
+        <div
+          class="fpi-content-no-data"
+        >
+          <span>
+            performance_indicator.fpi.no_data
+          </span>
+        </div>
+      </div>
+    </div>
+    <span
+      class="MuiCardActionArea-focusHighlight"
+    />
+    <span
+      class="MuiTouchRipple-root"
+    />
+  </button>
+</div>
+`;
+
+exports[`FluidPerformanceIndicator component should render elec indicators correctly and navigate on click 1`] = `
+<div>
+  <button
+    class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 fpi"
+    role="listitem"
+    tabindex="0"
+    type="button"
+  >
+    <div
+      class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
+    >
+      <svg
+        aria-hidden="true"
+        class="styles__icon___23x3R"
+        height="50"
+        width="50"
+      >
+        <use
+          xlink:href="#test-file-stub"
+        />
+      </svg>
+      <div
+        class="fpi-content"
+        data-testid="fluid-type-ELECTRICITY"
+      >
+        <div
+          class="fpi-value"
+          data-testid="fluid-value-ELECTRICITY"
+        >
+          <span
+            class="fpi-load"
+          >
+            100,00
+          </span>
+          <span
+            class="fpi-unit"
+          >
+            FLUID.ELECTRICITY.UNIT
+          </span>
+        </div>
+        <div
+          class="fpi-comparison"
+          data-testid="fluid-comparison-ELECTRICITY"
+        >
+          <span
+            class="percent positive"
+          >
+            +10,00 %
+          </span>
+          <span
+            class="fpi-comparison-date"
+          >
+             / avril 2024
+          </span>
+        </div>
+      </div>
+    </div>
+    <span
+      class="MuiCardActionArea-focusHighlight"
+    />
+    <span
+      class="MuiTouchRipple-root"
+    />
+  </button>
+</div>
+`;
diff --git a/src/components/Analysis/Comparison/__snapshots__/TemperatureComparison.spec.tsx.snap b/src/components/Analysis/Comparison/__snapshots__/TemperatureComparison.spec.tsx.snap
index eac3ee09c526dd84802cca03337293575eb5d0df..c2588b10f69b1481b6cbdf17f431ba9ca71ec57c 100644
--- a/src/components/Analysis/Comparison/__snapshots__/TemperatureComparison.spec.tsx.snap
+++ b/src/components/Analysis/Comparison/__snapshots__/TemperatureComparison.spec.tsx.snap
@@ -23,39 +23,43 @@ exports[`TemperatureComparison component should be rendered correctly with cold
       </div>
       <div>
         <span
-          class="tc-text text-12"
+          class="text-12"
         >
           analysis.temperature_comparison.comparison
         </span>
         <span
-          class="tc-period text-12-bold"
+          class="text-12-bold"
         >
            
           novembre 2022
         </span>
       </div>
     </div>
-    <button
-      aria-label="analysis.temperature_comparison.info_button"
-      class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-2 info-icon"
-      tabindex="0"
-      type="button"
+    <div
+      class="buttonContainer"
     >
-      <span
-        class="MuiIconButton-label"
+      <button
+        aria-label="analysis.temperature_comparison.info_button"
+        class="MuiButtonBase-root MuiIconButton-root info-icon"
+        tabindex="0"
+        type="button"
       >
-        <svg
-          aria-hidden="true"
-          class="styles__icon___23x3R"
-          height="16"
-          width="16"
+        <span
+          class="MuiIconButton-label"
         >
-          <use
-            xlink:href="#test-file-stub"
-          />
-        </svg>
-      </span>
-    </button>
+          <svg
+            aria-hidden="true"
+            class="styles__icon___23x3R"
+            height="16"
+            width="16"
+          >
+            <use
+              xlink:href="#test-file-stub"
+            />
+          </svg>
+        </span>
+      </button>
+    </div>
   </div>
 </div>
 `;
@@ -84,39 +88,43 @@ exports[`TemperatureComparison component should be rendered correctly with hot r
       </div>
       <div>
         <span
-          class="tc-text text-12"
+          class="text-12"
         >
           analysis.temperature_comparison.comparison
         </span>
         <span
-          class="tc-period text-12-bold"
+          class="text-12-bold"
         >
            
           novembre 2022
         </span>
       </div>
     </div>
-    <button
-      aria-label="analysis.temperature_comparison.info_button"
-      class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 info-icon"
-      tabindex="0"
-      type="button"
+    <div
+      class="buttonContainer"
     >
-      <span
-        class="MuiIconButton-label"
+      <button
+        aria-label="analysis.temperature_comparison.info_button"
+        class="MuiButtonBase-root MuiIconButton-root info-icon"
+        tabindex="0"
+        type="button"
       >
-        <svg
-          aria-hidden="true"
-          class="styles__icon___23x3R"
-          height="16"
-          width="16"
+        <span
+          class="MuiIconButton-label"
         >
-          <use
-            xlink:href="#test-file-stub"
-          />
-        </svg>
-      </span>
-    </button>
+          <svg
+            aria-hidden="true"
+            class="styles__icon___23x3R"
+            height="16"
+            width="16"
+          >
+            <use
+              xlink:href="#test-file-stub"
+            />
+          </svg>
+        </span>
+      </button>
+    </div>
   </div>
 </div>
 `;
diff --git a/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss b/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss
index 202dcdce132a7e97d9b7685aaade8afa3b2d8e0f..c896338527caab8408b9342b185757b113ebe61a 100644
--- a/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss
+++ b/src/components/Analysis/Comparison/fluidPerformanceIndicator.scss
@@ -26,33 +26,22 @@
 }
 
 //FluidPerformanceIndicator
-.fpi {
-  display: flex;
-  flex-direction: row;
+button.fpi {
   border: 1px solid $grey-dark;
-  border-radius: 4px;
-  padding: 16px 22px;
-  gap: 1rem;
-  align-items: center;
   box-shadow: 0px 4px 16px 0px $black-shadow;
   transition: background-color 0.3s;
-  background: linear-gradient(180deg, #323339 0%, #25262b 100%);
-  cursor: pointer;
-
-  &:hover {
-    background: linear-gradient(
-      180deg,
-      rgba(70, 71, 77, 0.7) 0%,
-      rgba(57, 58, 63, 0.7) 100%
-    );
-  }
 
   .fpi-content {
+    display: flex;
+    flex-direction: column;
+    gap: 4px;
     .fpi-value {
+      display: flex;
+      flex-direction: row;
+      align-items: flex-end;
       .fpi-load {
         font-size: 1.75rem;
         font-weight: 900;
-        margin-right: 4px;
         color: $white;
       }
       .fpi-unit {
diff --git a/src/components/Analysis/Comparison/temperatureComparison.scss b/src/components/Analysis/Comparison/temperatureComparison.scss
index ce4fc3e5e665d169435eb4df2ffa3975962b3429..62e23c5de94e8335608a4d54ad8bd5d587b637f6 100644
--- a/src/components/Analysis/Comparison/temperatureComparison.scss
+++ b/src/components/Analysis/Comparison/temperatureComparison.scss
@@ -3,13 +3,21 @@
 
 .temperatureComparison {
   display: flex;
+  align-items: center;
   border: 1px solid $grey-dark;
   border-radius: 4px;
-  padding: 4px 4px 8px 22px;
+  padding: 8px 4px 8px 20px;
   box-shadow: 0px 4px 16px 0px $black-shadow;
   background: linear-gradient(180deg, #323339 0%, #25262b 100%);
   background-position: bottom right;
   background-repeat: no-repeat;
+  height: 60px;
+  transition: all 0.3s ease-in-out;
+
+  &.loading {
+    justify-content: center;
+  }
+
   &.hot {
     background-image: url('../../../assets/png/temperatures/hot.svg'),
       linear-gradient(259deg, rgba(6, 29, 62, 0) 25.28%, #77aee0 121.36%),
@@ -30,21 +38,20 @@
 
   .tc-content {
     text-align: left;
-    padding-top: 4px;
     flex-grow: 1;
     color: $white;
-    .tc-text {
-      font-weight: 200;
-    }
-    .tc-period {
-      font-weight: 900;
-    }
   }
 
-  .info-icon {
-    padding: 0;
-    stroke: $white;
+  .buttonContainer {
+    display: flex;
     align-items: flex-start;
     height: 100%;
+    .info-icon {
+      align-items: flex-start;
+      padding: 0;
+      position: relative;
+      top: -4px;
+      stroke: $white;
+    }
   }
 }
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.spec.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.spec.tsx
index dabce7334c669a599f8df2b25cd9cc87fd2546b9..289590c65d54ea47acd02f3c8eefbb34b46d65c6 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.spec.tsx
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.spec.tsx
@@ -3,7 +3,11 @@ import { DateTime } from 'luxon'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { dataLoadArray } from 'tests/__mocks__/chartData.mock'
-import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockChartState,
+  mockGlobalState,
+} from 'tests/__mocks__/store'
 import ElecHalfHourChart from './ElecHalfHourChart'
 
 jest.mock('services/dateChart.service', () => {
@@ -15,6 +19,7 @@ jest.mock('services/dateChart.service', () => {
 describe('ElecHalfHourChart component', () => {
   const store = createMockEcolyoStore({
     chart: {
+      ...mockChartState,
       selectedDate: DateTime.fromISO('2021-07-01T00:00:00.000Z', {
         zone: 'utc',
       }),
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.tsx
index 51fb203428079b883f30e49696061b6077779e78..fab3716510634d8527e9df64c9eb9cc202fc7040 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.tsx
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourChart.tsx
@@ -30,11 +30,7 @@ const ElecHalfHourChart = ({ dataLoad, isWeekend }: ElecHalfHourChartProps) => {
   }
 
   const xScale: ScaleBand<string> = scaleBand()
-    .domain(
-      dataLoad.map((d: Dataload) =>
-        d.date.toLocaleString(DateTime.DATETIME_SHORT)
-      )
-    )
+    .domain(dataLoad.map(d => d.date.toLocaleString(DateTime.DATETIME_SHORT)))
     .range([0, getContentWidth()])
     .padding(0.1)
 
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx
index 4c977c1746a4286808cb9dd47a64990ed6ecbf2f..a8611f6d0468ba324dd31caf734b0c6488dab2c5 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.spec.tsx
@@ -66,7 +66,7 @@ describe('ElecHalfHourMonthlyAnalysis component', () => {
     expect(container).toMatchSnapshot()
   })
 
-  it('should be rendered correctly when isHalfHourActivated is true', async () => {
+  it('should be rendered correctly when isHalfHourActivated is true and render weekend graph', async () => {
     mockCheckDoctypeEntries.mockResolvedValue(true)
     mockGetEnedisMonthlyAnalysisByDate.mockResolvedValueOnce(
       mockEnedisMonthlyAnalysisArray
@@ -83,6 +83,7 @@ describe('ElecHalfHourMonthlyAnalysis component', () => {
     )
     await waitFor(() => null, { container })
     expect(container).toMatchSnapshot()
+    expect(screen.getByText('special_elec.weekend')).toBeInTheDocument()
   })
 
   it('should change from weekend to week', async () => {
@@ -94,17 +95,20 @@ describe('ElecHalfHourMonthlyAnalysis component', () => {
       mockDataLoadEnedisAnalysis
     )
     mockGetPrices.mockResolvedValue(allLastFluidPrices[0])
-    const { container } = render(
+    render(
       <Provider store={store}>
         <ElecHalfHourMonthlyAnalysis perfIndicator={mockPerfIndicator} />
       </Provider>
     )
+    await waitFor(() =>
+      screen.getByLabelText('consumption.accessibility.button_previous_value')
+    )
     await act(async () => {
       await userEvent.click(
         screen.getByLabelText('consumption.accessibility.button_previous_value')
       )
     })
-    expect(container.getElementsByClassName('week').length).toBeTruthy()
+    expect(screen.getByText('special_elec.week')).toBeInTheDocument()
   })
 
   it('should call the ElecInfoModal with open = true when click on the button', async () => {
@@ -116,7 +120,6 @@ describe('ElecHalfHourMonthlyAnalysis component', () => {
       mockDataLoadEnedisAnalysis
     )
     mockGetPrices.mockResolvedValue(allLastFluidPrices[0])
-
     render(
       <Provider store={store}>
         <ElecHalfHourMonthlyAnalysis perfIndicator={mockPerfIndicator} />
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx
index 44bcc2b670387f373045c72260cf6ce98635aa75..47213f9d65e93bba53fca4971eecd1c1d6fc363d 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis.tsx
@@ -1,14 +1,14 @@
 import { Button } from '@material-ui/core'
-import IconButton from '@material-ui/core/IconButton'
 import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg'
 import MaxPowerIcon from 'assets/icons/ico/maxPower.svg'
 import MinIcon from 'assets/icons/ico/minimum.svg'
 import OffPeakHourIcon from 'assets/icons/ico/offPeakHour.svg'
 import RightArrowIcon from 'assets/icons/ico/right-arrow.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep } from 'enums'
 import {
   AggregatedEnedisMonthlyDataloads,
@@ -37,7 +37,7 @@ const ElecHalfHourMonthlyAnalysis = ({
   const { analysisMonth } = useAppSelector(state => state.ecolyo.analysis)
 
   const [isWeekend, setIsWeekend] = useState<boolean>(true)
-  const [isHalfHourActivated, setIsHalfHourActivated] = useState<boolean>(true)
+  const [isHalfHourActivated, setIsHalfHourActivated] = useState<boolean>(false)
   const [isLoading, setIsLoading] = useState<boolean>(true)
   const [monthDataloads, setMonthDataloads] =
     useState<AggregatedEnedisMonthlyDataloads>()
@@ -48,15 +48,7 @@ const ElecHalfHourMonthlyAnalysis = ({
   const [openInfoModal, setOpenInfoModal] = useState<boolean>(false)
   const [offPeakHours, setOffPeakHours] = useState<OffPeakHours[]>()
 
-  const handleChangeWeek = useCallback(() => {
-    setIsWeekend(prev => !prev)
-  }, [])
-
-  const toggleInfoModal = useCallback(() => {
-    setOpenInfoModal(prev => !prev)
-  }, [])
-
-  /** EnedisMonthlyAnalysisDataService*/
+  /** EnedisMonthlyAnalysisDataService */
   const emas = useMemo(
     () => new EnedisMonthlyAnalysisDataService(client),
     [client]
@@ -94,8 +86,8 @@ const ElecHalfHourMonthlyAnalysis = ({
         FluidType.ELECTRICITY,
         TimeStep.HALF_AN_HOUR
       )
-      if (!subscribed) return
       if (isHalfHourLoadActivated) {
+        setIsHalfHourActivated(true)
         const aggregatedDate = analysisMonth.minus({ month: 1 })
         const data = await emas.getEnedisMonthlyAnalysisByDate(
           aggregatedDate.year,
@@ -110,13 +102,11 @@ const ElecHalfHourMonthlyAnalysis = ({
             setFacturePercentage(percentage)
           }
         }
-      } else {
-        setIsHalfHourActivated(false)
       }
 
       setIsLoading(false)
     }
-    fetchEnedisAnalysisData()
+    subscribed && fetchEnedisAnalysisData()
 
     return () => {
       subscribed = false
@@ -127,15 +117,15 @@ const ElecHalfHourMonthlyAnalysis = ({
     let subscribed = true
     const fluidsPricesService = new FluidPricesService(client)
     async function getAllLastPrices() {
-      const price: FluidPrice = await fluidsPricesService.getPrices(
+      const price = await fluidsPricesService.getPrices(
         FluidType.ELECTRICITY,
         analysisMonth.minus({ month: 1 })
       )
-      if (subscribed && price) {
+      if (price) {
         setElecPrice(price)
       }
     }
-    getAllLastPrices()
+    subscribed && getAllLastPrices()
 
     return () => {
       subscribed = false
@@ -145,14 +135,12 @@ const ElecHalfHourMonthlyAnalysis = ({
   useEffect(() => {
     let subscribed = true
     async function getOffPeakHours() {
-      if (subscribed) {
-        const offPeakHours = await emas.getOffPeakHours()
-        if (offPeakHours) {
-          setOffPeakHours(offPeakHours)
-        }
+      const offPeakHours = await emas.getOffPeakHours()
+      if (offPeakHours) {
+        setOffPeakHours(offPeakHours)
       }
     }
-    getOffPeakHours()
+    subscribed && getOffPeakHours()
 
     return () => {
       subscribed = false
@@ -161,7 +149,7 @@ const ElecHalfHourMonthlyAnalysis = ({
 
   return (
     <div className="special-elec-container">
-      <Icon
+      <StyledIcon
         className="elec-icon"
         icon={getNavPicto(FluidType.ELECTRICITY, true, true)}
         size={42}
@@ -175,13 +163,13 @@ const ElecHalfHourMonthlyAnalysis = ({
       {isHalfHourActivated && (
         <>
           <div className="navigator">
-            <IconButton
+            <StyledIconButton
+              icon={LeftArrowIcon}
+              sized={24}
+              onClick={() => setIsWeekend(prev => !prev)}
               aria-label={t('consumption.accessibility.button_previous_value')}
-              onClick={handleChangeWeek}
               className="arrow-prev"
-            >
-              <Icon icon={LeftArrowIcon} size={24} />
-            </IconButton>
+            />
             <div className="average text-18-normal">
               <div className="text-1">{t('special_elec.average')}</div>
               <div className="text-2 text-18-bold">
@@ -193,100 +181,123 @@ const ElecHalfHourMonthlyAnalysis = ({
                 </span>
               </div>
             </div>
-            <IconButton
+            <StyledIconButton
+              icon={RightArrowIcon}
+              sized={24}
+              onClick={() => setIsWeekend(prev => !prev)}
               aria-label={t('consumption.accessibility.button_next_value')}
-              onClick={handleChangeWeek}
               className="arrow-next"
-            >
-              <Icon icon={RightArrowIcon} size={24} />
-            </IconButton>
+            />
           </div>
           {isLoading && <Loader color="elec" />}
           {!isLoading && (
             <>
               {getPowerChart()}
               {enedisAnalysisValues && isDataFullyComplete(monthDataloads) && (
-                <div className="min-max">
-                  <div className="container">
-                    <Icon icon={MaxPowerIcon} size={40} className="minIcon" />
-                    <div className="text">
-                      <div className="min text-18-normal">
-                        {t('special_elec.maxPower')}
-                      </div>
-                    </div>
-                    <div className="value kvAval">
-                      {enedisAnalysisValues.maxPower !== 0 &&
-                      enedisAnalysisValues.maxPower !== null ? (
-                        <div className="text-18-bold">
-                          {enedisAnalysisValues.maxPower.toFixed(1)}
-                          <span className="text-18-normal"> kVA</span>
-                        </div>
-                      ) : (
-                        <span>----</span>
-                      )}
-                    </div>
-                  </div>
-                  {enedisAnalysisValues?.offPeakHoursRatio != null && (
+                <>
+                  <div className="elec-infos">
                     <div className="container">
-                      <Icon
-                        icon={OffPeakHourIcon}
+                      <StyledIcon
+                        icon={MaxPowerIcon}
                         size={40}
                         className="minIcon"
                       />
-                      <div className="text">
-                        <div className="min text-18-normal">
-                          {t('special_elec.offPeakHour')}
-                        </div>
-                      </div>
-                      <div className="value kvAval">
-                        <div className="text-18-bold">
-                          {Math.round(
-                            enedisAnalysisValues.offPeakHoursRatio * 100
+                      <div className="text text-18-normal">
+                        <div className="row">
+                          {t('special_elec.maxPower')}
+                          {enedisAnalysisValues.maxPower !== 0 &&
+                          enedisAnalysisValues.maxPower !== null ? (
+                            <div className="value">
+                              <div className="text-18-bold">
+                                {enedisAnalysisValues.maxPower.toFixed(1)}
+                              </div>
+                              <span> kVA</span>
+                            </div>
+                          ) : (
+                            <span>----</span>
                           )}
-                          <span className="text-18-normal"> %</span>
                         </div>
                       </div>
                     </div>
-                  )}
-                  <div className="container consomin">
-                    <Icon icon={MinIcon} size={40} className="minIcon" />
-                    <div className="text text-18-normal">
-                      <div>{t('special_elec.min')}</div>
-                      <div>{t('special_elec.percentage')}</div>
-                      <div>{t('special_elec.price')}</div>
-                    </div>
-                    <div className="value">
-                      {enedisAnalysisValues.minimumLoad !== 0 &&
-                      enedisAnalysisValues.minimumLoad !== null ? (
-                        <>
-                          <div className="text-18-bold">
-                            {enedisAnalysisValues.minimumLoad.toFixed(1)}
-                            <span className="text-18-normal"> kWh</span>
-                          </div>
-                          <div className="text-18-bold">
-                            {facturePercentage?.toFixed(0) || '---'}
-                            <span className="text-18-normal"> %</span>
-                          </div>
-                          <div className="text-18-bold">
-                            {elecPrice?.price
-                              ? (
-                                  enedisAnalysisValues.minimumLoad *
-                                  elecPrice.price
-                                ).toFixed(1)
-                              : '---'}
-                            <span className="text-18-normal"> €</span>
+                    {enedisAnalysisValues?.offPeakHoursRatio != null && (
+                      <div className="container">
+                        <StyledIcon
+                          icon={OffPeakHourIcon}
+                          size={40}
+                          className="minIcon"
+                        />
+                        <div className="text text-18-normal">
+                          <div className="row">
+                            {t('special_elec.offPeakHour')}
+                            <div className="value">
+                              <span className="text-18-bold">
+                                {Math.round(
+                                  enedisAnalysisValues.offPeakHoursRatio * 100
+                                )}
+                              </span>
+                              <span> %</span>
+                            </div>
                           </div>
-                        </>
-                      ) : (
-                        <span>----</span>
-                      )}
+                        </div>
+                      </div>
+                    )}
+                    <div className="container">
+                      <StyledIcon
+                        icon={MinIcon}
+                        size={40}
+                        className="minIcon"
+                      />
+                      <div className="text text-18-normal">
+                        {enedisAnalysisValues.minimumLoad !== 0 &&
+                        enedisAnalysisValues.minimumLoad !== null ? (
+                          <>
+                            <div className="row">
+                              <div>{t('special_elec.min')}</div>
+                              <div className="value">
+                                <span className="text-18-bold">
+                                  {enedisAnalysisValues.minimumLoad.toFixed(1)}
+                                </span>
+                                <span> kWh</span>
+                              </div>
+                            </div>
+                            <div className="row">
+                              <div>{t('special_elec.percentage')}</div>
+                              <div className="value">
+                                <span className="text-18-bold">
+                                  {facturePercentage?.toFixed(0) || '---'}
+                                </span>
+                                <span> %</span>
+                              </div>
+                            </div>
+                            <div className="row">
+                              <div>{t('special_elec.price')}</div>
+                              <div className="value">
+                                <span className="text-18-bold">
+                                  {elecPrice?.price
+                                    ? (
+                                        enedisAnalysisValues.minimumLoad *
+                                        elecPrice.price
+                                      ).toFixed(1)
+                                    : '---'}
+                                </span>
+                                <span> €</span>
+                              </div>
+                            </div>
+                          </>
+                        ) : (
+                          <span>----</span>
+                        )}
+                      </div>
                     </div>
                   </div>
 
-                  <Button className="btnText" onClick={toggleInfoModal}>
+                  <Button
+                    className="btnText"
+                    onClick={() => setOpenInfoModal(true)}
+                  >
                     {t('special_elec.showModal')}
                   </Button>
-                </div>
+                </>
               )}
             </>
           )}
@@ -295,7 +306,7 @@ const ElecHalfHourMonthlyAnalysis = ({
       <ElecInfoModal
         open={openInfoModal}
         offPeakHours={offPeakHours}
-        handleCloseClick={toggleInfoModal}
+        handleCloseClick={() => setOpenInfoModal(false)}
       />
     </div>
   )
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx
index f755d44ae425545eb0761e878cf378e08c022956..c1494be795c50f202adb6f455c84916c093d9b35 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/ElecInfoModal.tsx
@@ -1,8 +1,7 @@
-import { IconButton } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import {
   OffPeakHours,
@@ -41,13 +40,12 @@ const ElecInfoModal = ({
       <div id="accessibility-title">
         {t('elec_info_modal.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('elec_info_modal.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="elecInfoModal">
         <div className="title text-18-bold">
           {t('elec_info_modal.maxPowerTitle')}
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap
index 1f0c220c490f82d9382dd7825eb5f08f85f72bc1..493674eb37c8d7324a028f9cf1d990187cc1adf1 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourChart.spec.tsx.snap
@@ -112,7 +112,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--0"
+              class="bar-ELECTRICITY weekend bounce-1 delay--0"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -124,11 +124,16 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
             />
           </g>
           <g
+            class="barValue"
+            tabindex="-1"
             transform="translate(21.219512195121922, 0)"
           >
+            <title>
+              consumption.accessibility.bar
+            </title>
             <defs>
               <lineargradient
-                class="bar-ELECTRICITY weekend bounce-3 delay--0"
+                class="bar-ELECTRICITY weekend bounce-1 delay--0"
                 id="gradient"
                 x1="0"
                 x2="0"
@@ -146,7 +151,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--0"
+              class="bar-ELECTRICITY weekend bounce-1 delay--0"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -195,7 +200,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--1"
+              class="bar-ELECTRICITY weekend bounce-1 delay--1"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -207,11 +212,16 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
             />
           </g>
           <g
+            class="barValue"
+            tabindex="-1"
             transform="translate(233.41463414634146, 0)"
           >
+            <title>
+              consumption.accessibility.bar
+            </title>
             <defs>
               <lineargradient
-                class="bar-ELECTRICITY weekend bounce-3 delay--1"
+                class="bar-ELECTRICITY weekend bounce-1 delay--1"
                 id="gradient"
                 x1="0"
                 x2="0"
@@ -229,7 +239,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--1"
+              class="bar-ELECTRICITY weekend bounce-1 delay--1"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -278,7 +288,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--2"
+              class="bar-ELECTRICITY weekend bounce-1 delay--2"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -290,11 +300,16 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
             />
           </g>
           <g
+            class="barValue"
+            tabindex="-1"
             transform="translate(445.609756097561, 0)"
           >
+            <title>
+              consumption.accessibility.bar
+            </title>
             <defs>
               <lineargradient
-                class="bar-ELECTRICITY weekend bounce-3 delay--2"
+                class="bar-ELECTRICITY weekend bounce-1 delay--2"
                 id="gradient"
                 x1="0"
                 x2="0"
@@ -312,7 +327,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--2"
+              class="bar-ELECTRICITY weekend bounce-1 delay--2"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -361,7 +376,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--3"
+              class="bar-ELECTRICITY weekend bounce-1 delay--3"
               d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -373,11 +388,16 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
             />
           </g>
           <g
+            class="barValue"
+            tabindex="-1"
             transform="translate(657.8048780487804, 0)"
           >
+            <title>
+              consumption.accessibility.bar
+            </title>
             <defs>
               <lineargradient
-                class="bar-ELECTRICITY weekend bounce-3 delay--3"
+                class="bar-ELECTRICITY weekend bounce-1 delay--3"
                 id="gradient"
                 x1="0"
                 x2="0"
@@ -395,7 +415,7 @@ exports[`ElecHalfHourChart component should be rendered correctly 1`] = `
               </lineargradient>
             </defs>
             <path
-              class="bar-ELECTRICITY weekend bounce-3 delay--3"
+              class="bar-ELECTRICITY weekend bounce-1 delay--3"
               d="
       M0,4
       a4,4 0 0 1 4,-4
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap
index 381a846028beec7849346c46e4cf5484949a4aee..fdd25bb41103a0e031ea62934c9f3501a7623401 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecHalfHourMonthlyAnalysis.spec.tsx.snap
@@ -6,6 +6,7 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when
     class="special-elec-container"
   >
     <svg
+      aria-hidden="true"
       class="elec-icon styles__icon___23x3R"
       height="42"
       width="42"
@@ -28,12 +29,13 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when
 </div>
 `;
 
-exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when isHalfHourActivated is true 1`] = `
+exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when isHalfHourActivated is true and render weekend graph 1`] = `
 <div>
   <div
     class="special-elec-container"
   >
     <svg
+      aria-hidden="true"
       class="elec-icon styles__icon___23x3R"
       height="42"
       width="42"
@@ -60,6 +62,7 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when
           class="MuiIconButton-label"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="24"
             width="24"
@@ -69,9 +72,6 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when
             />
           </svg>
         </span>
-        <span
-          class="MuiTouchRipple-root"
-        />
       </button>
       <div
         class="average text-18-normal"
@@ -103,6 +103,7 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when
           class="MuiIconButton-label"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="24"
             width="24"
@@ -112,9 +113,6 @@ exports[`ElecHalfHourMonthlyAnalysis component should be rendered correctly when
             />
           </svg>
         </span>
-        <span
-          class="MuiTouchRipple-root"
-        />
       </button>
     </div>
     <p
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap
index 940eea0eba67e229302d406768073180e0ad6356..8de384b77ddb9029ac0b808979db62710bbf9887 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/__snapshots__/ElecInfoModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`ElecInfoModal component should be rendered correctly with off-peak hour
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -150,6 +151,7 @@ exports[`ElecInfoModal component should be rendered correctly without off-peak h
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
diff --git a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/elecHalfHourMonthlyAnalysis.scss b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/elecHalfHourMonthlyAnalysis.scss
index 3e0e4b36eeb61c61c7bc4a09ffe3ff483f5410c4..a325dcfbc3ac7c0e6f8ca3d5b769140546602c52 100644
--- a/src/components/Analysis/ElecHalfHourMonthlyAnalysis/elecHalfHourMonthlyAnalysis.scss
+++ b/src/components/Analysis/ElecHalfHourMonthlyAnalysis/elecHalfHourMonthlyAnalysis.scss
@@ -2,6 +2,9 @@
 
 .special-elec-container {
   color: white;
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
 
   .elec-icon {
     margin: auto;
@@ -9,7 +12,6 @@
   }
   .title {
     text-align: center;
-    margin-top: 1rem;
     color: $grey-bright;
   }
   .navigator {
@@ -18,7 +20,6 @@
     align-items: center;
     width: 100%;
     text-align: center;
-    margin: 1rem 0;
     .text-1 {
       color: $grey-bright;
     }
@@ -35,44 +36,39 @@
   .activation-text {
     margin: 1rem 0 0.7rem 0;
   }
-  .oauthform-button-content {
-    display: flex;
-    padding: 0.5rem;
-  }
-  .oauthform-button-text {
-    text-align: left;
-    margin-left: 1rem;
-  }
-  .container {
-    margin-bottom: 1rem;
-    padding: 1rem;
-    border: 1px solid $grey-bright;
-    border-radius: 10px;
+
+  .elec-infos {
     display: flex;
+    flex-direction: column;
+    gap: 8px;
 
-    .min {
-      max-width: 150px;
-    }
-    .text {
+    .container {
       display: flex;
-      flex-direction: column;
-      justify-content: space-between;
-    }
-    .value {
-      margin-left: auto;
-      display: flex;
-      flex-direction: column;
-      align-items: self-end;
-      min-width: 80px;
-      justify-content: space-between;
-    }
-    .kvAval {
-      margin: auto 0 auto auto;
+      padding: 1rem;
+      border: 1px solid $soft-grey;
+      border-radius: 10px;
+
+      .min {
+        max-width: 150px;
+      }
+      .text {
+        display: flex;
+        flex-direction: column;
+        gap: 4px;
+        width: 100%;
+      }
+      .row {
+        display: flex;
+        justify-content: space-between;
+        margin: auto 0;
+      }
+      .value {
+        display: flex;
+        gap: 4px;
+        margin: auto 0;
+      }
     }
   }
-  .consomin {
-    min-height: 100px;
-  }
   .no_data {
     text-align: center;
     color: white;
@@ -82,7 +78,3 @@
     margin: auto;
   }
 }
-.graph-elec-half-hour {
-  height: 12rem;
-  margin-top: 2rem;
-}
diff --git a/src/components/Analysis/IncompleteDataWarning/IncompleteDataWarning.tsx b/src/components/Analysis/IncompleteDataWarning/IncompleteDataWarning.tsx
index 10fb96acb4314971829e4319a738e615c61bdd53..15e0f95c6f43163a2a18001d1c7eb492214d554e 100644
--- a/src/components/Analysis/IncompleteDataWarning/IncompleteDataWarning.tsx
+++ b/src/components/Analysis/IncompleteDataWarning/IncompleteDataWarning.tsx
@@ -1,6 +1,6 @@
 import warningDark from 'assets/icons/ico/warning-dark.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import { formatListWithAnd } from 'utils/utils'
diff --git a/src/components/Analysis/MaxConsumptionCard/MaxConsumptionCard.tsx b/src/components/Analysis/MaxConsumptionCard/MaxConsumptionCard.tsx
index 42429b5af412be83452c3d86aceef5db57b6677a..b0339c6d3ee7d56a81dde2cd5cb1ce2e0c3b8a02 100644
--- a/src/components/Analysis/MaxConsumptionCard/MaxConsumptionCard.tsx
+++ b/src/components/Analysis/MaxConsumptionCard/MaxConsumptionCard.tsx
@@ -1,21 +1,21 @@
-import IconButton from '@material-ui/core/IconButton'
 import GraphIcon from 'assets/icons/ico/graph-icon.svg'
 import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg'
 import RightArrowIcon from 'assets/icons/ico/right-arrow.svg'
 import BarChart from 'components/Charts/BarChart'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import DataloadSection from 'components/ConsumptionVisualizer/DataloadSection'
 import { useChartResize } from 'components/Hooks/useChartResize'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DataloadSectionType, FluidType, TimeStep } from 'enums'
 import { Datachart, Dataload, TimePeriod } from 'models'
 import React, { useEffect, useRef, useState } from 'react'
 import ConsumptionDataManager from 'services/consumption.service'
 import { setSelectedDate } from 'store/chart/chart.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
+import { getFluidName } from 'utils/utils'
 import './maxConsumptionCard.scss'
 
 const MaxConsumptionCard = ({
@@ -29,22 +29,15 @@ const MaxConsumptionCard = ({
   const { analysisMonth } = useAppSelector(state => state.ecolyo.analysis)
   const [isLoading, setIsLoading] = useState<boolean>(false)
   const [maxDayData, setMaxDayData] = useState<Dataload | null>(null)
+  const [currentFluid, setCurrentFluid] = useState<FluidType>(fluidsWithData[0])
   const [chartData, setChartData] = useState<Datachart>({
     actualData: [],
     comparisonData: null,
   })
   const containerRef = useRef<HTMLDivElement>(null)
   const { height, width } = useChartResize(containerRef, isLoading, 250, 940)
-  const [currentFluid, setCurrentFluid] = useState<FluidType | undefined>()
 
-  useEffect(() => {
-    setCurrentFluid(fluidsWithData[0])
-  }, [fluidsWithData])
-
-  const currentFluidSlug = FluidType[currentFluid || 0] as
-    | 'ELECTRICITY'
-    | 'WATER'
-    | 'GAZ'
+  const fluidName = getFluidName(currentFluid || FluidType.ELECTRICITY)
 
   const handleFluidChange = (direction: number) => {
     if (currentFluid === undefined) return
@@ -68,11 +61,11 @@ const MaxConsumptionCard = ({
         endDate: analysisMonth.minus({ month: 1 }).endOf('month'),
       }
       const consumptionService = new ConsumptionDataManager(client)
-      const monthlyData = await consumptionService.getGraphData(
+      const monthlyData = await consumptionService.getGraphData({
         timePeriod,
-        TimeStep.DAY,
-        [currentFluid]
-      )
+        timeStep: TimeStep.DAY,
+        fluidTypes: [currentFluid],
+      })
 
       if (monthlyData && monthlyData?.actualData.length > 0) {
         setChartData(monthlyData)
@@ -86,9 +79,8 @@ const MaxConsumptionCard = ({
       }
       setIsLoading(false)
     }
-    if (subscribed) {
-      getMaxLoadData()
-    }
+    subscribed && getMaxLoadData()
+
     return () => {
       subscribed = false
     }
@@ -108,25 +100,25 @@ const MaxConsumptionCard = ({
   }
 
   const buttonPrev = () => (
-    <IconButton
-      aria-label={t('consumption.accessibility.button_previous_value')}
+    <StyledIconButton
+      icon={LeftArrowIcon}
+      sized={24}
       onClick={() => handleFluidChange(-1)}
-      className="arrow-prev"
       disabled={fluidsWithData.length <= 1}
-    >
-      <Icon icon={LeftArrowIcon} size={24} />
-    </IconButton>
+      aria-label={t('consumption.accessibility.button_previous_value')}
+      className="arrow-prev"
+    />
   )
 
   const buttonNext = () => (
-    <IconButton
-      aria-label={t('consumption.accessibility.button_next_value')}
+    <StyledIconButton
+      icon={RightArrowIcon}
+      sized={24}
       onClick={() => handleFluidChange(1)}
-      className="arrow-next"
       disabled={fluidsWithData.length <= 1}
-    >
-      <Icon icon={RightArrowIcon} size={24} />
-    </IconButton>
+      aria-label={t('consumption.accessibility.button_next_value')}
+      className="arrow-next"
+    />
   )
 
   return (
@@ -135,8 +127,8 @@ const MaxConsumptionCard = ({
       <div className="text-16-normal title">{t('analysis.max_day')}</div>
       <div className="fluid-navigation">
         {buttonPrev()}
-        <div className={`text-20-bold fluid ${currentFluidSlug.toLowerCase()}`}>
-          {t(`FLUID.${currentFluidSlug}.LABEL`)}
+        <div className={`text-20-bold fluid ${fluidName}`}>
+          {t(`FLUID.${fluidName.toUpperCase()}.LABEL`)}
         </div>
         {buttonNext()}
       </div>
diff --git a/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap b/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap
index 91030a58f917c22d05e9efbdecb62d6fb6013d9d..4839bb3492eca9e99483242c111061088c5a73d4 100644
--- a/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap
+++ b/src/components/Analysis/MaxConsumptionCard/__snapshots__/MaxConsumptionCard.spec.tsx.snap
@@ -33,6 +33,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
           class="MuiIconButton-label"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="24"
             width="24"
@@ -61,6 +62,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
           class="MuiIconButton-label"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="24"
             width="24"
@@ -121,7 +123,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
               transform="translate(54.6875, -40)"
             >
               <rect
-                class="background-false"
+                class="background-true"
                 fill="#E0E0E0"
                 height="220"
                 width="218.75"
@@ -152,7 +154,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
                 </lineargradient>
               </defs>
               <path
-                class="bar-ELECTRICITY disabled bounce-3 delay--0"
+                class="bar-ELECTRICITY selected disabled bounce-1 delay--0"
                 d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -164,11 +166,16 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
               />
             </g>
             <g
+              class="barValue"
+              tabindex="-1"
               transform="translate(54.6875, 168.73935065329292)"
             >
+              <title>
+                consumption.accessibility.bar
+              </title>
               <defs>
                 <lineargradient
-                  class="bar-ELECTRICITY disabled bounce-3 delay--0"
+                  class="bar-ELECTRICITY selected disabled bounce-1 delay--0"
                   id="gradient"
                   x1="0"
                   x2="0"
@@ -186,7 +193,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
                 </lineargradient>
               </defs>
               <path
-                class="bar-ELECTRICITY disabled bounce-3 delay--0"
+                class="bar-ELECTRICITY selected disabled bounce-1 delay--0"
                 d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -235,7 +242,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
                 </lineargradient>
               </defs>
               <path
-                class="bar-ELECTRICITY disabled bounce-3 delay--1"
+                class="bar-ELECTRICITY disabled bounce-1 delay--1"
                 d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -247,11 +254,16 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
               />
             </g>
             <g
+              class="barValue"
+              tabindex="-1"
               transform="translate(328.125, 168.73935065329292)"
             >
+              <title>
+                consumption.accessibility.bar
+              </title>
               <defs>
                 <lineargradient
-                  class="bar-ELECTRICITY disabled bounce-3 delay--1"
+                  class="bar-ELECTRICITY disabled bounce-1 delay--1"
                   id="gradient"
                   x1="0"
                   x2="0"
@@ -269,7 +281,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
                 </lineargradient>
               </defs>
               <path
-                class="bar-ELECTRICITY disabled bounce-3 delay--1"
+                class="bar-ELECTRICITY disabled bounce-1 delay--1"
                 d="
       M0,4
       a4,4 0 0 1 4,-4
@@ -318,7 +330,7 @@ exports[`MaxConsumptionCard component should be rendered correctly 1`] = `
                 </lineargradient>
               </defs>
               <path
-                class="bar-ELECTRICITY bar-UPCOMING disabled bounce-3 delay--2"
+                class="bar-ELECTRICITY bar-UPCOMING disabled bounce-1 delay--2"
                 d="
       M0,4
       a4,4 0 0 1 4,-4
diff --git a/src/components/Analysis/MonthlyAnalysis.tsx b/src/components/Analysis/MonthlyAnalysis.tsx
index 90e2d0253851d8285065acfa4a45f59b088564d9..dbe071720132403ca6d0197190bfca46c84b42b0 100644
--- a/src/components/Analysis/MonthlyAnalysis.tsx
+++ b/src/components/Analysis/MonthlyAnalysis.tsx
@@ -7,14 +7,16 @@ import React, { useEffect, useMemo, useState } from 'react'
 import ConsumptionService from 'services/consumption.service'
 import PerformanceIndicatorService from 'services/performanceIndicator.service'
 import { useAppSelector } from 'store/hooks'
+import { allFluids } from 'utils/utils'
 import Comparison from './Comparison/Comparison'
 import ElecHalfHourMonthlyAnalysis from './ElecHalfHourMonthlyAnalysis/ElecHalfHourMonthlyAnalysis'
 import IncompleteDataWarning from './IncompleteDataWarning/IncompleteDataWarning'
 import MaxConsumptionCard from './MaxConsumptionCard/MaxConsumptionCard'
+import './monthlyanalysis.scss'
+import NewsletterReminder from './NewsletterReminder/NewsletterReminder'
 import NoAnalysisModal from './NoKonnector/NoAnalysisModal'
 import ProfileComparator from './ProfileComparator/ProfileComparator'
 import TotalAnalysisChart from './TotalAnalysisChart/TotalAnalysisChart'
-import './monthlyanalysis.scss'
 
 interface MonthlyAnalysisProps {
   saveLastScrollPosition: () => void
@@ -27,8 +29,9 @@ const MonthlyAnalysis = ({
 }: MonthlyAnalysisProps) => {
   const client = useClient()
   const {
-    analysis: { analysisMonth },
+    analysis: { analysisMonth, haveSeenNewsletterReminder },
     global: { fluidStatus },
+    profile: { sendAnalysisNotification, isAnalysisReminderEnabled },
   } = useAppSelector(state => state.ecolyo)
 
   const consumptionService = useMemo(
@@ -44,7 +47,7 @@ const MonthlyAnalysis = ({
     fluid => fluid.status === FluidState.NOT_CONNECTED
   )
 
-  const [loadAnalysis, setLoadAnalysis] = useState<boolean>(true)
+  const [isLoadingAnalysis, setLoadingAnalysis] = useState<boolean>(true)
   const [openNoDataModal, setOpenNoDataModal] = useState(false)
   const [fluidsWithData, setFluidsWithData] = useState<FluidType[]>([])
   const [incompleteDataFluids, setIncompleteDataFluids] = useState<FluidType[]>(
@@ -60,11 +63,16 @@ const MonthlyAnalysis = ({
       percentageVariation: 0,
     })
 
+  const displayNewsletterReminder =
+    !sendAnalysisNotification &&
+    isAnalysisReminderEnabled &&
+    !haveSeenNewsletterReminder
+
   useEffect(() => {
     let subscribed = true
 
     const populateData = async () => {
-      setLoadAnalysis(true)
+      setLoadingAnalysis(true)
 
       const timePeriod: TimePeriod = {
         startDate: analysisMonth.minus({ month: 1 }).startOf('month'),
@@ -74,17 +82,16 @@ const MonthlyAnalysis = ({
         startDate: analysisMonth.minus({ month: 2 }).startOf('month'),
         endDate: analysisMonth.minus({ month: 2 }).endOf('month'),
       }
-      const resultFluids =
-        await consumptionService.getFluidsWithDataForTimePeriod(
-          [FluidType.ELECTRICITY, FluidType.WATER, FluidType.GAS],
+      const [resultFluids, fetchedIncompleteDataFluids] = await Promise.all([
+        consumptionService.getFluidsWithDataForTimePeriod(
+          allFluids,
           timePeriod
-        )
-
-      const fetchedIncompleteDataFluids =
-        await consumptionService.getFluidsWithIncompleteData(
-          [FluidType.ELECTRICITY, FluidType.WATER, FluidType.GAS],
+        ),
+        consumptionService.getFluidsWithIncompleteData(
+          allFluids,
           timePeriod.startDate
-        )
+        ),
+      ])
       setIncompleteDataFluids(fetchedIncompleteDataFluids)
 
       const fetchedPerformanceIndicators =
@@ -97,7 +104,7 @@ const MonthlyAnalysis = ({
 
       if (fetchedPerformanceIndicators) {
         setPerformanceIndicators(fetchedPerformanceIndicators)
-        setLoadAnalysis(false)
+        setLoadingAnalysis(false)
         setAggregatedPerformanceIndicators(
           performanceIndicatorService.aggregatePerformanceIndicators(
             fetchedPerformanceIndicators
@@ -108,12 +115,10 @@ const MonthlyAnalysis = ({
         setOpenNoDataModal(true)
       }
       setFluidsWithData(resultFluids)
-      setLoadAnalysis(false)
+      setLoadingAnalysis(false)
     }
 
-    if (subscribed) {
-      populateData()
-    }
+    subscribed && populateData()
 
     return () => {
       saveLastScrollPosition()
@@ -128,24 +133,30 @@ const MonthlyAnalysis = ({
   ])
 
   useEffect(() => {
-    if (!loadAnalysis) {
+    if (!isLoadingAnalysis) {
       const app = document.querySelector('.app-content')
       window.scrollTo(0, scrollPosition)
       app?.scrollTo(0, scrollPosition)
     }
-  }, [loadAnalysis, scrollPosition])
+  }, [isLoadingAnalysis, scrollPosition])
 
   return (
     <>
-      {loadAnalysis && (
+      {isLoadingAnalysis && (
         <div className="loaderContainer">
           <Loader />
         </div>
       )}
       <NoAnalysisModal open={openNoDataModal} onClose={setOpenNoDataModal} />
-      {!loadAnalysis && (
-        <Fade in={!loadAnalysis}>
+      {!isLoadingAnalysis && (
+        <Fade in={!isLoadingAnalysis}>
           <div className="analysis-root">
+            {displayNewsletterReminder && (
+              <div className="analysis-content">
+                <NewsletterReminder />
+              </div>
+            )}
+
             {incompleteDataFluids.length !== 0 && (
               <div className="analysis-content">
                 <IncompleteDataWarning
diff --git a/src/components/Analysis/NewsletterReminder/NewsletterReminder.spec.tsx b/src/components/Analysis/NewsletterReminder/NewsletterReminder.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..56381062c49a4e205397dc5075158e86b14f36e1
--- /dev/null
+++ b/src/components/Analysis/NewsletterReminder/NewsletterReminder.spec.tsx
@@ -0,0 +1,18 @@
+import { render } from '@testing-library/react'
+import React from 'react'
+import { Provider } from 'react-redux'
+import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import NewsletterReminder from './NewsletterReminder'
+
+describe('NewsletterReminder', () => {
+  const store = createMockEcolyoStore()
+
+  it('renders component correctly and have correct snapshot', () => {
+    const { container } = render(
+      <Provider store={store}>
+        <NewsletterReminder />
+      </Provider>
+    )
+    expect(container).toMatchSnapshot()
+  })
+})
diff --git a/src/components/Analysis/NewsletterReminder/NewsletterReminder.tsx b/src/components/Analysis/NewsletterReminder/NewsletterReminder.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..92d0c30dfc7bf9ba83150225198809bf0e28fa64
--- /dev/null
+++ b/src/components/Analysis/NewsletterReminder/NewsletterReminder.tsx
@@ -0,0 +1,58 @@
+import { Button } from '@material-ui/core'
+import CloseIcon from 'assets/icons/ico/close.svg'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import React from 'react'
+import { setHaveSeenNewsletterReminder } from 'store/analysis/analysis.slice'
+import { useAppDispatch } from 'store/hooks'
+import { updateProfile } from 'store/profile/profile.slice'
+import './newsletterReminder.scss'
+
+const NewsletterReminder = () => {
+  const { t } = useI18n()
+  const dispatch = useAppDispatch()
+
+  return (
+    <div className="newsletter-reminder">
+      <StyledIconButton
+        icon={CloseIcon}
+        sized={18}
+        onClick={() => dispatch(setHaveSeenNewsletterReminder(true))}
+        aria-label={t('analysis.newsletter_reminder.close')}
+        className="close-button"
+      />
+      <div className="text-container">
+        <h2 className="title text-20-bold">
+          {t('analysis.newsletter_reminder.title')}
+        </h2>
+        <p className="text-18-normal">
+          {t('analysis.newsletter_reminder.text')}
+        </p>
+      </div>
+      <div className="buttons">
+        <Button
+          className="btnPrimary"
+          onClick={() =>
+            dispatch(updateProfile({ sendAnalysisNotification: true }))
+          }
+        >
+          {t('analysis.newsletter_reminder.button')}
+        </Button>
+        <Button
+          classes={{
+            root: 'btnText',
+            label: 'text-16-normal stop-show',
+          }}
+          size="small"
+          onClick={() =>
+            dispatch(updateProfile({ isAnalysisReminderEnabled: false }))
+          }
+        >
+          {t('analysis.newsletter_reminder.stop_showing')}
+        </Button>
+      </div>
+    </div>
+  )
+}
+
+export default NewsletterReminder
diff --git a/src/components/Analysis/NewsletterReminder/__snapshots__/NewsletterReminder.spec.tsx.snap b/src/components/Analysis/NewsletterReminder/__snapshots__/NewsletterReminder.spec.tsx.snap
new file mode 100644
index 0000000000000000000000000000000000000000..bd881fec4b75b973494922ee89b9aba0b1815b8d
--- /dev/null
+++ b/src/components/Analysis/NewsletterReminder/__snapshots__/NewsletterReminder.spec.tsx.snap
@@ -0,0 +1,80 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`NewsletterReminder renders component correctly and have correct snapshot 1`] = `
+<div>
+  <div
+    class="newsletter-reminder"
+  >
+    <button
+      aria-label="analysis.newsletter_reminder.close"
+      class="MuiButtonBase-root MuiIconButton-root close-button"
+      tabindex="0"
+      type="button"
+    >
+      <span
+        class="MuiIconButton-label"
+      >
+        <svg
+          aria-hidden="true"
+          class="styles__icon___23x3R"
+          height="18"
+          width="18"
+        >
+          <use
+            xlink:href="#test-file-stub"
+          />
+        </svg>
+      </span>
+      <span
+        class="MuiTouchRipple-root"
+      />
+    </button>
+    <div
+      class="text-container"
+    >
+      <h2
+        class="title text-20-bold"
+      >
+        analysis.newsletter_reminder.title
+      </h2>
+      <p
+        class="text-18-normal"
+      >
+        analysis.newsletter_reminder.text
+      </p>
+    </div>
+    <div
+      class="buttons"
+    >
+      <button
+        class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
+        tabindex="0"
+        type="button"
+      >
+        <span
+          class="MuiButton-label"
+        >
+          analysis.newsletter_reminder.button
+        </span>
+        <span
+          class="MuiTouchRipple-root"
+        />
+      </button>
+      <button
+        class="MuiButtonBase-root MuiButton-root btnText MuiButton-text MuiButton-textSizeSmall MuiButton-sizeSmall"
+        tabindex="0"
+        type="button"
+      >
+        <span
+          class="MuiButton-label text-16-normal stop-show"
+        >
+          analysis.newsletter_reminder.stop_showing
+        </span>
+        <span
+          class="MuiTouchRipple-root"
+        />
+      </button>
+    </div>
+  </div>
+</div>
+`;
diff --git a/src/components/Analysis/NewsletterReminder/newsletterReminder.scss b/src/components/Analysis/NewsletterReminder/newsletterReminder.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e2366137e672b43c8c7f07b628cb076791f25f83
--- /dev/null
+++ b/src/components/Analysis/NewsletterReminder/newsletterReminder.scss
@@ -0,0 +1,46 @@
+@import 'src/styles/base/color';
+
+.newsletter-reminder {
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  text-align: center;
+  background: $grey-linear-gradient-background;
+  border: 1px solid $gold-shadow;
+  border-radius: 4px;
+  padding: 24px 16px 12px 16px;
+  gap: 16px;
+
+  .close-button {
+    position: absolute;
+    top: 0.5rem;
+    right: 0.5rem;
+    padding: 5px 5px;
+  }
+
+  .text-container {
+    h2 {
+      color: $gold-shadow;
+      margin: 0;
+      padding-inline: 1.5rem;
+    }
+    p {
+      color: $white;
+      margin: 0;
+    }
+  }
+
+  .buttons {
+    display: flex;
+    flex-direction: column;
+    gap: 12px;
+
+    button.btnPrimary {
+      max-width: 134px;
+    }
+    .stop-show {
+      color: $soft-grey;
+    }
+  }
+}
diff --git a/src/components/Analysis/NoKonnector/NoAnalysisModal.tsx b/src/components/Analysis/NoKonnector/NoAnalysisModal.tsx
index c543f56bd904e0c4eae38680945db8f50aa2518b..b68ddbb2e0789a322558fd16b5abb91c421dcdf2 100644
--- a/src/components/Analysis/NoKonnector/NoAnalysisModal.tsx
+++ b/src/components/Analysis/NoKonnector/NoAnalysisModal.tsx
@@ -1,6 +1,6 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './noAnalysisModal.scss'
diff --git a/src/components/Analysis/ProfileComparator/ProfileComparator.tsx b/src/components/Analysis/ProfileComparator/ProfileComparator.tsx
index 23e00858b499b9f757f2832af1a12482b3f1a3d5..097182f98140b37fec2dbdff4832420a079efe12 100644
--- a/src/components/Analysis/ProfileComparator/ProfileComparator.tsx
+++ b/src/components/Analysis/ProfileComparator/ProfileComparator.tsx
@@ -11,10 +11,9 @@ import PlaceHolderIcon from 'assets/icons/visu/analysis/no-profile-placeholder.s
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
-import { MonthlyForecast, PerformanceIndicator, ProfileType } from 'models'
+import { MonthlyForecast, PerformanceIndicator } from 'models'
 import React, { useCallback, useEffect, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
 import ProfileTypeService from 'services/profileType.service'
@@ -35,7 +34,6 @@ const ProfileComparator = ({
   const { t } = useI18n()
   const client = useClient()
   const navigate = useNavigate()
-  const userPriceConsumption: number = aggregatedPerformanceIndicator.value || 0
   const {
     analysis: { analysisMonth },
     profile,
@@ -43,22 +41,9 @@ const ProfileComparator = ({
   const [homePriceConsumption, setHomePriceConsumption] = useState<number>(0)
   const [forecast, setForecast] = useState<MonthlyForecast | null>(null)
   const [isLoading, setIsLoading] = useState<boolean>(true)
+  const [isExpanded, setIsExpanded] = useState<boolean>(false)
 
-  const [activeAverageHome, setActiveAverageHome] = useState<boolean>(false)
-  const toggleAccordion = () => {
-    setActiveAverageHome(prev => !prev)
-    if (!activeAverageHome) {
-      setTimeout(() => {
-        const content = document.querySelector('.consumption-electricity')
-        if (content) {
-          content.scrollIntoView({
-            behavior: 'smooth',
-            block: 'start',
-          })
-        }
-      }, 300)
-    }
-  }
+  const userPriceConsumption = aggregatedPerformanceIndicator.value || 0
 
   const emptyFluidTypes: FluidType[] = []
   if (performanceIndicators.length === 0) {
@@ -72,6 +57,22 @@ const ProfileComparator = ({
     }
   }
 
+  /** Toggle accordion and scroll to the first element */
+  const toggleAccordion = () => {
+    setIsExpanded(prev => !prev)
+    if (!isExpanded) {
+      setTimeout(() => {
+        const content = document.querySelector('.consumption-electricity')
+        if (content) {
+          content.scrollIntoView({
+            behavior: 'smooth',
+            block: 'start',
+          })
+        }
+      }, 300)
+    }
+  }
+
   const getTotalValueWithConnectedFluids = useCallback(
     (monthlyForecast: MonthlyForecast) => {
       if (performanceIndicators.length === 3) {
@@ -93,29 +94,27 @@ const ProfileComparator = ({
     async function loadAverageConsumption() {
       const analysisDate = analysisMonth.minus({ month: 1 }).startOf('month')
       const profileTypeEntityService = new ProfileTypeEntityService(client)
-      const profileType: ProfileType | null =
+      const profileType =
         await profileTypeEntityService.getProfileType(analysisDate)
       if (profileType !== null) {
-        const profileTypeService: ProfileTypeService = new ProfileTypeService(
+        const profileTypeService = new ProfileTypeService(
           profileType,
           client,
           analysisMonth.minus({ month: 1 }).year
         )
-        const monthlyForecast: MonthlyForecast =
-          await profileTypeService.getMonthlyForecast(
-            analysisDate.year,
-            analysisDate.month
-          )
-        if (subscribed) {
-          setForecast(monthlyForecast)
-          if (monthlyForecast) {
-            getTotalValueWithConnectedFluids(monthlyForecast)
-          }
-          setIsLoading(false)
+        const monthlyForecast = await profileTypeService.getMonthlyForecast(
+          analysisDate.year,
+          analysisDate.month
+        )
+
+        setForecast(monthlyForecast)
+        if (monthlyForecast) {
+          getTotalValueWithConnectedFluids(monthlyForecast)
         }
+        setIsLoading(false)
       }
     }
-    loadAverageConsumption()
+    subscribed && loadAverageConsumption()
     return () => {
       subscribed = false
     }
@@ -133,7 +132,6 @@ const ProfileComparator = ({
         {t('analysis.approximative_description')}
       </div>
       <Button
-        aria-label={t('analysis.accessibility.button_go_to_profil')}
         onClick={() => navigate('/profileType')}
         classes={{
           root: 'btnPrimary',
@@ -144,16 +142,11 @@ const ProfileComparator = ({
       >
         {t('analysis.accessibility.button_go_to_profil')}
       </Button>
-      <Icon
-        icon={PlaceHolderIcon}
-        width="100%"
-        height="60%"
-        alt="pas de profil remplis"
-      />
+      <StyledIcon icon={PlaceHolderIcon} height={150} />
     </div>
   )
 
-  const Consumption = (
+  const comparison = (
     <div className="analysis-graph">
       {isLoading ? (
         <div className="loader-container">
@@ -163,7 +156,6 @@ const ProfileComparator = ({
         <>
           <div className="consumption-title text-20-bold">
             <div className="user-title">{t('analysis.user_consumption')}</div>
-            <div />
             <div className="average-title">{t(`analysis.comparison`)}</div>
           </div>
           <ProfileComparatorRow
@@ -205,7 +197,7 @@ const ProfileComparator = ({
           ))}
 
           <Accordion
-            expanded={activeAverageHome}
+            expanded={isExpanded}
             onChange={toggleAccordion}
             classes={{
               root: 'expansion-panel-root',
@@ -216,7 +208,7 @@ const ProfileComparator = ({
                 'profile_type.accessibility.button_toggle_average_home'
               )}
               expandIcon={
-                <Icon icon={chevronDown} size={16} className="accordion-icon" />
+                <StyledIcon icon={chevronDown} className="accordion-icon" />
               }
               classes={{
                 root: 'expansion-panel-summary',
@@ -261,10 +253,8 @@ const ProfileComparator = ({
         )}
       </div>
 
-      <div className="analysis-graph">
-        {!profile.isProfileTypeCompleted && profileNotCompleted}
-        {profile.isProfileTypeCompleted && Consumption}
-      </div>
+      {!profile.isProfileTypeCompleted && profileNotCompleted}
+      {profile.isProfileTypeCompleted && comparison}
     </>
   )
 }
diff --git a/src/components/Analysis/ProfileComparator/ProfileComparatorRow.spec.tsx b/src/components/Analysis/ProfileComparator/ProfileComparatorRow.spec.tsx
index 62845a52f0cebe1be5cba0856bd46af2285133bc..18ccf5ee69556c50ba5e8ce37743a21a8f3eef66 100644
--- a/src/components/Analysis/ProfileComparator/ProfileComparatorRow.spec.tsx
+++ b/src/components/Analysis/ProfileComparator/ProfileComparatorRow.spec.tsx
@@ -11,7 +11,7 @@ describe('AnalysisConsumptionRow component', () => {
   const performanceValue = 25
 
   describe('Multifluid row', () => {
-    it('should be rendered correctly for Multifluid and at least fluid connected', async () => {
+    it('should be rendered correctly for Multifluid and at least fluid connected', () => {
       const { container } = render(
         <ProfileComparatorRow
           fluidType={FluidType.MULTIFLUID}
@@ -34,7 +34,7 @@ describe('AnalysisConsumptionRow component', () => {
       ).toBeFalsy()
     })
 
-    it('should be rendered correctly for Multifluid and at none fluid connected', async () => {
+    it('should be rendered correctly for Multifluid and at none fluid connected', () => {
       const mockConnected = false
       const { container } = render(
         <ProfileComparatorRow
@@ -62,7 +62,7 @@ describe('AnalysisConsumptionRow component', () => {
   })
 
   describe('Single fluid row', () => {
-    it('should be rendered correctly for singleFluid connected for average', async () => {
+    it('should be rendered correctly for singleFluid connected for average', () => {
       const { container } = render(
         <ProfileComparatorRow
           fluidType={FluidType.ELECTRICITY}
@@ -90,7 +90,7 @@ describe('AnalysisConsumptionRow component', () => {
       ).toBeFalsy()
     })
 
-    it('should be rendered correctly for singleFluid not connected', async () => {
+    it('should be rendered correctly for singleFluid not connected', () => {
       const mockConnected = false
       const { container } = render(
         <ProfileComparatorRow
@@ -119,8 +119,8 @@ describe('AnalysisConsumptionRow component', () => {
       ).toBeTruthy()
     })
 
-    it('should be rendered correctly for singleFluid with none performance value', async () => {
-      const mockPerformanceValue: number | null = null
+    it('should be rendered correctly for singleFluid with none performance value', () => {
+      const mockPerformanceValue = null
       const { container } = render(
         <ProfileComparatorRow
           fluidType={FluidType.ELECTRICITY}
@@ -146,7 +146,7 @@ describe('AnalysisConsumptionRow component', () => {
       ).toBeFalsy()
     })
 
-    it('should be rendered correctly with unit', async () => {
+    it('should be rendered correctly with unit', () => {
       const mockForecast: MonthlyForecast = {
         ...mockMonthlyForecastJanuaryTestProfile1,
         fluidForecast: [
diff --git a/src/components/Analysis/ProfileComparator/ProfileComparatorRow.tsx b/src/components/Analysis/ProfileComparator/ProfileComparatorRow.tsx
index 5d9fcb185d1862c01d949ba40d0ef8cf7ac7f7df..7b47c580bbbab986ec5605c6ad3a40e1f60af76b 100644
--- a/src/components/Analysis/ProfileComparator/ProfileComparatorRow.tsx
+++ b/src/components/Analysis/ProfileComparator/ProfileComparatorRow.tsx
@@ -1,7 +1,7 @@
-import EuroIcon from 'assets/icons/ico/euro-icon.svg'
+import EuroIcon from 'assets/icons/ico/euro-gold.svg'
 import classNames from 'classnames'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import { MonthlyForecast } from 'models'
 import React from 'react'
@@ -30,7 +30,7 @@ const ProfileComparatorRow = ({
   noData,
 }: ProfileComparatorRowProps) => {
   const { t } = useI18n()
-  const converterService: ConverterService = new ConverterService()
+  const converterService = new ConverterService()
   const maxPriceConsumption = Math.max(
     userPriceConsumption,
     homePriceConsumption
@@ -41,65 +41,58 @@ const ProfileComparatorRow = ({
   const FLUIDNAME = getFluidName(fluidType).toUpperCase()
 
   const fluidLoad =
-    forecast && !isMulti ? forecast.fluidForecast[fluidType].load : 0
+    !isMulti && forecast ? forecast.fluidForecast[fluidType].load : 0
 
   const formatFluidConsumptionForConso = () => {
     if (isMulti) {
       return `${formatNumberValues(userPriceConsumption).toString()} €`
-    } else {
-      if (performanceValue) {
-        // keeps unit in kWh for electricity and gas
-        if (isElecOrGas) {
-          return `${Math.round(performanceValue)} ${t(
-            `FLUID.${FLUIDNAME}.UNIT`
-          )}`
-        }
-        return performanceValue >= 1000 || fluidLoad >= 1000
-          ? formatNumberValues(performanceValue / 1000).toString() +
-              ' ' +
-              t(`FLUID.${FLUIDNAME}.MEGAUNIT`)
-          : Math.round(performanceValue) + ' ' + t(`FLUID.${FLUIDNAME}.UNIT`)
-      } else {
-        return '-'
+    }
+    if (performanceValue) {
+      // keeps unit in kWh for electricity and gas
+      if (isElecOrGas) {
+        return `${Math.round(performanceValue)} ${t(`FLUID.${FLUIDNAME}.UNIT`)}`
       }
+      return performanceValue >= 1000 || fluidLoad >= 1000
+        ? formatNumberValues(performanceValue / 1000).toString() +
+            ' ' +
+            t(`FLUID.${FLUIDNAME}.MEGAUNIT`)
+        : Math.round(performanceValue) + ' ' + t(`FLUID.${FLUIDNAME}.UNIT`)
     }
+    return '-'
   }
 
   const formatFluidConsumptionForForecast = () => {
     if (isMulti) {
       return `${formatNumberValues(homePriceConsumption).toString()} €`
-    } else {
-      // keeps unit in kWh for electricity and gas
-      if (isElecOrGas) {
-        return `${Math.round(fluidLoad)} ${t('FLUID.' + FLUIDNAME + '.UNIT')}`
-      }
-      return (performanceValue && performanceValue >= 1000) || fluidLoad >= 1000
-        ? formatNumberValues(fluidLoad / 1000).toString() +
-            ' ' +
-            t(`FLUID.${FLUIDNAME}.MEGAUNIT`)
-        : Math.round(fluidLoad) + ' ' + t(`FLUID.${FLUIDNAME}.UNIT`)
     }
+    // keeps unit in kWh for electricity and gas
+    if (isElecOrGas) {
+      return `${Math.round(fluidLoad)} ${t(`FLUID.${FLUIDNAME}.UNIT`)}`
+    }
+    return (performanceValue && performanceValue >= 1000) || fluidLoad >= 1000
+      ? formatNumberValues(fluidLoad / 1000).toString() +
+          ' ' +
+          t(`FLUID.${FLUIDNAME}.MEGAUNIT`)
+      : Math.round(fluidLoad) + ' ' + t(`FLUID.${FLUIDNAME}.UNIT`)
   }
 
   const getWidthForConso = () => {
     if (isMulti) {
       return `${(userPriceConsumption / maxPriceConsumption) * 100}%`
-    } else {
-      return `${
-        (converterService.LoadToEuro(performanceValue || 0, fluidType) /
-          maxPriceConsumption) *
-        100
-      }%`
     }
+    return `${
+      (converterService.LoadToEuro(performanceValue || 0, fluidType) /
+        maxPriceConsumption) *
+      100
+    }%`
   }
 
   const getWidthForForecast = () => {
     if (isMulti) {
       return `${(homePriceConsumption / maxPriceConsumption) * 100}%`
-    } else {
-      const fluidValue = forecast ? forecast.fluidForecast[fluidType].value : 0
-      return `${(fluidValue / maxPriceConsumption) * 100}%`
     }
+    const fluidValue = forecast ? forecast.fluidForecast[fluidType].value : 0
+    return `${(fluidValue / maxPriceConsumption) * 100}%`
   }
 
   const comparaisonText = connected
@@ -107,7 +100,12 @@ const ProfileComparatorRow = ({
     : t(`analysis.no_data`)
 
   return (
-    <div className={`analysisRow consumption-${FLUIDNAME.toLowerCase()}`}>
+    <div
+      aria-label={t(
+        `analysis.accessibility.comparison_${FLUIDNAME.toLowerCase()}`
+      )}
+      className={`analysisRow consumption-${FLUIDNAME.toLowerCase()}`}
+    >
       <div className="user-graph">
         <div
           className={classNames('price text-15-bold', {
diff --git a/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap b/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap
index 0ec6fdfe3f1938edb876719ba7253d5b03b1752c..bf328e562fc59ee28024e3c48c951869eb4cbc26 100644
--- a/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap
+++ b/src/components/Analysis/ProfileComparator/__snapshots__/ProfileComparator.spec.tsx.snap
@@ -24,43 +24,38 @@ exports[`AnalysisConsumption component should be rendered correctly with profile
     </div>
   </div>
   <div
-    class="analysis-graph"
+    class="no-profile"
   >
     <div
-      class="no-profile"
+      class="text-16-normal"
     >
-      <div
-        class="text-16-normal"
-      >
-        analysis.approximative_description
-      </div>
-      <button
-        aria-label="analysis.accessibility.button_go_to_profil"
-        class="MuiButtonBase-root MuiButton-root btnPrimary MuiButton-text MuiButton-textSizeLarge MuiButton-sizeLarge"
-        data-testid="goToProfile"
-        tabindex="0"
-        type="button"
-      >
-        <span
-          class="MuiButton-label text-18-bold"
-        >
-          analysis.accessibility.button_go_to_profil
-        </span>
-        <span
-          class="MuiTouchRipple-root"
-        />
-      </button>
-      <svg
-        alt="pas de profil remplis"
-        class="styles__icon___23x3R"
-        height="60%"
-        width="100%"
-      >
-        <use
-          xlink:href="#test-file-stub"
-        />
-      </svg>
+      analysis.approximative_description
     </div>
+    <button
+      class="MuiButtonBase-root MuiButton-root btnPrimary MuiButton-text MuiButton-textSizeLarge MuiButton-sizeLarge"
+      data-testid="goToProfile"
+      tabindex="0"
+      type="button"
+    >
+      <span
+        class="MuiButton-label text-18-bold"
+      >
+        analysis.accessibility.button_go_to_profil
+      </span>
+      <span
+        class="MuiTouchRipple-root"
+      />
+    </button>
+    <svg
+      aria-hidden="true"
+      class="styles__icon___23x3R"
+      height="150"
+      width="16"
+    >
+      <use
+        xlink:href="#test-file-stub"
+      />
+    </svg>
   </div>
 </div>
 `;
@@ -117,116 +112,112 @@ exports[`AnalysisConsumption component should be rendered correctly with profile
     class="analysis-graph"
   >
     <div
-      class="analysis-graph"
+      class="consumption-title text-20-bold"
     >
       <div
-        class="consumption-title text-20-bold"
+        class="user-title"
       >
-        <div
-          class="user-title"
-        >
-          analysis.user_consumption
-        </div>
-        <div />
-        <div
-          class="average-title"
-        >
-          analysis.comparison
-        </div>
+        analysis.user_consumption
       </div>
-      <mock-profilecomparatorrow
-        connected="true"
-        fluidtype="3"
-        homepriceconsumption="0"
-        nodata="false"
-        userpriceconsumption="156.161853"
-      />
-      <mock-profilecomparatorrow
-        connected="true"
-        fluidtype="0"
-        homepriceconsumption="0"
-        nodata="false"
-        performancevalue="178.54"
-        userpriceconsumption="156.161853"
-      />
-      <mock-profilecomparatorrow
-        connected="true"
-        fluidtype="1"
-        homepriceconsumption="0"
-        nodata="false"
-        performancevalue="7763.98"
-        userpriceconsumption="156.161853"
-      />
-      <mock-profilecomparatorrow
-        connected="true"
-        fluidtype="2"
-        homepriceconsumption="0"
-        nodata="false"
-        performancevalue="1317.67"
-        userpriceconsumption="156.161853"
-      />
       <div
-        class="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded"
+        class="average-title"
+      >
+        analysis.comparison
+      </div>
+    </div>
+    <mock-profilecomparatorrow
+      connected="true"
+      fluidtype="3"
+      homepriceconsumption="0"
+      nodata="false"
+      userpriceconsumption="156.161853"
+    />
+    <mock-profilecomparatorrow
+      connected="true"
+      fluidtype="0"
+      homepriceconsumption="0"
+      nodata="false"
+      performancevalue="178.54"
+      userpriceconsumption="156.161853"
+    />
+    <mock-profilecomparatorrow
+      connected="true"
+      fluidtype="1"
+      homepriceconsumption="0"
+      nodata="false"
+      performancevalue="7763.98"
+      userpriceconsumption="156.161853"
+    />
+    <mock-profilecomparatorrow
+      connected="true"
+      fluidtype="2"
+      homepriceconsumption="0"
+      nodata="false"
+      performancevalue="1317.67"
+      userpriceconsumption="156.161853"
+    />
+    <div
+      class="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded"
+    >
+      <div
+        aria-disabled="false"
+        aria-expanded="false"
+        aria-label="profile_type.accessibility.button_toggle_average_home"
+        class="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary"
+        role="button"
+        tabindex="0"
       >
         <div
-          aria-disabled="false"
-          aria-expanded="false"
-          aria-label="profile_type.accessibility.button_toggle_average_home"
-          class="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary"
-          role="button"
-          tabindex="0"
+          class="MuiAccordionSummary-content expansion-panel-content"
         >
           <div
-            class="MuiAccordionSummary-content expansion-panel-content"
+            class="accordion-title accordion-title"
           >
-            <div
-              class="accordion-title accordion-title"
-            >
-              analysis.average_home
-            </div>
+            analysis.average_home
           </div>
-          <div
-            aria-disabled="false"
-            aria-hidden="true"
-            class="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd"
+        </div>
+        <div
+          aria-disabled="false"
+          aria-hidden="true"
+          class="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd"
+        >
+          <span
+            class="MuiIconButton-label"
           >
-            <span
-              class="MuiIconButton-label"
+            <svg
+              aria-hidden="true"
+              class="accordion-icon styles__icon___23x3R"
+              height="16"
+              width="16"
             >
-              <svg
-                class="accordion-icon styles__icon___23x3R"
-                height="16"
-                width="16"
-              >
-                <use
-                  xlink:href="#test-file-stub"
-                />
-              </svg>
-            </span>
-          </div>
+              <use
+                xlink:href="#test-file-stub"
+              />
+            </svg>
+          </span>
         </div>
+      </div>
+      <div
+        class="MuiCollapse-root MuiCollapse-hidden"
+        style="min-height: 0px;"
+      >
         <div
-          class="MuiCollapse-root MuiCollapse-hidden"
-          style="min-height: 0px;"
+          class="MuiCollapse-wrapper"
         >
           <div
-            class="MuiCollapse-wrapper"
+            class="MuiCollapse-wrapperInner"
           >
             <div
-              class="MuiCollapse-wrapperInner"
+              role="region"
             >
               <div
-                role="region"
+                class="MuiAccordionDetails-root expansion-panel-details"
               >
-                <div
-                  class="MuiAccordionDetails-root expansion-panel-details"
+                <span
+                  class="accordion-desc text-16-normal"
                 >
-                  <span
-                    class="accordion-desc text-16-normal"
-                  >
-                    analysis.average_home_description
-                  </span>
-                </div>
+                  analysis.average_home_description
+                </span>
               </div>
             </div>
           </div>
diff --git a/src/components/Analysis/ProfileComparator/profileComparator.scss b/src/components/Analysis/ProfileComparator/profileComparator.scss
index 6ca14b923405df814f974b0c4906662aa26cf16a..3b5d0afcdcc8d31e2303fd22013925b4a4f2a7e9 100644
--- a/src/components/Analysis/ProfileComparator/profileComparator.scss
+++ b/src/components/Analysis/ProfileComparator/profileComparator.scss
@@ -2,10 +2,12 @@
 @import 'src/styles/base/breakpoint';
 
 .analysis-graph {
+  display: flex;
+  flex-direction: column;
+  gap: 1rem;
   .consumption-title {
     display: flex;
     justify-content: space-between;
-    margin-bottom: 1rem;
     .user-title,
     .average-title {
       flex-basis: 45%;
@@ -26,7 +28,7 @@
     margin: 1rem 0;
   }
   div.expansion-panel-root {
-    border: solid 2px $blue-grey;
+    border: solid 1px $blue-grey;
     color: $blue-grey;
     margin-block: 0 !important;
     box-shadow: 0px 4px 16px 0px $black-shadow;
@@ -63,4 +65,8 @@
   button {
     max-width: $width-small-phone;
   }
+
+  svg {
+    width: 100%;
+  }
 }
diff --git a/src/components/Analysis/ProfileComparator/profileComparatorRow.scss b/src/components/Analysis/ProfileComparator/profileComparatorRow.scss
index 898ca8eb40d1a8541e16051a0fa3d7e9f948ba02..d04be053554f81d6b07993d16aaea26d22346408 100644
--- a/src/components/Analysis/ProfileComparator/profileComparatorRow.scss
+++ b/src/components/Analysis/ProfileComparator/profileComparatorRow.scss
@@ -3,7 +3,6 @@
 
 .analysisRow {
   display: flex;
-  margin-bottom: 1rem;
   .user-graph {
     .container-graph {
       justify-content: flex-end;
diff --git a/src/components/Analysis/TotalAnalysisChart/PieChart.tsx b/src/components/Analysis/TotalAnalysisChart/PieChart.tsx
index ad96a96122221cf037ac4e0ab48d0bb088e6e7cb..12b27e060930b5b345f1b0149ef4b53a144a3fc5 100644
--- a/src/components/Analysis/TotalAnalysisChart/PieChart.tsx
+++ b/src/components/Analysis/TotalAnalysisChart/PieChart.tsx
@@ -23,7 +23,7 @@ const PieChart = ({
   const arcWidth = outerRadius - innerRadius
 
   useEffect(() => {
-    const dataloadArray: number[] = dataloadValueDetailArray.map(
+    const dataloadArray = dataloadValueDetailArray.map(
       dataload => dataload.value
     )
     const data = createPie(dataloadArray)
diff --git a/src/components/Analysis/TotalAnalysisChart/TotalAnalysisChart.tsx b/src/components/Analysis/TotalAnalysisChart/TotalAnalysisChart.tsx
index fd512fb31d2d47fd0ec432c8c6a64700f2b7b3d8..fc276de1dbf7c487c08bb227427a990987784814 100644
--- a/src/components/Analysis/TotalAnalysisChart/TotalAnalysisChart.tsx
+++ b/src/components/Analysis/TotalAnalysisChart/TotalAnalysisChart.tsx
@@ -1,9 +1,9 @@
 import { Button } from '@material-ui/core'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import EstimatedConsumptionModal from 'components/ConsumptionVisualizer/EstimatedConsumptionModal'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep } from 'enums'
 import { DataloadValueDetail, TimePeriod } from 'models'
 import React, { useEffect, useState } from 'react'
@@ -41,23 +41,19 @@ const TotalAnalysisChart = ({
         endDate: analysisMonth.minus({ month: 1 }).endOf('month'),
       }
       const consumptionService = new ConsumptionDataManager(client)
-      const monthTotalData = await consumptionService.getGraphData(
+      const monthTotalData = await consumptionService.getGraphData({
         timePeriod,
-        TimeStep.MONTH,
-        fluidsWithData,
-        undefined,
-        undefined,
-        true
-      )
+        timeStep: TimeStep.MONTH,
+        fluidTypes: fluidsWithData,
+        isHome: true,
+      })
       if (monthTotalData?.actualData) {
         setDataLoadValueDetailArray(monthTotalData.actualData[0].valueDetail)
         setTotalLoadValue(monthTotalData.actualData[0].value)
       }
       setIsLoading(false)
     }
-    if (subscribed) {
-      getTotalData()
-    }
+    subscribed && getTotalData()
     return () => {
       subscribed = false
     }
@@ -79,74 +75,76 @@ const TotalAnalysisChart = ({
   )
 
   return (
-    <>
-      <div
-        className="totalAnalysis-container"
-        style={{
-          minHeight: radius + 100,
-        }}
-      >
-        <div className="text-24-normal title">{t('analysis_pie.total')}</div>
+    <div
+      className="totalAnalysis-container"
+      style={{
+        minHeight: radius + 100,
+      }}
+    >
+      <div className="text-24-normal title">{t('analysis_pie.total')}</div>
 
-        {isLoading && <Loader />}
-        {!isLoading && !dataLoadValueDetailArray && emptyPieChart()}
-        {!isLoading && dataLoadValueDetailArray && (
-          <>
-            <PieChart
-              dataloadValueDetailArray={dataLoadValueDetailArray}
-              radius={radius}
-              innerRadius={innerRadius}
-              outerRadius={outerRadius}
+      {isLoading && <Loader />}
+      {!isLoading && !dataLoadValueDetailArray && emptyPieChart()}
+      {!isLoading && dataLoadValueDetailArray && (
+        <>
+          <PieChart
+            dataloadValueDetailArray={dataLoadValueDetailArray}
+            radius={radius}
+            innerRadius={innerRadius}
+            outerRadius={outerRadius}
+          >
+            <div className="text-36-bold">
+              {formatNumberValues(totalLoadValue)}
+              <span className="euro-unit">{t('FLUID.MULTIFLUID.UNIT')}</span>
+            </div>
+            <div className="text-16-normal date">
+              {t('analysis_pie.month') +
+                getMonthNameWithPrep(analysisMonth.minus({ month: 1 }))}
+            </div>
+            <Button
+              className="btnText"
+              onClick={() => setOpenEstimationModal(true)}
+            >
+              <span
+                className="estimated"
+                dangerouslySetInnerHTML={{
+                  __html: t('analysis_pie.estimation'),
+                }}
+              />
+            </Button>
+          </PieChart>
+          <EstimatedConsumptionModal
+            open={openEstimationModal}
+            handleCloseClick={() => setOpenEstimationModal(false)}
+          />
+          {dataLoadValueDetailArray && fluidsWithData.length > 1 && (
+            <div
+              role="list"
+              aria-label={t('analysis_pie.details')}
+              className="total-card-container"
             >
-              <div className="text-36-bold">
-                {formatNumberValues(totalLoadValue)}
-                <span className="euro-unit">{t('FLUID.MULTIFLUID.UNIT')}</span>
-              </div>
-              <div className="text-16-normal date">
-                {t('analysis_pie.month') +
-                  getMonthNameWithPrep(analysisMonth.minus({ month: 1 }))}
-              </div>
-              <Button
-                className="btnText"
-                onClick={() => setOpenEstimationModal(true)}
-              >
-                <span
-                  className="estimated"
-                  dangerouslySetInnerHTML={{
-                    __html: t('analysis_pie.estimation'),
-                  }}
-                />
-              </Button>
-            </PieChart>
-            <EstimatedConsumptionModal
-              open={openEstimationModal}
-              handleCloseClick={() => setOpenEstimationModal(false)}
-            />
-            {dataLoadValueDetailArray && fluidsWithData.length > 1 && (
-              <div className="total-card-container">
-                {dataLoadValueDetailArray.map((dataload, index) => (
-                  <div key={index} className="total-card">
-                    <div className="text-18-bold fluidconso">
-                      {dataload.value !== -1
-                        ? `${formatNumberValues(dataload.value)} €`
-                        : '--- €'}
-                    </div>
-                    <Icon
-                      className="euro-fluid-icon"
-                      icon={getNavPicto(index, true, true)}
-                      size={38}
-                    />
-                    <div className="text-16-normal">
-                      {t(`FLUID.${FluidType[index]}.LABEL`)}
-                    </div>
+              {dataLoadValueDetailArray.map((dataload, index) => (
+                <div key={index} role="listitem" className="total-card">
+                  <div className="text-18-bold fluidconso">
+                    {dataload.value !== -1
+                      ? `${formatNumberValues(dataload.value)} €`
+                      : '--- €'}
                   </div>
-                ))}
-              </div>
-            )}
-          </>
-        )}
-      </div>
-    </>
+                  <StyledIcon
+                    className="euro-fluid-icon"
+                    icon={getNavPicto(index, true, true)}
+                    size={38}
+                  />
+                  <div className="text-16-normal">
+                    {t(`FLUID.${FluidType[index]}.LABEL`)}
+                  </div>
+                </div>
+              ))}
+            </div>
+          )}
+        </>
+      )}
+    </div>
   )
 }
 
diff --git a/src/components/Analysis/TotalAnalysisChart/__snapshots__/PieChart.spec.tsx.snap b/src/components/Analysis/TotalAnalysisChart/__snapshots__/PieChart.spec.tsx.snap
index a64f3b602ba4bb7cafaa83dbb124dbb29b1f0064..20053725acc98d82f7181dce3b0ea893d2abe407 100644
--- a/src/components/Analysis/TotalAnalysisChart/__snapshots__/PieChart.spec.tsx.snap
+++ b/src/components/Analysis/TotalAnalysisChart/__snapshots__/PieChart.spec.tsx.snap
@@ -41,7 +41,7 @@ exports[`PieChart component should be rendered correctly 1`] = `
         >
           <path
             class="arc"
-            d="M1.8369701987210297e-14,-300A300,300,0,0,1,259.8076211353316,-150A300,300,0,0,0,1.8369701987210297e-14,-300Z"
+            d="M0,-300A300,300,0,0,1,259.808,-150A300,300,0,0,0,0,-300Z"
             fill="#D87B39"
           />
         </g>
@@ -51,7 +51,7 @@ exports[`PieChart component should be rendered correctly 1`] = `
         >
           <path
             class="arc"
-            d="M259.8076211353316,-150A300,300,0,0,1,1.8369701987210297e-14,300A300,300,0,0,0,259.8076211353316,-150Z"
+            d="M259.808,-150A300,300,0,0,1,0,300A300,300,0,0,0,259.808,-150Z"
             fill="#3A98EC"
           />
         </g>
@@ -61,7 +61,7 @@ exports[`PieChart component should be rendered correctly 1`] = `
         >
           <path
             class="arc"
-            d="M1.8369701987210297e-14,300A300,300,0,1,1,-5.510910596163089e-14,-300A300,300,0,1,0,1.8369701987210297e-14,300Z"
+            d="M0,300A300,300,0,1,1,0,-300A300,300,0,1,0,0,300Z"
             fill="#45D1B8"
           />
         </g>
diff --git a/src/components/App.tsx b/src/components/App.tsx
index 7c4621ff74e7b5f7124b5b84ab84d7c001e6f744..b017acb9fc731913a3cf09494e435ef98d0b0c94 100644
--- a/src/components/App.tsx
+++ b/src/components/App.tsx
@@ -1,4 +1,3 @@
-import { ThemeProvider } from '@material-ui/core'
 import Navbar from 'components/Navbar/Navbar'
 import AppRoutes from 'components/Routes/Routes'
 import SplashRoot from 'components/Splash/SplashRoot'
@@ -10,13 +9,15 @@ import React, { useEffect } from 'react'
 import { useLocation } from 'react-router-dom'
 import { useAppSelector } from 'store/hooks'
 import MatomoTracker from 'utils/matomoTracker'
-import { theme } from './theme'
+import usePageTitle from './Hooks/usePageTitle'
+import SkipLink from './SkipLink/SkipLink'
 
 interface AppProps {
   tracker: undefined | MatomoTracker
 }
 
 export const App = ({ tracker }: AppProps) => {
+  usePageTitle()
   const location = useLocation()
   const {
     global: { termsStatus },
@@ -38,22 +39,25 @@ export const App = ({ tracker }: AppProps) => {
   }, [webviewIntent])
 
   return (
-    <Layout>
-      <ThemeProvider theme={theme}>
-        <SplashRoot>
-          {termsStatus.accepted && (
-            <>
-              <WelcomeModal open={!onboarding.isWelcomeSeen} />
-              <Navbar />
-            </>
-          )}
-          <main className="app-content">
-            <AppRoutes termsStatus={termsStatus} />
-          </main>
-        </SplashRoot>
-        {process.env.NODE_ENV !== 'production' ? <CozyDevtools /> : null}
-      </ThemeProvider>
-    </Layout>
+    <>
+      <SkipLink />
+      <Layout>
+        <>
+          <SplashRoot>
+            {termsStatus.accepted && (
+              <>
+                <WelcomeModal open={!onboarding.isWelcomeSeen} />
+                <Navbar />
+              </>
+            )}
+            <main id="app-content" className="app-content" tabIndex={-1}>
+              <AppRoutes termsStatus={termsStatus} />
+            </main>
+          </SplashRoot>
+          {process.env.NODE_ENV !== 'production' ? <CozyDevtools /> : null}
+        </>
+      </Layout>
+    </>
   )
 }
 
diff --git a/src/components/Challenge/ChallengeCard/ChallengeCard.tsx b/src/components/Challenge/ChallengeCard/ChallengeCard.tsx
index 52248f325d94af0b9ab758de41b3a59d4c7426da..004413f1484d92596ecb4dc5248103cff31444df 100644
--- a/src/components/Challenge/ChallengeCard/ChallengeCard.tsx
+++ b/src/components/Challenge/ChallengeCard/ChallengeCard.tsx
@@ -1,3 +1,4 @@
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeState } from 'enums'
 import { UserChallenge } from 'models'
 import React from 'react'
@@ -25,6 +26,8 @@ const ChallengeCard = ({
   cardHeight,
   moveToSlide,
 }: ChallengeCardProps) => {
+  const { t } = useI18n()
+
   const renderCard = (userChallenge: UserChallenge | undefined) => {
     switch (userChallenge?.state) {
       case UserChallengeState.LOCKED:
@@ -42,18 +45,22 @@ const ChallengeCard = ({
   }
 
   return (
-    // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
-    <div
+    <button
+      type="button"
+      aria-label={t('challenge.card.goto')}
       onClick={() => moveToSlide(index)}
       className={indexSlider === index ? 'slide active' : 'slide inactive'}
       style={{
         minWidth: `${cardWidth}px`,
         maxWidth: `${cardWidth}px`,
         minHeight: `${cardHeight}px`,
+        border: 'none',
+        background: 'none',
+        padding: 0,
       }}
     >
       {renderCard(userChallenge)}
-    </div>
+    </button>
   )
 }
 
diff --git a/src/components/Challenge/ChallengeCard/__snapshots__/ChallengeCard.spec.tsx.snap b/src/components/Challenge/ChallengeCard/__snapshots__/ChallengeCard.spec.tsx.snap
index f0c8b96afed6824c2a8027eb3f14d2aaae024c8c..32fa2966106a328f1e420f8dd02226d97fd08af1 100644
--- a/src/components/Challenge/ChallengeCard/__snapshots__/ChallengeCard.spec.tsx.snap
+++ b/src/components/Challenge/ChallengeCard/__snapshots__/ChallengeCard.spec.tsx.snap
@@ -2,9 +2,11 @@
 
 exports[`ChallengeCard component should be rendered correctly 1`] = `
 <div>
-  <div
+  <button
+    aria-label="challenge.card.goto"
     class="slide active"
-    style="min-width: 200px; max-width: 200px; min-height: 400px;"
+    style="min-width: 200px; max-width: 200px; min-height: 400px; background: none; padding: 0px;"
+    type="button"
   >
     <div
       class="cardContent cardDone"
@@ -40,7 +42,8 @@ RUISSEAU
         <span
           class="text-18"
         >
-          challenge.card_done.depense 
+          challenge.card_done.depense
+           
           <span
             class="text-18-bold"
           >
@@ -55,7 +58,6 @@ RUISSEAU
         class="buttons"
       >
         <button
-          aria-label="challenge.card_done.final_defi_view"
           class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
           tabindex="0"
           type="button"
@@ -70,7 +72,6 @@ RUISSEAU
           />
         </button>
         <button
-          aria-label="challenge.card_done.reset_defi"
           class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimaryNegative"
           tabindex="0"
           type="button"
@@ -86,6 +87,6 @@ RUISSEAU
         </button>
       </div>
     </div>
-  </div>
+  </button>
 </div>
 `;
diff --git a/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.spec.tsx b/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.spec.tsx
index d62b47d36700bfebc8cddf816d03ef991ab9ba93..f174bacde00861ab29e4f91befb7e4079148f24f 100644
--- a/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.spec.tsx
+++ b/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.spec.tsx
@@ -24,7 +24,7 @@ describe('ChallengeCardDone component', () => {
       challenge: { currentChallenge: null },
     },
   })
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={storeNoCurrentChallenge}>
         <ChallengeCardDone userChallenge={userChallengeData[0]} />
@@ -53,7 +53,7 @@ describe('ChallengeCardDone component', () => {
       })
       expect(mockUpdateUserChallenge).toHaveBeenCalledTimes(1)
     })
-    it('should not reset challenge if another challenge is on going', async () => {
+    it('should not reset challenge if another challenge is on going', () => {
       mockAppDispatch.mockImplementationOnce(() => mockDispatch)
       const store = mockStore({
         ecolyo: {
@@ -65,27 +65,33 @@ describe('ChallengeCardDone component', () => {
           <ChallengeCardDone userChallenge={userChallengeData[0]} />
         </Provider>
       )
-      const resetBtn = screen.getByLabelText('challenge.card_done.reset_defi')
+      const resetBtn = screen.getByRole('button', {
+        name: 'challenge.card_done.reset_defi',
+      })
       expect(resetBtn).toHaveProperty('disabled')
       expect(mockDispatch).toHaveBeenCalledTimes(0)
       expect(mockUpdateUserChallenge).toHaveBeenCalledTimes(0)
     })
-    it('should be primary button is challenge is lost', async () => {
+    it('should be primary button is challenge is lost', () => {
       render(
         <Provider store={storeNoCurrentChallenge}>
           <ChallengeCardDone userChallenge={userChallengeData[1]} />
         </Provider>
       )
-      const resetBtn = screen.getByLabelText('challenge.card_done.reset_defi')
+      const resetBtn = screen.getByRole('button', {
+        name: 'challenge.card_done.reset_defi',
+      })
       expect(resetBtn).toHaveClass('btnPrimaryNegative')
     })
-    it('should be secondary button is challenge is won', async () => {
+    it('should be secondary button is challenge is won', () => {
       render(
         <Provider store={storeNoCurrentChallenge}>
           <ChallengeCardDone userChallenge={userChallengeData[0]} />
         </Provider>
       )
-      const resetBtn = screen.getByLabelText('challenge.card_done.reset_defi')
+      const resetBtn = screen.getByRole('button', {
+        name: 'challenge.card_done.reset_defi',
+      })
       expect(resetBtn).toHaveClass('btnSecondary')
     })
   })
diff --git a/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.tsx b/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.tsx
index ec66ecbaaa8c37c70d9a38835794d5d0c6f96097..6110f52d758899b5ef695230a7eb7f90580466ca 100644
--- a/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.tsx
+++ b/src/components/Challenge/ChallengeCardDone/ChallengeCardDone.tsx
@@ -3,7 +3,7 @@ import defaultIcon from 'assets/icons/visu/duelResult/default.svg'
 import classNames from 'classnames'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeSuccess, UserChallengeUpdateFlag } from 'enums'
 import { UserChallenge } from 'models'
 import React, { useEffect, useState } from 'react'
@@ -28,34 +28,11 @@ const ChallengeCardDone = ({
   const client = useClient()
   const dispatch = useAppDispatch()
   const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
-  const [winIcon, setWinIcon] = useState<string>(defaultIcon)
-  const [lossIcon, setLossIcon] = useState<string>(defaultIcon)
+  const [resultIcon, setResultIcon] = useState<string>(defaultIcon)
 
-  const getUserSaving = (_userChallenge: UserChallenge) => {
-    let label
-    if (_userChallenge.success === UserChallengeSuccess.WIN)
-      label = t('challenge.card_done.saving')
-    else label = t('challenge.card_done.depense')
+  const isSuccess = userChallenge.success === UserChallengeSuccess.WIN
 
-    return label + ' '
-  }
-
-  const getResultLabel = (_userChallenge: UserChallenge) => {
-    switch (_userChallenge.success) {
-      case UserChallengeSuccess.WIN:
-        return t('challenge.card_done.win')
-      case UserChallengeSuccess.LOST:
-      default:
-        return t('challenge.card_done.lost')
-    }
-  }
-
-  const getIcon = (_userChallenge: UserChallenge) => {
-    if (_userChallenge.success == UserChallengeSuccess.WIN) return winIcon
-    else return lossIcon
-  }
-
-  const goDuel = async () => {
+  const goDuel = () => {
     navigate('/challenges/duel?id=' + userChallenge.id)
   }
 
@@ -70,13 +47,14 @@ const ChallengeCardDone = ({
 
   useEffect(() => {
     async function handleEcogestureIcon() {
-      const icon = await importIconById(userChallenge.id + '-1', 'duelResult')
-      setWinIcon(icon || defaultIcon)
-      const icon2 = await importIconById(userChallenge.id + '-0', 'duelResult')
-      setLossIcon(icon2 || defaultIcon)
+      const icon = await importIconById(
+        userChallenge.id + '-' + Number(isSuccess),
+        'duelResult'
+      )
+      setResultIcon(icon || defaultIcon)
     }
     handleEcogestureIcon()
-  }, [userChallenge])
+  }, [isSuccess, userChallenge])
 
   return (
     <div className="cardContent cardDone">
@@ -84,11 +62,7 @@ const ChallengeCardDone = ({
         {getChallengeTitleWithLineReturn(userChallenge.id)}
       </div>
       <div className="iconResult">
-        <StyledIcon
-          className="imgResult"
-          icon={getIcon(userChallenge)}
-          size={180}
-        />
+        <StyledIcon className="imgResult" icon={resultIcon} size={180} />
       </div>
       <div className="statsResult">
         <div
@@ -97,10 +71,14 @@ const ChallengeCardDone = ({
             lost: userChallenge.success === UserChallengeSuccess.LOST,
           })}
         >
-          {getResultLabel(userChallenge)}
+          {isSuccess
+            ? t('challenge.card_done.win')
+            : t('challenge.card_done.lost')}
         </div>
         <span className="text-18">
-          {getUserSaving(userChallenge)}
+          {isSuccess
+            ? t('challenge.card_done.saving')
+            : t('challenge.card_done.depense')}{' '}
           <span className="text-18-bold">
             {formatNumberValues(
               Math.abs(
@@ -115,15 +93,10 @@ const ChallengeCardDone = ({
         </span>
       </div>
       <div className="buttons">
-        <Button
-          aria-label={t('challenge.card_done.final_defi_view')}
-          onClick={goDuel}
-          className="btnSecondary"
-        >
+        <Button onClick={goDuel} className="btnSecondary">
           {t('challenge.card_done.final_defi_view')}
         </Button>
         <Button
-          aria-label={t('challenge.card_done.reset_defi')}
           onClick={handleChallengeReset}
           className={
             userChallenge.success === UserChallengeSuccess.WIN
diff --git a/src/components/Challenge/ChallengeCardDone/__snapshots__/ChallengeCardDone.spec.tsx.snap b/src/components/Challenge/ChallengeCardDone/__snapshots__/ChallengeCardDone.spec.tsx.snap
index 7df066b7f28a181089a3075beb5f502a88dba5ae..38b735fe151d96e983ddcf984fd689b512dc5f00 100644
--- a/src/components/Challenge/ChallengeCardDone/__snapshots__/ChallengeCardDone.spec.tsx.snap
+++ b/src/components/Challenge/ChallengeCardDone/__snapshots__/ChallengeCardDone.spec.tsx.snap
@@ -36,7 +36,8 @@ VEILLE
       <span
         class="text-18"
       >
-        challenge.card_done.saving 
+        challenge.card_done.saving
+         
         <span
           class="text-18-bold"
         >
@@ -51,7 +52,6 @@ VEILLE
       class="buttons"
     >
       <button
-        aria-label="challenge.card_done.final_defi_view"
         class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
         tabindex="0"
         type="button"
@@ -66,7 +66,6 @@ VEILLE
         />
       </button>
       <button
-        aria-label="challenge.card_done.reset_defi"
         class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
         tabindex="0"
         type="button"
diff --git a/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.spec.tsx b/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.spec.tsx
index f4825300a48bdda50d2ff32104a254aaca806a28..989c92034e5d09f8569b48831ba6376fb7f8d0c2 100644
--- a/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.spec.tsx
+++ b/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.spec.tsx
@@ -7,7 +7,7 @@ import ChallengeCardLast from './ChallengeCardLast'
 declare let __SAU_IDEA_DIRECT_LINK__: string
 
 describe('ChallengeCardLast component', () => {
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(<ChallengeCardLast />)
     expect(container).toMatchSnapshot()
   })
diff --git a/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.tsx b/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.tsx
index 2fef4046dc7682b742ff8e871321843be3dc119a..d9e55d98ef64ae5e4fcae1a2cc3e94bc914ca588 100644
--- a/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.tsx
+++ b/src/components/Challenge/ChallengeCardLast/ChallengeCardLast.tsx
@@ -2,7 +2,7 @@ import { Button } from '@material-ui/core'
 import ecolyoIcon from 'assets/icons/ico/ecolyo.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './challengeCardLast.scss'
 
@@ -23,11 +23,7 @@ const ChallengeCardLast = () => {
       <StyledIcon icon={ecolyoIcon} size={62} />
       <div className="text-22-bold">{t('challenge.card_last.title')}</div>
       <div className="text-18-normal">{t('challenge.card_last.message1')}</div>
-      <Button
-        aria-label={t('challenge.card_last.button')}
-        onClick={handleClickFeedbacks}
-        className="btnSecondary"
-      >
+      <Button onClick={handleClickFeedbacks} className="btnSecondary">
         {t('challenge.card_last.button')}
       </Button>
     </div>
diff --git a/src/components/Challenge/ChallengeCardLast/__snapshots__/ChallengeCardLast.spec.tsx.snap b/src/components/Challenge/ChallengeCardLast/__snapshots__/ChallengeCardLast.spec.tsx.snap
index 7d36624206fb1815aa9f10d018895ebf36b1e652..7100f0f0f9ac4dd3124a6c7a62edf28447039580 100644
--- a/src/components/Challenge/ChallengeCardLast/__snapshots__/ChallengeCardLast.spec.tsx.snap
+++ b/src/components/Challenge/ChallengeCardLast/__snapshots__/ChallengeCardLast.spec.tsx.snap
@@ -26,7 +26,6 @@ exports[`ChallengeCardLast component should be rendered correctly 1`] = `
       challenge.card_last.message1
     </div>
     <button
-      aria-label="challenge.card_last.button"
       class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
       tabindex="0"
       type="button"
diff --git a/src/components/Challenge/ChallengeCardLast/challengeCardLast.scss b/src/components/Challenge/ChallengeCardLast/challengeCardLast.scss
index b4cdf2d1b932027afd3d32d79af767911ecb5f3b..9ca4dec3af5403e01836936d31fc80e0016ae748 100644
--- a/src/components/Challenge/ChallengeCardLast/challengeCardLast.scss
+++ b/src/components/Challenge/ChallengeCardLast/challengeCardLast.scss
@@ -13,6 +13,7 @@
   flex-direction: column;
   align-items: center;
   justify-content: space-between;
+  flex: 1;
 
   svg {
     max-height: 150px;
diff --git a/src/components/Challenge/ChallengeCardLocked/ChallengeCardLocked.tsx b/src/components/Challenge/ChallengeCardLocked/ChallengeCardLocked.tsx
index 9d8a5d5ca9960e4d87f2c182b1d509527283a359..d48b419d7a41d475644634e1502b28d248c9e43d 100644
--- a/src/components/Challenge/ChallengeCardLocked/ChallengeCardLocked.tsx
+++ b/src/components/Challenge/ChallengeCardLocked/ChallengeCardLocked.tsx
@@ -1,6 +1,6 @@
 import challengeLockedIcon from 'assets/icons/visu/challenge/challengeLocked.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallenge } from 'models'
 import React from 'react'
 import { getChallengeTitleWithLineReturn } from 'utils/utils'
diff --git a/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx b/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx
index cdeb8d6ced57367c32eee675b20683aba75b66dd..aea83c8f9988c6f7207b6c50fb7ef7089efea679 100644
--- a/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx
+++ b/src/components/Challenge/ChallengeCardOnGoing/ChallengeCardOnGoing.tsx
@@ -10,7 +10,7 @@ import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import StarsContainer from 'components/CommonKit/StarsContainer/StarsContainer'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import {
   UserActionState,
   UserChallengeUpdateFlag,
@@ -19,7 +19,7 @@ import {
   UserQuizState,
 } from 'enums'
 import { UserChallenge } from 'models'
-import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import React, { useEffect, useMemo, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
 import ChallengeService from 'services/challenge.service'
 import { updateUserChallengeList } from 'store/challenge/challenge.slice'
@@ -41,7 +41,7 @@ const ChallengeCardOnGoing = ({
     challenge: { currentDataload },
     global: { fluidTypes, fluidStatus },
   } = useAppSelector(state => state.ecolyo)
-  const [isOneFluidUp, setIsOneFluidUp] = useState<boolean>(true)
+  const [noFluidConnected, setNoFluidConnected] = useState<boolean>(false)
   const [challengeIcon, setChallengeIcon] = useState<string>(defaultIcon)
   const [isDone, setIsDone] = useState<boolean>(false)
   const [isLoading, setIsLoading] = useState<boolean>(false)
@@ -55,10 +55,6 @@ const ChallengeCardOnGoing = ({
   const explorationFinished = userChallenge.progress.explorationProgress === 5
   const actionFinished = userChallenge.progress.actionProgress === 5
 
-  const toggleNoFluidModal = useCallback(() => {
-    setIsOneFluidUp(prev => !prev)
-  }, [])
-
   const challengeService = useMemo(() => new ChallengeService(client), [client])
 
   const goDuel = async () => {
@@ -78,7 +74,7 @@ const ChallengeCardOnGoing = ({
       navigate(`/challenges/duel?id=${userChallenge.id}`)
     } else {
       setIsLoading(false)
-      toggleNoFluidModal()
+      setNoFluidConnected(true)
     }
   }
 
@@ -105,14 +101,12 @@ const ChallengeCardOnGoing = ({
 
   useEffect(() => {
     let subscribed = true
-    async function importIcon() {
+    function importIcon() {
       importIconById(userChallenge.id, 'challenge').then(icon => {
-        if (subscribed) {
-          icon ? setChallengeIcon(icon) : setChallengeIcon(defaultChallengeIcon)
-        }
+        icon ? setChallengeIcon(icon) : setChallengeIcon(defaultChallengeIcon)
       })
     }
-    importIcon()
+    subscribed && importIcon()
     return () => {
       subscribed = false
     }
@@ -120,14 +114,12 @@ const ChallengeCardOnGoing = ({
 
   useEffect(() => {
     let subscribed = true
-    async function setChallengeResult() {
-      const isChallengeDone = await challengeService.isChallengeDone(
+    function setChallengeResult() {
+      const isChallengeDone = challengeService.isChallengeDone(
         userChallenge,
         currentDataload
       )
-      if (subscribed) {
-        setIsDone(isChallengeDone.isDone)
-      }
+      setIsDone(isChallengeDone.isDone)
     }
     const unlockDuel = async () => {
       if (
@@ -151,7 +143,7 @@ const ChallengeCardOnGoing = ({
       }
     }
     unlockDuel()
-    setChallengeResult()
+    subscribed && setChallengeResult()
     return () => {
       subscribed = false
     }
@@ -276,7 +268,9 @@ const ChallengeCardOnGoing = ({
         <>
           <div className="finalDuel result">
             <span>{t('challenge.card.ongoing.result')}</span>
-            <span>{t('challenge.card.ongoing.duelDone')}</span>
+            <span className="lowercase">
+              {t('challenge.card.ongoing.duelDone')}
+            </span>
           </div>
           <div className="notifChallenge">1</div>
         </>,
@@ -310,8 +304,8 @@ const ChallengeCardOnGoing = ({
       {actionButton()}
       {duelContainer()}
       <ChallengeNoFluidModal
-        open={!isOneFluidUp}
-        handleCloseClick={toggleNoFluidModal}
+        open={noFluidConnected}
+        handleCloseClick={() => setNoFluidConnected(false)}
       />
     </div>
   )
diff --git a/src/components/Challenge/ChallengeCardOnGoing/challengeCardOnGoing.scss b/src/components/Challenge/ChallengeCardOnGoing/challengeCardOnGoing.scss
index 64325543a8cf93f098d8ab8ffce8333bd790e6b1..9d1f4da02c5f1a1f1d11b38e51964bd18b7c5958 100644
--- a/src/components/Challenge/ChallengeCardOnGoing/challengeCardOnGoing.scss
+++ b/src/components/Challenge/ChallengeCardOnGoing/challengeCardOnGoing.scss
@@ -157,6 +157,9 @@
           font-size: 1rem;
         }
       }
+      .lowercase {
+        text-transform: lowercase;
+      }
     }
   }
 }
diff --git a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx
index e58f41e7ace4bd0f35815fdae51bab9fb613da9a..ac2f3a6cab54225ba47a8bc5579215a9e0631bbf 100644
--- a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx
+++ b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.spec.tsx
@@ -48,8 +48,10 @@ describe('ChallengeCardUnlocked component', () => {
   })
 
   it('should not display ChallengeNoFluidModal and update userChallenge when launching challenge with configured fluid', async () => {
+    mockStartUserChallenge.mockResolvedValue(userChallengeData[0])
     const store = createMockEcolyoStore({
       global: {
+        ...mockGlobalState,
         fluidTypes: [FluidType.ELECTRICITY],
         fluidStatus: [
           { ...mockGlobalState.fluidStatus[0], status: FluidState.DONE },
@@ -71,7 +73,8 @@ describe('ChallengeCardUnlocked component', () => {
     expect(mockStartUserChallenge).toHaveBeenCalledWith(userChallengeData[0])
   })
 
-  it('should not be able to launch challenge if another one is active', async () => {
+  it('should not be able to launch challenge if another one is active', () => {
+    mockStartUserChallenge.mockResolvedValue(userChallengeData[0])
     const store = createMockEcolyoStore({
       global: mockGlobalState,
       challenge: {
diff --git a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx
index 83926cbe364a54b9e8a17c80d1e5f80bcf32429e..3e999c0200e9356a189c1cc524c65b0e01605eef 100644
--- a/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx
+++ b/src/components/Challenge/ChallengeCardUnlocked/ChallengeCardUnlocked.tsx
@@ -2,7 +2,7 @@ import Button from '@material-ui/core/Button'
 import defaultIcon from 'assets/icons/visu/challenge/challengeLocked.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidState } from 'enums'
 import { UserChallenge } from 'models'
 import React, { useCallback, useEffect, useState } from 'react'
@@ -25,14 +25,14 @@ const ChallengeCardUnlocked = ({
     global: { fluidTypes, fluidStatus },
   } = useAppSelector(state => state.ecolyo)
   const dispatch = useAppDispatch()
-  const [openNoFluidModal, setopenNoFluidModal] = useState(false)
+  const [openNoFluidModal, setOpenNoFluidModal] = useState(false)
   const [challengeIcon, setChallengeIcon] = useState(defaultIcon)
-  let statusRequirementOk = false
 
   const toggleNoFluidModal = useCallback(() => {
-    setopenNoFluidModal(prev => !prev)
+    setOpenNoFluidModal(prev => !prev)
   }, [])
 
+  let statusRequirementOk = false
   fluidStatus.forEach(fluid => {
     if (
       fluid.status !== FluidState.NOT_CONNECTED &&
diff --git a/src/components/Challenge/ChallengeNoFluidModal/ChallengeNoFluidModal.tsx b/src/components/Challenge/ChallengeNoFluidModal/ChallengeNoFluidModal.tsx
index f59ef96d038a97a10d24ec3b4ef4e908f16b6649..65341088e684924a07ef3416fe7e82c69954291d 100644
--- a/src/components/Challenge/ChallengeNoFluidModal/ChallengeNoFluidModal.tsx
+++ b/src/components/Challenge/ChallengeNoFluidModal/ChallengeNoFluidModal.tsx
@@ -1,6 +1,6 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './challengeNoFluidModal.scss'
 
diff --git a/src/components/Challenge/ChallengeView.tsx b/src/components/Challenge/ChallengeView.tsx
index 6affdfee88aa882dd7fa7bd22f07be87ee98b64e..03173a4c4cb6e072464d6616badab83f6c143edc 100644
--- a/src/components/Challenge/ChallengeView.tsx
+++ b/src/components/Challenge/ChallengeView.tsx
@@ -6,13 +6,16 @@ import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import Content from 'components/Content/Content'
 import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeState } from 'enums'
 import React, { useCallback, useEffect, useState } from 'react'
 import { useAppSelector } from 'store/hooks'
 import ChallengeCard from './ChallengeCard/ChallengeCard'
 import './challengeView.scss'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/challenges/
+ */
 const ChallengeView = () => {
   const { t } = useI18n()
   const { userChallengeList } = useAppSelector(state => state.ecolyo.challenge)
diff --git a/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap b/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap
index 0f0c1a5cb86a6d1aa750d9fccde498df95890c96..9461e866e7ddacb59a97bba6053b0b596d5a3ceb 100644
--- a/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap
+++ b/src/components/Challenge/__snapshots__/ChallengeView.spec.tsx.snap
@@ -65,7 +65,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = `
     >
       <button
         aria-label="challenge.accessibility.button_slider_previous"
-        class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1"
+        class="MuiButtonBase-root MuiIconButton-root"
         tabindex="0"
         type="button"
       >
@@ -89,7 +89,7 @@ exports[`ChallengeView component should be rendered correctly 1`] = `
       </button>
       <button
         aria-label="challenge.accessibility.button_slider_next"
-        class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1"
+        class="MuiButtonBase-root MuiIconButton-root"
         tabindex="0"
         type="button"
       >
diff --git a/src/components/Charts/AxisBottom.spec.tsx b/src/components/Charts/AxisBottom.spec.tsx
index a0b36f53cda2b3104720409d0d954777e4b906a7..7ccd6e039d95108766cb838d488997d9bbd4df41 100644
--- a/src/components/Charts/AxisBottom.spec.tsx
+++ b/src/components/Charts/AxisBottom.spec.tsx
@@ -5,7 +5,7 @@ import { DateTime } from 'luxon'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { graphData } from 'tests/__mocks__/chartData.mock'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockChartState } from 'tests/__mocks__/store'
 import AxisBottom from './AxisBottom'
 
 const mockXScale: ScaleBand<string> = scaleBand()
@@ -24,6 +24,7 @@ const mockProps = {
 describe('AxisBottom component test', () => {
   const store = createMockEcolyoStore({
     chart: {
+      ...mockChartState,
       selectedDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', {
         zone: 'utc',
       }),
diff --git a/src/components/Charts/AxisBottom.tsx b/src/components/Charts/AxisBottom.tsx
index 35dbdfe9e9d85202d7346a2c91b96f9ca9adce55..28014c8654bf049393307268b047e837a0994efc 100644
--- a/src/components/Charts/AxisBottom.tsx
+++ b/src/components/Charts/AxisBottom.tsx
@@ -39,9 +39,7 @@ function TextAxis({
       return (
         <text y="10" dy="0.71em" transform={`translate(${width})`}>
           <tspan className={style} textAnchor="middle">
-            {dataload.date
-              .setLocale('fr-FR')
-              .toLocaleString({ year: 'numeric' })}
+            {dataload.date.toLocaleString({ year: 'numeric' })}
           </tspan>
         </text>
       )
@@ -49,9 +47,7 @@ function TextAxis({
       return (
         <text y="10" dy="0.71em" transform={`translate(${width})`}>
           <tspan className={style} textAnchor="middle">
-            {dataload.date
-              .setLocale('fr-FR')
-              .toLocaleString({ month: 'narrow' })}
+            {dataload.date.toLocaleString({ month: 'narrow' })}
           </tspan>
         </text>
       )
@@ -61,14 +57,10 @@ function TextAxis({
           return (
             <>
               <tspan className={style} x="0" textAnchor="middle">
-                {dataload.date
-                  .setLocale('fr-FR')
-                  .toLocaleString({ weekday: 'narrow' })}
+                {dataload.date.toLocaleString({ weekday: 'narrow' })}
               </tspan>
               <tspan className={style} x="0" dy="1.2em" textAnchor="middle">
-                {dataload.date
-                  .setLocale('fr-FR')
-                  .toLocaleString({ day: 'numeric' })}
+                {dataload.date.toLocaleString({ day: 'numeric' })}
               </tspan>
             </>
           )
@@ -78,15 +70,12 @@ function TextAxis({
               <tspan className={style} x="0" textAnchor="middle">
                 {capitalize(
                   dataload.date
-                    .setLocale('fr-FR')
                     .toLocaleString({ weekday: 'short' })
                     .substring(0, 3)
                 )}
               </tspan>
               <tspan className={style} x="0" dy="1.2em" textAnchor="middle">
-                {dataload.date
-                  .setLocale('fr-FR')
-                  .toLocaleString({ day: 'numeric' })}
+                {dataload.date.toLocaleString({ day: 'numeric' })}
               </tspan>
             </>
           )
@@ -104,14 +93,10 @@ function TextAxis({
       return (
         <text y="10" dy="0.71em" transform={`translate(${width})`}>
           <tspan className={style} x="0" textAnchor="middle">
-            {dataload.date
-              .setLocale('fr-FR')
-              .toLocaleString({ weekday: 'narrow' })}
+            {dataload.date.toLocaleString({ weekday: 'narrow' })}
           </tspan>
           <tspan className={style} x="0" dy="1.2em" textAnchor="middle">
-            {dataload.date
-              .setLocale('fr-FR')
-              .toLocaleString({ day: 'numeric' })}
+            {dataload.date.toLocaleString({ day: 'numeric' })}
           </tspan>
         </text>
       )
@@ -156,7 +141,7 @@ const AxisBottom = ({
   const { selectedDate } = useAppSelector(state => state.ecolyo.chart)
   const dashArray = `${height / 30} ${height / 30}`
   const dateChartService = new DateChartService()
-  const displayAllDays: boolean = isDuel && data.length <= 15
+  const displayAllDays = isDuel && data.length <= 15
   return (
     <g
       className="axis x"
diff --git a/src/components/Charts/AxisRight.spec.tsx b/src/components/Charts/AxisRight.spec.tsx
index cd7f3c94e6bfacf9578dda87ce1b12a38471c629..37c235a5a25a505962c7c09c05bebe3c3081888d 100644
--- a/src/components/Charts/AxisRight.spec.tsx
+++ b/src/components/Charts/AxisRight.spec.tsx
@@ -4,19 +4,17 @@ import { FluidType } from 'enums'
 import React from 'react'
 import AxisRight from './AxisRight'
 
-const mockProps = {
-  yScale: scaleLinear(),
-  fluidType: FluidType.ELECTRICITY,
-  width: 40,
-  marginRight: 5,
-  marginTop: 5,
-}
-
 describe('AxisRight component test', () => {
   it('should render correctly AxisRight', () => {
     const { container } = render(
       <svg>
-        <AxisRight {...mockProps} />
+        <AxisRight
+          fluidType={FluidType.ELECTRICITY}
+          width={40}
+          marginRight={5}
+          marginTop={5}
+          yScale={scaleLinear()}
+        />
       </svg>
     )
     expect(container).toMatchSnapshot()
diff --git a/src/components/Charts/AxisRight.tsx b/src/components/Charts/AxisRight.tsx
index 7780c52ac0beb1e062554e7160423c5306a35883..72a1a424c79587d39b11d11f676b7070de4e9daf 100644
--- a/src/components/Charts/AxisRight.tsx
+++ b/src/components/Charts/AxisRight.tsx
@@ -1,4 +1,4 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { NumberValue } from 'd3'
 import { axisRight } from 'd3-axis'
 import { ScaleLinear } from 'd3-scale'
diff --git a/src/components/Charts/Bar.spec.tsx b/src/components/Charts/Bar.spec.tsx
index 73cf573db8ade5ee375ebe7be2e2fac8db7d7549..92699761a995d28a1bb2f8df72239b084d4a11a0 100644
--- a/src/components/Charts/Bar.spec.tsx
+++ b/src/components/Charts/Bar.spec.tsx
@@ -7,7 +7,11 @@ import React from 'react'
 import { Provider } from 'react-redux'
 import * as chartActions from 'store/chart/chart.slice'
 import { graphData } from 'tests/__mocks__/chartData.mock'
-import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockChartState,
+  mockGlobalState,
+} from 'tests/__mocks__/store'
 import { mockXScale } from 'tests/__mocks__/xScale.mock'
 import Bar from './Bar'
 
@@ -30,6 +34,7 @@ const setSelectedDateSpy = jest.spyOn(chartActions, 'setSelectedDate')
 describe('Bar component test', () => {
   const store = createMockEcolyoStore({
     chart: {
+      ...mockChartState,
       selectedDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', {
         zone: 'utc',
       }),
diff --git a/src/components/Charts/Bar.tsx b/src/components/Charts/Bar.tsx
index 0b6ccdb99804c32a1349444c92be2729f083d9c7..bb1ae9fa372979807edfed750611f3fdb1a3b40b 100644
--- a/src/components/Charts/Bar.tsx
+++ b/src/components/Charts/Bar.tsx
@@ -1,5 +1,5 @@
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ScaleBand, ScaleLinear } from 'd3-scale'
-import { detect } from 'detect-browser'
 import { FluidType, TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import { Dataload } from 'models'
@@ -10,7 +10,8 @@ import {
   setSelectedDate,
 } from 'store/chart/chart.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
-import { getFluidName } from 'utils/utils'
+import { formatDate } from 'utils/date'
+import { getFluidName, getFluidUnit } from 'utils/utils'
 
 interface BarProps {
   index: number
@@ -28,6 +29,7 @@ interface BarProps {
   weekdays?: 'week' | 'weekend'
   clickable?: boolean
   average?: number
+  focusable?: boolean
 }
 
 const Bar = ({
@@ -46,7 +48,9 @@ const Bar = ({
   weekdays,
   clickable = true,
   average,
+  focusable,
 }: BarProps) => {
+  const { t } = useI18n()
   const dispatch = useAppDispatch()
   const {
     chart: { selectedDate, currentTimeStep },
@@ -55,7 +59,6 @@ const Bar = ({
   const [clicked, setClicked] = useState(false)
   const [animationEnded, setAnimationEnded] = useState(false)
   const [compareAnimationEnded, setCompareAnimationEnded] = useState(false)
-  const browser = detect()
 
   const isMulti = fluidType === FluidType.MULTIFLUID
   const FLUIDNAME = getFluidName(fluidType).toUpperCase()
@@ -130,8 +133,6 @@ const Bar = ({
 
   const getBarClass = () => {
     const upcoming = dataload.value === -1 ? 'bar-UPCOMING' : ''
-    const edgeBrowser = browser && browser.name !== 'edge'
-    const bounce = edgeBrowser ? '1' : '3'
 
     const baseStyles = [
       `bar-${FLUIDNAME}`,
@@ -149,7 +150,7 @@ const Bar = ({
     if (animationEnded) {
       return baseStyles
     }
-    return `${baseStyles} bounce-${bounce} delay--${index}`
+    return `${baseStyles} bounce-1 delay--${index}`
   }
 
   const getCompareBarClass = () => {
@@ -292,11 +293,26 @@ const Bar = ({
           />
         </g>
       ) : (
-        height > 0 &&
-        dataload.value &&
-        dataload.value >= 0 && (
+        Boolean(height > 0 && dataload.value && dataload.value >= 0) && (
           // default colored bar
-          <g transform={`translate(${xScaleValue}, ${yScaleValue})`}>
+          <g
+            className="barValue"
+            transform={`translate(${xScaleValue}, ${yScaleValue})`}
+            tabIndex={focusable ? 0 : -1}
+            onKeyDown={event => {
+              if (event.key === ' ') {
+                event.preventDefault() // prevent from scrolling page
+                handleClick()
+              }
+            }}
+          >
+            <title>
+              {t('consumption.accessibility.bar', {
+                date: formatDate(currentTimeStep, dataload.date),
+                value: Math.round(dataload.value * 100) / 100,
+                unit: getFluidUnit(fluidType),
+              })}
+            </title>
             <defs>
               <linearGradient
                 id="gradient"
diff --git a/src/components/Charts/BarChart.spec.tsx b/src/components/Charts/BarChart.spec.tsx
index 49177db68e7e4c4cd4283af85d475a5a67ea96f3..d5dfacfc0918f4d9907b85ffc57234b222afa2e1 100644
--- a/src/components/Charts/BarChart.spec.tsx
+++ b/src/components/Charts/BarChart.spec.tsx
@@ -4,12 +4,17 @@ import { DateTime } from 'luxon'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { graphData } from 'tests/__mocks__/chartData.mock'
-import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockChartState,
+  mockGlobalState,
+} from 'tests/__mocks__/store'
 import BarChart from './BarChart'
 
 describe('BarChart component', () => {
   const store = createMockEcolyoStore({
     chart: {
+      ...mockChartState,
       selectedDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', {
         zone: 'utc',
       }),
diff --git a/src/components/Charts/BarChart.tsx b/src/components/Charts/BarChart.tsx
index 658f78036c58b91f7e8477d8ad4f2fd46c11642b..b6a861e7914f47558640768d7e84444ae62b5583 100644
--- a/src/components/Charts/BarChart.tsx
+++ b/src/components/Charts/BarChart.tsx
@@ -21,6 +21,7 @@ interface BarChartProps {
   marginBottom?: number
   isSwitching: boolean
   clickable?: boolean
+  focusable?: boolean
 }
 
 const BarChart = ({
@@ -36,6 +37,7 @@ const BarChart = ({
   marginBottom = 50,
   isSwitching,
   clickable = true,
+  focusable,
 }: BarChartProps) => {
   const getContentWidth = () => {
     return width - marginLeft - marginRight
@@ -115,6 +117,7 @@ const BarChart = ({
             }
             clickable={clickable}
             average={averageConsumption}
+            focusable={focusable}
           />
         ))}
       </g>
diff --git a/src/components/Charts/UpcomingBar.tsx b/src/components/Charts/UpcomingBar.tsx
index 7022e3766230b8739f343894cd018bcc4413ff04..bb56d86da5b39108578124080ebf4f82735de998 100644
--- a/src/components/Charts/UpcomingBar.tsx
+++ b/src/components/Charts/UpcomingBar.tsx
@@ -1,5 +1,4 @@
 import { ScaleBand, ScaleLinear } from 'd3-scale'
-import { detect } from 'detect-browser'
 import { DateTime } from 'luxon'
 import { Dataload } from 'models'
 import React, { useState } from 'react'
@@ -22,16 +21,11 @@ const UpcomingBar = ({
   average,
 }: BarProps) => {
   const [animationEnded, setAnimationEnded] = useState(false)
-  const browser = detect()
   const onAnimationEnd = () => {
     setAnimationEnded(true)
   }
 
-  let animationClass = ''
-  if (!animationEnded) {
-    animationClass = browser?.name !== 'edge' ? 'bounce-1' : 'bounce-3'
-    animationClass += ` delay--${index % 13}`
-  }
+  const animationClass = !animationEnded ? `bounce-1 delay--${index % 13}` : ''
   const barClass = `bar-UPCOMING ${animationClass}`
 
   const topRoundedRectDashedLine = (
diff --git a/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap b/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap
index dd321196e7290b0bf856235e533e89b974dada6a..f468fcd4dbd5c46e5528dbf9e34a4a8e16e8a4a3 100644
--- a/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap
+++ b/src/components/Charts/__snapshots__/AxisBottom.spec.tsx.snap
@@ -22,7 +22,7 @@ exports[`AxisBottom component test should correctly render DAY format of AxisBot
             text-anchor="middle"
             x="0"
           >
-            J
+            T
           </tspan>
           <tspan
             class="tick-text tick-text-selected chart-ticks-x-text"
@@ -49,7 +49,7 @@ exports[`AxisBottom component test should correctly render DAY format of AxisBot
             text-anchor="middle"
             x="0"
           >
-            V
+            F
           </tspan>
           <tspan
             class="tick-text chart-ticks-x-text"
@@ -266,7 +266,7 @@ exports[`AxisBottom component test should correctly render WEEK format of AxisBo
             text-anchor="middle"
             x="0"
           >
-            J
+            T
           </tspan>
           <tspan
             class="tick-text tick-text-selected chart-ticks-x-text"
@@ -293,7 +293,7 @@ exports[`AxisBottom component test should correctly render WEEK format of AxisBo
             text-anchor="middle"
             x="0"
           >
-            V
+            F
           </tspan>
           <tspan
             class="tick-text chart-ticks-x-text"
diff --git a/src/components/Charts/__snapshots__/Bar.spec.tsx.snap b/src/components/Charts/__snapshots__/Bar.spec.tsx.snap
index 4b70e2896a14a9e91562af3834b1a8ffaae5d9cd..db2b14af89cd9dbb457f1f64f0120757bd17252b 100644
--- a/src/components/Charts/__snapshots__/Bar.spec.tsx.snap
+++ b/src/components/Charts/__snapshots__/Bar.spec.tsx.snap
@@ -40,7 +40,7 @@ exports[`Bar component test should correctly render Bar with isDuel 1`] = `
           </lineargradient>
         </defs>
         <path
-          class="bar-MULTIFLUID bounce-3 delay--4"
+          class="bar-MULTIFLUID bounce-1 delay--4"
           d="
       M0,-12.295074999999997
       a-12.295074999999997,-12.295074999999997 0 0 1 -12.295074999999997,12.295074999999997
@@ -52,11 +52,16 @@ exports[`Bar component test should correctly render Bar with isDuel 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
-            class="bar-MULTIFLUID bounce-3 delay--4"
+            class="bar-MULTIFLUID bounce-1 delay--4"
             id="gradient"
             x1="0"
             x2="0"
@@ -142,8 +147,13 @@ exports[`Bar component test should correctly render Bar with isSwitching 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
             class="bar-MULTIFLUID selected bounce-2 delay"
@@ -232,8 +242,13 @@ exports[`Bar component test should correctly render Bar with showCompare 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
             class="bar-MULTIFLUID selected bounce-2 delay"
@@ -356,8 +371,13 @@ exports[`Bar component test should correctly render Electricity Bar 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
             class="bar-ELECTRICITY selected bounce-2 delay"
@@ -446,8 +466,13 @@ exports[`Bar component test should correctly render Gas Bar 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
             class="bar-GAS selected bounce-2 delay"
@@ -536,8 +561,13 @@ exports[`Bar component test should correctly render Multifluid Bar 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
             class="bar-MULTIFLUID selected bounce-2 delay"
@@ -626,8 +656,13 @@ exports[`Bar component test should correctly render Water Bar 1`] = `
         />
       </g>
       <g
+        class="barValue"
+        tabindex="-1"
         transform="translate(0.625, 69.18029999999999)"
       >
+        <title>
+          consumption.accessibility.bar
+        </title>
         <defs>
           <lineargradient
             class="bar-WATER selected bounce-2 delay"
diff --git a/src/components/Charts/__snapshots__/BarChart.spec.tsx.snap b/src/components/Charts/__snapshots__/BarChart.spec.tsx.snap
index 9df650b27b60a6bfb1e770e9d86a1a0f94c6e7a2..5c2161cba010b248f63b710b899262b15c81726b 100644
--- a/src/components/Charts/__snapshots__/BarChart.spec.tsx.snap
+++ b/src/components/Charts/__snapshots__/BarChart.spec.tsx.snap
@@ -139,8 +139,13 @@ exports[`BarChart component should render correctly 1`] = `
           />
         </g>
         <g
+          class="barValue"
+          tabindex="-1"
           transform="translate(33.43750000000003, 309.3554761977037)"
         >
+          <title>
+            consumption.accessibility.bar
+          </title>
           <defs>
             <lineargradient
               class="bar-ELECTRICITY selected bounce-2 delay"
@@ -222,8 +227,13 @@ exports[`BarChart component should render correctly 1`] = `
           />
         </g>
         <g
+          class="barValue"
+          tabindex="-1"
           transform="translate(200.62500000000003, 309.3554761977037)"
         >
+          <title>
+            consumption.accessibility.bar
+          </title>
           <defs>
             <lineargradient
               class="bar-ELECTRICITY selected bounce-2 delay"
diff --git a/src/components/CommonKit/FormNavigation/FormNavigation.tsx b/src/components/CommonKit/FormNavigation/FormNavigation.tsx
index cd13d77ef248aa7df3649c9b6f22ab9497fcb9ef..b778edbf8b4fd0cb0b1b29d62c94a4648a65341c 100644
--- a/src/components/CommonKit/FormNavigation/FormNavigation.tsx
+++ b/src/components/CommonKit/FormNavigation/FormNavigation.tsx
@@ -1,5 +1,5 @@
 import Button from '@material-ui/core/Button'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useCallback } from 'react'
 import './formNavigation.scss'
 
diff --git a/src/components/CommonKit/Icon/StyledIcon.tsx b/src/components/CommonKit/Icon/StyledIcon.tsx
index d555270c0ca2f6ee2283e07f741a8788927edcad..83bee7b2afde194855598c5421ec02ac1a2fbd42 100644
--- a/src/components/CommonKit/Icon/StyledIcon.tsx
+++ b/src/components/CommonKit/Icon/StyledIcon.tsx
@@ -8,6 +8,8 @@ interface StyledIconProps {
   size?: number
   role?: string
   title?: string
+  width?: number
+  height?: number
 }
 
 const StyledIcon = ({
diff --git a/src/components/CommonKit/IconButton/StyledIconButton.tsx b/src/components/CommonKit/IconButton/StyledIconButton.tsx
index b71760b5d51353f9fa129037822d0efb0fca476d..d67dd55fb724c4617828fa4e9270e7f64a831545 100644
--- a/src/components/CommonKit/IconButton/StyledIconButton.tsx
+++ b/src/components/CommonKit/IconButton/StyledIconButton.tsx
@@ -1,14 +1,7 @@
 import IconButton, { IconButtonProps } from '@material-ui/core/IconButton'
-import { withStyles } from '@material-ui/core/styles'
 import StyledIconProps from 'components/CommonKit/Icon/StyledIcon'
 import React from 'react'
 
-const IconButtonBase = withStyles({
-  root: {
-    outline: 'none !important',
-  },
-})(IconButton) as React.FC<IconButtonProps>
-
 interface StyledIconButtonProps extends IconButtonProps {
   icon: string
   sized?: number
@@ -20,9 +13,9 @@ const StyledIconButton = ({
   ...props
 }: StyledIconButtonProps) => {
   return (
-    <IconButtonBase {...props}>
+    <IconButton {...props}>
       <StyledIconProps icon={icon} size={sized} />
-    </IconButtonBase>
+    </IconButton>
   )
 }
 
diff --git a/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap b/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap
index 1b037586548e7a7a42b743ff6f58d07f5747cf2e..3a6db811c26f836e6ad8649a65335a74e3f095a6 100644
--- a/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap
+++ b/src/components/CommonKit/IconButton/__snapshots__/StyledIconButton.spec.tsx.snap
@@ -3,7 +3,7 @@
 exports[`StyledIconButton component test should render correctly StyledIconButton 1`] = `
 <div>
   <button
-    class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1"
+    class="MuiButtonBase-root MuiIconButton-root"
     tabindex="0"
     type="button"
   >
diff --git a/src/components/CommonKit/Switch/StyledSwitch.tsx b/src/components/CommonKit/Switch/StyledSwitch.tsx
index bd890d435fe1ef6051610d1ef4280a411016843b..2e7b46a6ddaed99dbdc45766c688c290423e211d 100644
--- a/src/components/CommonKit/Switch/StyledSwitch.tsx
+++ b/src/components/CommonKit/Switch/StyledSwitch.tsx
@@ -20,6 +20,10 @@ const SwitchBase = withStyles({
         backgroundColor: 'var(--multiColor)',
       },
     },
+    '&.Mui-focusVisible': {
+      outline: '2px solid #1976d2',
+      outlineOffset: '2px',
+    },
   },
   checked: {},
   track: {
diff --git a/src/components/Connection/EPGLConnect/EpglBill.tsx b/src/components/Connection/EPGLConnect/EpglBill.tsx
index 56ed120f6f123c7e56ab72e7d900266605486fad..8179dda880dead3ca510dcd808a75a55cd7178d4 100644
--- a/src/components/Connection/EPGLConnect/EpglBill.tsx
+++ b/src/components/Connection/EPGLConnect/EpglBill.tsx
@@ -1,7 +1,7 @@
 import Button from '@material-ui/core/Button'
 import WaterBillIcon from 'assets/icons/visu/onboarding/water_bill.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import { setShowOfflineData } from 'store/chart/chart.slice'
diff --git a/src/components/Connection/EPGLConnect/EpglConnectModal/EpglConnectModal.tsx b/src/components/Connection/EPGLConnect/EpglConnectModal/EpglConnectModal.tsx
index 55b005d968e4bef248b72f1c4fab45344751a164..2c86cb80f9b0c9c6f24cc7a83faf3bc70d5a4f0c 100644
--- a/src/components/Connection/EPGLConnect/EpglConnectModal/EpglConnectModal.tsx
+++ b/src/components/Connection/EPGLConnect/EpglConnectModal/EpglConnectModal.tsx
@@ -1,9 +1,9 @@
-import { Button, Dialog, IconButton } from '@material-ui/core'
+import { Button, Dialog } from '@material-ui/core'
 import CloseIcon from 'assets/icons/ico/close.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
-import React, { useEffect, useState } from 'react'
+import React, { useState } from 'react'
 import { useAppSelector } from 'store/hooks'
 import './PartnerConnectModal.scss'
 import EpglCreateAccount from './Steps/EpglCreateAccount'
@@ -40,13 +40,8 @@ const EpglConnectModal = ({
 
   const [currentStep, setCurrentStep] = useState(StepEnum.DoYouHaveAccount)
 
-  useEffect(() => {
-    if (open) {
-      setCurrentStep(0)
-    }
-  }, [open])
-
   const handleCloseModal = () => {
+    setCurrentStep(StepEnum.DoYouHaveAccount)
     setOpenModal(false)
   }
 
@@ -109,13 +104,12 @@ const EpglConnectModal = ({
         paper: 'modal-paper',
       }}
     >
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseModal}
         aria-label={t('auth.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseModal}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="partners-connection-step-content">
         {steps[currentStep].content}
       </div>
diff --git a/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglCreateAccount.tsx b/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglCreateAccount.tsx
index 83bd2c6eaece03529ea5c74087093e5515440df9..79e9850a01edfb84b4de7aac7b3896c67a7323bd 100644
--- a/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglCreateAccount.tsx
+++ b/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglCreateAccount.tsx
@@ -1,6 +1,6 @@
 import EglIcon from 'assets/icons/visu/onboarding/egl.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './stepDetail.scss'
 
diff --git a/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglDoYouHaveAccount.tsx b/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglDoYouHaveAccount.tsx
index 58c6c40de06d7880c0f56204b2971df405c1cc6e..434d82a2db5c20e7adb61c554dd161ea8e98e2fa 100644
--- a/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglDoYouHaveAccount.tsx
+++ b/src/components/Connection/EPGLConnect/EpglConnectModal/Steps/EpglDoYouHaveAccount.tsx
@@ -1,6 +1,6 @@
 import BrowserEgl from 'assets/icons/visu/onboarding/browser_egl.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './stepDetail.scss'
 
diff --git a/src/components/Connection/EPGLConnect/EpglForm.tsx b/src/components/Connection/EPGLConnect/EpglForm.tsx
index 14ba3dd2c8b8fb66ccac624b268666b7f2acacc4..55df38c5158d9ce9739153d1016da494fead8b3f 100644
--- a/src/components/Connection/EPGLConnect/EpglForm.tsx
+++ b/src/components/Connection/EPGLConnect/EpglForm.tsx
@@ -6,7 +6,7 @@ import classNames from 'classnames'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import useKonnectorAuth from 'components/Hooks/useKonnectorAuth'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import { AccountEGLData } from 'models'
 import React, { useEffect, useState } from 'react'
@@ -84,7 +84,7 @@ const EpglForm = ({ hasCreatedAccount }: { hasCreatedAccount: boolean }) => {
   }, [account, lastEpglLogin, t])
 
   return (
-    <div className="connection-form">
+    <>
       {hasCreatedAccount && (
         <h2 className="connection-form-title eglgrandlyon text-20-bold">
           {t('auth.eglgrandlyon.with_account.title')}
@@ -100,28 +100,33 @@ const EpglForm = ({ hasCreatedAccount }: { hasCreatedAccount: boolean }) => {
           type="number"
           className={classNames('inputText', { error: error !== '' })}
           label={t(`auth.eglgrandlyon.connect_form.login`)}
-          name="login"
           onChange={e => changeLogin(e.target.value)}
           value={login}
           inputMode="numeric"
           error={Boolean(error)}
+          required
         />
 
         <TextField
           variant="outlined"
           id={'idFieldPassword' + fluidName}
-          name="password"
           type={showPassword ? 'text' : 'password'}
           className={classNames('inputText', { error: error !== '' })}
           label={t(`auth.eglgrandlyon.connect_form.password`)}
           onChange={e => changePassword(e.target.value)}
           value={password}
           error={Boolean(error)}
+          required
         />
         <span>
           <StyledIconButton
             icon={TrailingIcon}
-            aria-label={t('auth.accessibility.button_reveal_password')}
+            aria-label={
+              showPassword
+                ? t('auth.accessibility.button_hide_password')
+                : t('auth.accessibility.button_reveal_password')
+            }
+            aria-checked={showPassword}
             className="iconShowPassword"
             sized={22}
             onClick={() => setShowPassword(prev => !prev)}
@@ -150,7 +155,7 @@ const EpglForm = ({ hasCreatedAccount }: { hasCreatedAccount: boolean }) => {
           </Button>
         </div>
       </form>
-    </div>
+    </>
   )
 }
 
diff --git a/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.spec.tsx b/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.spec.tsx
index a5edf19121aeb28e37bb93818c5d2b77a684d0a2..c50602afd0333899a595edeea61b110b58e4c025 100644
--- a/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.spec.tsx
+++ b/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.spec.tsx
@@ -5,7 +5,7 @@ import React from 'react'
 import { Provider } from 'react-redux'
 import * as storeHooks from 'store/hooks'
 import { fluidStatusConnectedData } from 'tests/__mocks__/fluidStatusData.mock'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
 import ExpiredConsentModal from './ExpiredConsentModal'
 
 const mockedNavigate = jest.fn()
@@ -53,7 +53,7 @@ describe('ExpiredConsentModal component', () => {
   })
   it('should launch the update consent process for Enedis', async () => {
     const store = createMockEcolyoStore({
-      global: { fluidStatus: fluidStatusConnectedData },
+      global: { ...mockGlobalState, fluidStatus: fluidStatusConnectedData },
     })
     render(
       <Provider store={store}>
diff --git a/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.tsx b/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.tsx
index 577a4932ce4f5f05cf82611e0f7622d8e6992f49..b01fcb166947dbfe4bcb9629077a5bc18dbae137 100644
--- a/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.tsx
+++ b/src/components/Connection/ExpiredConsentModal/ExpiredConsentModal.tsx
@@ -1,19 +1,16 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import EnedisIcon from 'assets/icons/ico/consent-outdated-enedis.svg'
 import GrdfIcon from 'assets/icons/ico/consent-outdated-grdf.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
-import { AccountSgeData } from 'models'
 import React, { useCallback } from 'react'
 import { useNavigate } from 'react-router-dom'
-import {
-  setShouldRefreshConsent,
-  updateSgeStore,
-} from 'store/global/global.slice'
-import { useAppDispatch, useAppSelector } from 'store/hooks'
+import { setShouldRefreshConsent } from 'store/global/global.slice'
+import { useAppDispatch } from 'store/hooks'
 import { getFluidName } from 'utils/utils'
 import './expiredConsentModal.scss'
 
@@ -33,26 +30,8 @@ const ExpiredConsentModal = ({
   const { t } = useI18n()
   const navigate = useNavigate()
   const dispatch = useAppDispatch()
-  const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
   const launchUpdateConsent = useCallback(() => {
     if (fluidType === FluidType.ELECTRICITY) {
-      const accountData = fluidStatus[FluidType.ELECTRICITY].connection.account
-        ?.auth as AccountSgeData
-      // store the previous account data since the onDelete will remove account from DB
-      dispatch(
-        updateSgeStore({
-          currentStep: 0,
-          firstName: accountData.firstname,
-          lastName: accountData.lastname,
-          pdl: parseInt(accountData.pointId),
-          address: accountData.address,
-          zipCode: parseInt(accountData.postalCode),
-          city: accountData.city,
-          dataConsent: true,
-          pdlConfirm: true,
-          shouldLaunchAccount: true,
-        })
-      )
       dispatch(setShouldRefreshConsent(true))
       toggleModal()
       navigate(`/consumption/${FluidType[fluidType].toLocaleLowerCase()}`)
@@ -61,7 +40,7 @@ const ExpiredConsentModal = ({
       toggleModal()
       navigate(`/connect/${FluidType[fluidType].toLocaleLowerCase()}`)
     }
-  }, [dispatch, fluidStatus, fluidType, navigate, toggleModal])
+  }, [dispatch, fluidType, navigate, toggleModal])
 
   return (
     <Dialog
@@ -74,18 +53,17 @@ const ExpiredConsentModal = ({
       }}
     >
       <div id="accessibility-title">
-        {t('consumption_visualizer.modal.window_title')}
+        {t('consent_outdated.accessibility.window_title')}
       </div>
-      <IconButton
-        aria-label={t('consumption_visualizer.modal.close')}
-        className="modal-paper-close-button"
+      <StyledIconButton
+        icon={CloseIcon}
         onClick={toggleModal}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+        aria-label={t('consent_outdated.accessibility.button_close')}
+        className="modal-paper-close-button"
+      />
       <div className="expired-consent-modal">
         <div className="icon-main">
-          <Icon
+          <StyledIcon
             icon={fluidType === FluidType.ELECTRICITY ? EnedisIcon : GrdfIcon}
             size={135}
           />
diff --git a/src/components/Connection/ExpiredConsentModal/__snapshots__/ExpiredConsentModal.spec.tsx.snap b/src/components/Connection/ExpiredConsentModal/__snapshots__/ExpiredConsentModal.spec.tsx.snap
index bc66bb1e283bd4a9e6c9812c6648c9ebed507686..83702bba20fe80bfae05ce21739775e02cce36fc 100644
--- a/src/components/Connection/ExpiredConsentModal/__snapshots__/ExpiredConsentModal.spec.tsx.snap
+++ b/src/components/Connection/ExpiredConsentModal/__snapshots__/ExpiredConsentModal.spec.tsx.snap
@@ -35,10 +35,10 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = `
         <div
           id="accessibility-title"
         >
-          consumption_visualizer.modal.window_title
+          consent_outdated.accessibility.window_title
         </div>
         <button
-          aria-label="consumption_visualizer.modal.close"
+          aria-label="consent_outdated.accessibility.button_close"
           class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button"
           tabindex="0"
           type="button"
@@ -47,6 +47,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -67,6 +68,7 @@ exports[`ExpiredConsentModal component should be rendered correctly 1`] = `
             class="icon-main"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="135"
               width="135"
diff --git a/src/components/Connection/ExpiredConsentModal/expiredConsentModal.scss b/src/components/Connection/ExpiredConsentModal/expiredConsentModal.scss
index 758ca858135b774a0515777af0550aed301c214c..7ef0409e91a0f0bcc6e4303f8b2c1211a9bd34a4 100644
--- a/src/components/Connection/ExpiredConsentModal/expiredConsentModal.scss
+++ b/src/components/Connection/ExpiredConsentModal/expiredConsentModal.scss
@@ -5,6 +5,7 @@
   flex-direction: column;
   gap: 24px;
   color: $grey-bright;
+  text-align: center;
 
   .icon-main {
     display: flex;
diff --git a/src/components/Connection/GRDFConnect/GrdfConnectView.tsx b/src/components/Connection/GRDFConnect/GrdfConnectView.tsx
index 0ec4d939b815b6d39ce3aebf5b7d35bde7cf85d2..814ca90071e866715b1af485de8572aa0bc60c5a 100644
--- a/src/components/Connection/GRDFConnect/GrdfConnectView.tsx
+++ b/src/components/Connection/GRDFConnect/GrdfConnectView.tsx
@@ -5,12 +5,15 @@ import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
 import useKonnectorAuth from 'components/Hooks/useKonnectorAuth'
 import useUserInstanceSettings from 'components/Hooks/useUserInstanceSettings'
+import { useClient } from 'cozy-client'
+import { FORM_DOCTYPE } from 'doctypes'
 import { FluidType } from 'enums'
 import { AccountGRDFData } from 'models'
-import React, { useCallback, useEffect, useState } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
 import { useAppSelector } from 'store/hooks'
 import '../connection.scss'
+import { createInitialGrdfState, useFormData } from '../useForm'
 import StepConsent from './StepConsent'
 import { StepIdentity } from './StepIdentity'
 
@@ -19,45 +22,55 @@ export enum GrdfStep {
   Consent,
 }
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/connect/gas
+ */
 export const GrdfConnectView = () => {
+  const client = useClient()
   const navigate = useNavigate()
-  const { data: instanceSettings } = useUserInstanceSettings()
+  const { formData } = useFormData()
+  const { instanceSettings } = useUserInstanceSettings()
   const { fluidStatus } = useAppSelector(state => state.ecolyo.global)
   const currentFluidStatus = fluidStatus[FluidType.GAS]
   const account = currentFluidStatus.connection.account
 
   const [launchConnection, setLaunchConnection] = useState(false)
   const [currentStep, setCurrentStep] = useState<GrdfStep>(GrdfStep.Identity)
-  const [formData, setFormData] = useState<AccountGRDFData>({
-    lastname: '',
-    firstname: '',
-    email: '',
-    postalCode: '',
-    pce: '',
-  })
+  const [grdfState, setGrdfState] = useState<AccountGRDFData>(
+    createInitialGrdfState()
+  )
   const [formConsent, setFormConsent] = useState({
     dataConsent: false,
     pceConfirm: false,
   })
 
+  const mainContentRef = useRef<HTMLDivElement>(null)
+  const focusMainContent = () => {
+    setTimeout(() => mainContentRef.current?.focus(), 0)
+  }
+
   const [connect, update] = useKonnectorAuth(FluidType.GAS, {
-    grdfAuthData: formData,
+    grdfAuthData: grdfState,
   })
 
   useEffect(() => {
-    setFormData(prev => ({ ...prev, email: instanceSettings.email ?? '' }))
-  }, [instanceSettings])
+    setGrdfState(prev => ({
+      ...prev,
+      ...createInitialGrdfState(formData),
+      email: instanceSettings.email ?? '',
+    }))
+  }, [instanceSettings, formData])
 
   useEffect(() => {
     async function launchConnect() {
       if (launchConnection) {
+        setLaunchConnection(false)
         if (!account) {
           await connect()
         } else {
           await update()
         }
 
-        setLaunchConnection(false)
         navigate('/consumption/gas')
       }
     }
@@ -67,11 +80,11 @@ export const GrdfConnectView = () => {
   const isNextValid = useCallback(() => {
     if (currentStep === GrdfStep.Identity) {
       return (
-        formData.firstname !== '' &&
-        formData.lastname !== '' &&
-        formData.postalCode !== '' &&
-        formData.email.includes('@') &&
-        formData.pce.length === 14
+        grdfState.firstname !== '' &&
+        grdfState.lastname !== '' &&
+        grdfState.postalCode !== '' &&
+        grdfState.email.includes('@') &&
+        grdfState.pce.length === 14
       )
     } else if (currentStep === GrdfStep.Consent) {
       return formConsent.dataConsent && formConsent.pceConfirm
@@ -81,30 +94,49 @@ export const GrdfConnectView = () => {
     currentStep,
     formConsent.dataConsent,
     formConsent.pceConfirm,
-    formData.email,
-    formData.firstname,
-    formData.lastname,
-    formData.pce,
-    formData.postalCode,
+    grdfState.email,
+    grdfState.firstname,
+    grdfState.lastname,
+    grdfState.pce,
+    grdfState.postalCode,
   ])
 
   const handleNext = useCallback(() => {
     if (!isNextValid()) return
     if (currentStep < GrdfStep.Consent) {
       setCurrentStep(prev => prev + 1)
+      client.save({
+        ...formData,
+        _type: FORM_DOCTYPE,
+        firstName: grdfState.firstname,
+        lastName: grdfState.lastname,
+        pce: grdfState.pce,
+        zipCode: grdfState.postalCode,
+      })
     }
     if (currentStep === GrdfStep.Consent) {
       setLaunchConnection(true)
     }
-  }, [currentStep, isNextValid])
+    focusMainContent()
+  }, [
+    client,
+    currentStep,
+    formData,
+    grdfState.firstname,
+    grdfState.lastname,
+    grdfState.pce,
+    grdfState.postalCode,
+    isNextValid,
+  ])
 
   const handlePrev = () => {
     setCurrentStep(prev => prev - 1)
+    focusMainContent()
   }
 
   const renderStep = (step: GrdfStep) => {
     if (step === GrdfStep.Identity) {
-      return <StepIdentity formData={formData} setFormData={setFormData} />
+      return <StepIdentity formData={grdfState} setFormData={setGrdfState} />
     } else {
       return (
         <StepConsent
@@ -123,7 +155,7 @@ export const GrdfConnectView = () => {
         displayBackArrow={true}
       />
       <Content>
-        <div className="connectView">
+        <div ref={mainContentRef} className="connectView" tabIndex={-1}>
           <div className="stepContainer">
             <FormProgress
               currentStep={currentStep}
diff --git a/src/components/Connection/GRDFConnect/GrdfInit.tsx b/src/components/Connection/GRDFConnect/GrdfInit.tsx
index 8793804daa0e702b5ac657d04543489b5ae398f3..fa0f2ddbee7547b3a6612a6918200959152fed19 100644
--- a/src/components/Connection/GRDFConnect/GrdfInit.tsx
+++ b/src/components/Connection/GRDFConnect/GrdfInit.tsx
@@ -1,7 +1,7 @@
 import Button from '@material-ui/core/Button'
 import GasBillIcon from 'assets/icons/visu/onboarding/gas_bill.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
diff --git a/src/components/Connection/GRDFConnect/GrdfModalHint.tsx b/src/components/Connection/GRDFConnect/GrdfModalHint.tsx
index c015a99bd03ed0331699bd7cd8a0b081d72b72c8..c2bb744a97e47fe962f984f6cc1757b6cbb45ece 100644
--- a/src/components/Connection/GRDFConnect/GrdfModalHint.tsx
+++ b/src/components/Connection/GRDFConnect/GrdfModalHint.tsx
@@ -1,10 +1,10 @@
-import { IconButton } from '@material-ui/core'
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import GasBill from 'assets/icons/visu/onboarding/gas_bill.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 
 const GrdfModalHint = ({
@@ -30,20 +30,19 @@ const GrdfModalHint = ({
       <div id="accessibility-title">
         {t('challenge_no_fluid_modal.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="hintModal">
         <h1 className="text-20-bold">
           {t('auth.grdfgrandlyon.pceModal.title')}
         </h1>
         <div className="content">
           <div className="bill grdf">
-            <Icon icon={GasBill} alt="Facture" className="bill" size={180} />
+            <StyledIcon icon={GasBill} className="bill" size={180} />
           </div>
           <p
             className="grdfText"
diff --git a/src/components/Connection/GRDFConnect/GrdfWaitConsent.tsx b/src/components/Connection/GRDFConnect/GrdfWaitConsent.tsx
index 2f829315f6d3ca9835fc606257dbe435f2275408..fd12330c01ad87beaed3e3b1bc43fd42a21cd073 100644
--- a/src/components/Connection/GRDFConnect/GrdfWaitConsent.tsx
+++ b/src/components/Connection/GRDFConnect/GrdfWaitConsent.tsx
@@ -1,7 +1,7 @@
 import { Button } from '@material-ui/core'
 import GRDFMail from 'assets/icons/visu/onboarding/grdf-mail.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import { AccountGRDFData, FluidConnection } from 'models'
 import React from 'react'
@@ -17,7 +17,7 @@ export const GrdfWaitConsent = () => {
   const authData = currentFluidStatus.connection.account
     ?.auth as AccountGRDFData
 
-  const updateKonnector = async () => {
+  const updateKonnector = () => {
     const updatedConnection: FluidConnection = {
       ...currentFluidStatus.connection,
       shouldLaunchKonnector: true,
diff --git a/src/components/Connection/GRDFConnect/StepConsent.tsx b/src/components/Connection/GRDFConnect/StepConsent.tsx
index ac9c00dea6cea9d96aca4382038ab404dd4cab01..988a84c685c5a5b663af1b1b60feafe403483ce9 100644
--- a/src/components/Connection/GRDFConnect/StepConsent.tsx
+++ b/src/components/Connection/GRDFConnect/StepConsent.tsx
@@ -1,4 +1,5 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { Checkbox } from '@material-ui/core'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 
 const StepConsent = ({
@@ -28,16 +29,14 @@ const StepConsent = ({
         <li>{t('auth.grdfgrandlyon.consentLi1')}</li>
         <li>{t('auth.grdfgrandlyon.consentLi2')}</li>
       </ul>
-      <label className="inline">
-        <input
-          id="dataConsent"
-          type="checkbox"
-          name="Data-consent-validation"
-          className="inputCheckbox"
+      <label htmlFor="dataConsentGrdf" className="inline">
+        <Checkbox
+          id="dataConsentGrdf"
           checked={formConsent.dataConsent}
           onChange={e =>
             setFormConsent(prev => ({ ...prev, dataConsent: e.target.checked }))
           }
+          required
         />
         <span
           dangerouslySetInnerHTML={{
@@ -45,16 +44,14 @@ const StepConsent = ({
           }}
         />
       </label>
-      <label className="inline">
-        <input
-          id="pdlConfirm"
-          type="checkbox"
-          name="Data-consent-validation"
-          className="inputCheckbox"
+      <label htmlFor="pceConfirm" className="inline">
+        <Checkbox
+          id="pceConfirm"
           checked={formConsent.pceConfirm}
           onChange={e =>
             setFormConsent(prev => ({ ...prev, pceConfirm: e.target.checked }))
           }
+          required
         />
         <span>{t('auth.grdfgrandlyon.consentCheck2')}</span>
       </label>
diff --git a/src/components/Connection/GRDFConnect/StepIdentity.tsx b/src/components/Connection/GRDFConnect/StepIdentity.tsx
index 4ba5e56579766252c2dbff3a9d7a7334b131c578..fec92d81eb840d7ad64ef1d2d1f3c652d26f9bac 100644
--- a/src/components/Connection/GRDFConnect/StepIdentity.tsx
+++ b/src/components/Connection/GRDFConnect/StepIdentity.tsx
@@ -1,6 +1,6 @@
 import { TextField } from '@material-ui/core'
 import Button from '@material-ui/core/Button'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { AccountGRDFData } from 'models'
 import React, { useState } from 'react'
 import GrdfModalHint from './GrdfModalHint'
@@ -14,7 +14,6 @@ export const StepIdentity = ({
 }) => {
   const { t } = useI18n()
   const [openHintModal, setOpenHintModal] = useState<boolean>(false)
-  const toggleModal = () => setOpenHintModal(prev => !prev)
 
   return (
     <div className="stepDetails stepIdentity">
@@ -24,7 +23,6 @@ export const StepIdentity = ({
         variant="outlined"
         type="text"
         id="firstName"
-        name="firstName"
         value={formData.firstname}
         onChange={e =>
           setFormData(prev => ({ ...prev, firstname: e.target.value }))
@@ -37,7 +35,6 @@ export const StepIdentity = ({
         variant="outlined"
         type="text"
         id="lastName"
-        name="lastName"
         required
         value={formData.lastname}
         onChange={e =>
@@ -50,7 +47,6 @@ export const StepIdentity = ({
         variant="outlined"
         type="email"
         id="email"
-        name="email"
         required
         value={formData.email}
         onChange={e =>
@@ -63,7 +59,6 @@ export const StepIdentity = ({
         variant="outlined"
         type="number"
         id="zipCode"
-        name="zipCode"
         required
         value={formData.postalCode}
         onChange={e =>
@@ -77,7 +72,6 @@ export const StepIdentity = ({
         label={t('auth.grdfgrandlyon.pceLabel')}
         variant="outlined"
         id="pce"
-        name="pce"
         type="number"
         inputMode="numeric"
         required
@@ -88,10 +82,13 @@ export const StepIdentity = ({
         }}
       />
 
-      <Button className="btnText" onClick={toggleModal}>
+      <Button className="btnText" onClick={() => setOpenHintModal(true)}>
         {t('auth.grdfgrandlyon.pceHint')}
       </Button>
-      <GrdfModalHint open={openHintModal} handleCloseClick={toggleModal} />
+      <GrdfModalHint
+        open={openHintModal}
+        handleCloseClick={() => setOpenHintModal(false)}
+      />
     </div>
   )
 }
diff --git a/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx
index 8cb9c8bb0363de72c8d0abfff8243b9301abce37..ad4f5fc21d0e96cdce9852cbe861331542471d78 100644
--- a/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx
+++ b/src/components/Connection/SGEConnect/SgeConnectView.spec.tsx
@@ -1,4 +1,5 @@
 import { render, screen } from '@testing-library/react'
+import { SgeStore } from 'models'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { BrowserRouter } from 'react-router-dom'
@@ -18,6 +19,23 @@ jest.mock('components/Hooks/useKonnectorAuth', () =>
   jest.fn(() => [mockConnect, mockUpdate])
 )
 
+// mock sge state with shouldLaunchAccount set to true
+jest.mock('components/Connection/useForm', () => ({
+  useFormData: jest.fn().mockReturnValue({ formData: {} }),
+  createInitialSgeState: jest.fn<SgeStore, []>().mockReturnValue({
+    address: '',
+    lastName: '',
+    firstName: '',
+    pdl: 0,
+    zipCode: 0,
+    city: '',
+    currentStep: 0,
+    dataConsent: false,
+    shouldLaunchAccount: true,
+    pdlConfirm: false,
+  }),
+}))
+
 describe('SgeConnectView component', () => {
   beforeEach(() => {
     jest.clearAllMocks()
@@ -33,7 +51,7 @@ describe('SgeConnectView component', () => {
     expect(container).toMatchSnapshot()
   })
 
-  it('should be on stepIdentity by default with button disabled', async () => {
+  it('should be on stepIdentity by default with button disabled', () => {
     render(
       <Provider store={store}>
         <BrowserRouter>
@@ -56,17 +74,7 @@ describe('SgeConnectView component', () => {
   })
 
   describe('should test methods from useKonnectorAuth hook', () => {
-    it('should launch account and trigger creation process', async () => {
-      const store = createMockEcolyoStore({
-        global: {
-          ...mockGlobalState,
-          sgeConnect: {
-            ...mockGlobalState.sgeConnect,
-            shouldLaunchAccount: true,
-          },
-        },
-      })
-
+    it('should launch account and trigger creation process', () => {
       render(
         <Provider store={store}>
           <SgeConnectView />
@@ -74,15 +82,11 @@ describe('SgeConnectView component', () => {
       )
       expect(mockConnect).toHaveBeenCalled()
     })
-    it('should launch existing account update process', async () => {
+    it('should launch existing account update process', () => {
       const store = createMockEcolyoStore({
         global: {
           ...mockGlobalState,
           fluidStatus: [SgeStatusWithAccount],
-          sgeConnect: {
-            ...mockGlobalState.sgeConnect,
-            shouldLaunchAccount: true,
-          },
         },
       })
       render(
diff --git a/src/components/Connection/SGEConnect/SgeConnectView.tsx b/src/components/Connection/SGEConnect/SgeConnectView.tsx
index 2b8a84e087e34da4a116f7981ef9e70ee1360518..0f179a07b9acc17e88d3189b1feaf96df8c630b8 100644
--- a/src/components/Connection/SGEConnect/SgeConnectView.tsx
+++ b/src/components/Connection/SGEConnect/SgeConnectView.tsx
@@ -4,16 +4,16 @@ import Content from 'components/Content/Content'
 import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
 import useKonnectorAuth from 'components/Hooks/useKonnectorAuth'
+import { useClient } from 'cozy-client'
+import { FORM_DOCTYPE } from 'doctypes'
 import { FluidType, SgeStep } from 'enums'
 import { SgeStore } from 'models'
-import React, { useCallback, useEffect, useState } from 'react'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
-import {
-  setShouldRefreshConsent,
-  updateSgeStore,
-} from 'store/global/global.slice'
+import { setShouldRefreshConsent } from 'store/global/global.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
 import '../connection.scss'
+import { createInitialSgeState, useFormData } from '../useForm'
 import StepAddress from './StepAddress'
 import StepConsent from './StepConsent'
 import StepIdentityAndPdl from './StepIdentityAndPdl'
@@ -28,12 +28,16 @@ export type SGEKeysForm =
   | 'dataConsent'
   | 'pdlConfirm'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/connect/electricity
+ */
 const SgeConnectView = () => {
+  const client = useClient()
   const navigate = useNavigate()
   const dispatch = useAppDispatch()
-  const { sgeConnect } = useAppSelector(state => state.ecolyo.global)
+  const { formData } = useFormData()
   const [isLoading, setIsLoading] = useState(false)
-  const [currentSgeState, setCurrentSgeState] = useState<SgeStore>(sgeConnect)
+  const [sgeState, setSgeState] = useState<SgeStore>(createInitialSgeState())
   const [currentStep, setCurrentStep] = useState<SgeStep>(
     SgeStep.IdentityAndPDL
   )
@@ -41,14 +45,31 @@ const SgeConnectView = () => {
   const currentFluidStatus = fluidStatus[FluidType.ELECTRICITY]
   const account = currentFluidStatus.connection.account
 
+  const mainContentRef = useRef<HTMLDivElement>(null)
+  const focusMainContent = () => {
+    setTimeout(() => mainContentRef.current?.focus(), 0)
+  }
+
   const [connect, update] = useKonnectorAuth(FluidType.ELECTRICITY, {
-    sgeAuthData: sgeConnect,
+    sgeAuthData: sgeState,
   })
 
+  useEffect(
+    function applyFormData() {
+      if (formData) {
+        setSgeState(prevState => ({
+          ...prevState,
+          ...createInitialSgeState(formData),
+        }))
+      }
+    },
+    [formData]
+  )
+
   useEffect(() => {
     async function launchConnect() {
-      if (sgeConnect.shouldLaunchAccount) {
-        dispatch(updateSgeStore({ ...sgeConnect, shouldLaunchAccount: false }))
+      if (sgeState.shouldLaunchAccount) {
+        setSgeState({ ...sgeState, shouldLaunchAccount: false })
         dispatch(setShouldRefreshConsent(false))
         if (!account) {
           await connect()
@@ -59,64 +80,74 @@ const SgeConnectView = () => {
       }
     }
     launchConnect()
-  }, [account, connect, dispatch, navigate, sgeConnect, update])
+  }, [account, connect, sgeState, dispatch, navigate, update])
 
   const isNextValid = useCallback(() => {
     switch (currentStep) {
       case SgeStep.IdentityAndPDL:
         return (
-          currentSgeState.firstName !== '' &&
-          currentSgeState.lastName !== '' &&
-          currentSgeState.pdl !== null &&
-          currentSgeState.pdl.toString().length === 14
+          sgeState.firstName !== '' &&
+          sgeState.lastName !== '' &&
+          sgeState.pdl !== null &&
+          sgeState.pdl.toString().length === 14
         )
       case SgeStep.Address:
         return (
-          currentSgeState.address !== '' &&
-          currentSgeState.city !== '' &&
-          currentSgeState.zipCode !== null &&
-          currentSgeState.zipCode.toString().length === 5
+          sgeState.address !== '' &&
+          sgeState.city !== '' &&
+          sgeState.zipCode !== null &&
+          sgeState.zipCode.toString().length === 5
         )
       case SgeStep.Consent:
-        return currentSgeState.dataConsent && currentSgeState.pdlConfirm
+        return sgeState.dataConsent && sgeState.pdlConfirm
       default:
         return false
     }
   }, [
-    currentSgeState.address,
-    currentSgeState.city,
-    currentSgeState.dataConsent,
-    currentSgeState.firstName,
-    currentSgeState.lastName,
-    currentSgeState.pdl,
-    currentSgeState.pdlConfirm,
-    currentSgeState.zipCode,
+    sgeState.address,
+    sgeState.city,
+    sgeState.dataConsent,
+    sgeState.firstName,
+    sgeState.lastName,
+    sgeState.pdl,
+    sgeState.pdlConfirm,
+    sgeState.zipCode,
     currentStep,
   ])
 
   const handleNext = useCallback(() => {
     if (currentStep < SgeStep.Consent) {
       setCurrentStep(prev => prev + 1)
-      dispatch(updateSgeStore(currentSgeState))
+
+      client.save({
+        ...formData,
+        _type: FORM_DOCTYPE,
+        firstName: sgeState.firstName,
+        lastName: sgeState.lastName,
+        pdl: sgeState.pdl,
+        address: sgeState.address,
+        city: sgeState.city,
+        zipCode: sgeState.zipCode,
+      })
     }
     if (currentStep === SgeStep.Consent && !isLoading) {
       setIsLoading(true)
       const updatedState = {
-        ...currentSgeState,
-        city: currentSgeState.city.trim(),
+        ...sgeState,
+        city: sgeState.city.trim(),
         shouldLaunchAccount: true,
       }
-      setCurrentSgeState(updatedState)
-      dispatch(updateSgeStore(updatedState))
+      setSgeState(updatedState)
     }
-  }, [currentStep, isLoading, dispatch, currentSgeState])
+    focusMainContent()
+  }, [currentStep, isLoading, client, formData, sgeState])
 
   const handlePrev = useCallback(() => {
     if (currentStep !== SgeStep.IdentityAndPDL) {
       setCurrentStep(prev => prev - 1)
     }
-    dispatch(updateSgeStore(currentSgeState))
-  }, [currentSgeState, currentStep, dispatch])
+    focusMainContent()
+  }, [currentStep])
 
   const onChange = useCallback(
     (
@@ -127,25 +158,23 @@ const SgeConnectView = () => {
       if (maxLength && value.toString().length > maxLength) return
 
       const updatedState = {
-        ...currentSgeState,
+        ...sgeState,
         [key]: value,
       }
-      setCurrentSgeState(updatedState)
+      setSgeState(updatedState)
     },
-    [currentSgeState]
+    [sgeState]
   )
 
   const renderStep = (step: SgeStep) => {
     switch (step) {
       case SgeStep.Address:
-        return <StepAddress sgeState={currentSgeState} onChange={onChange} />
+        return <StepAddress sgeState={sgeState} onChange={onChange} />
       case SgeStep.Consent:
-        return <StepConsent sgeState={currentSgeState} onChange={onChange} />
+        return <StepConsent sgeState={sgeState} onChange={onChange} />
       case SgeStep.IdentityAndPDL:
       default:
-        return (
-          <StepIdentityAndPdl sgeState={currentSgeState} onChange={onChange} />
-        )
+        return <StepIdentityAndPdl sgeState={sgeState} onChange={onChange} />
     }
   }
 
@@ -157,7 +186,7 @@ const SgeConnectView = () => {
         displayBackArrow={true}
       />
       <Content>
-        <div className="connectView">
+        <div ref={mainContentRef} className="connectView" tabIndex={-1}>
           <div className="stepContainer">
             <FormProgress
               currentStep={currentStep}
diff --git a/src/components/Connection/SGEConnect/SgeInit.tsx b/src/components/Connection/SGEConnect/SgeInit.tsx
index 3576986a69311b85e2506e8217fe25cb48e222ea..120be7228191edc43468b894156528225d6a7e3d 100644
--- a/src/components/Connection/SGEConnect/SgeInit.tsx
+++ b/src/components/Connection/SGEConnect/SgeInit.tsx
@@ -1,7 +1,7 @@
 import { Button } from '@material-ui/core'
 import ElectricityBillIcon from 'assets/icons/visu/onboarding/electricity_bill.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
diff --git a/src/components/Connection/SGEConnect/SgeModalHint.tsx b/src/components/Connection/SGEConnect/SgeModalHint.tsx
index 5b68e0d94d2b0298ed34a3e4ecb23348568b8daa..ba8bc3721502722a6af4fda34d679a2cb020874b 100644
--- a/src/components/Connection/SGEConnect/SgeModalHint.tsx
+++ b/src/components/Connection/SGEConnect/SgeModalHint.tsx
@@ -1,11 +1,11 @@
-import { IconButton } from '@material-ui/core'
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
 import Bill from 'assets/icons/ico/bill.svg'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import Prm from 'assets/icons/ico/prm.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 
 interface SgeModalHintProps {
@@ -30,13 +30,12 @@ const SgeModalHint = ({ open, handleCloseClick }: SgeModalHintProps) => {
       <div id="accessibility-title">
         {t('auth.enedissgegrandlyon.pdlModal.title_accessibility')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('auth.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="hintModal">
         <h1 className="text-20-bold">
           {t('auth.enedissgegrandlyon.pdlModal.title')}
@@ -45,15 +44,16 @@ const SgeModalHint = ({ open, handleCloseClick }: SgeModalHintProps) => {
           <p>{t('auth.enedissgegrandlyon.pdlModal.txt1')}</p>
           <p>{t('auth.enedissgegrandlyon.pdlModal.txt2')}</p>
           <div className="bill">
-            <Icon icon={Bill} alt="" size={52} />
+            <StyledIcon icon={Bill} size={52} />
             <p className="text-16-bold">
               {t('auth.enedissgegrandlyon.pdlModal.txt3')}
             </p>
           </div>
           <p>{t('auth.enedissgegrandlyon.pdlModal.txt4')}</p>
-          <Icon
+          <StyledIcon
             icon={Prm}
-            alt={t('auth.enedissgegrandlyon.pdlModal.prm_accessibility')}
+            ariaHidden={false}
+            aria-label={t('auth.enedissgegrandlyon.pdlModal.prm_accessibility')}
             className="prm"
           />
           <Button
diff --git a/src/components/Connection/SGEConnect/StepAddress.spec.tsx b/src/components/Connection/SGEConnect/StepAddress.spec.tsx
index 62a897e6560feaaac4cae0d271dbae3ef63fe2ee..a8e380cf5ac1cc7142515a3a6ad6f6282b90fb1f 100644
--- a/src/components/Connection/SGEConnect/StepAddress.spec.tsx
+++ b/src/components/Connection/SGEConnect/StepAddress.spec.tsx
@@ -1,7 +1,7 @@
 import { act, render, screen } from '@testing-library/react'
 import { userEvent } from '@testing-library/user-event'
 import React from 'react'
-import { mockGlobalState } from 'tests/__mocks__/store'
+import { mockSgeState } from 'tests/__mocks__/forms.mock'
 import StepAddress from './StepAddress'
 
 const mockHandleChange = jest.fn()
@@ -9,10 +9,7 @@ const mockHandleChange = jest.fn()
 describe('StepAddress component', () => {
   it('should be rendered correctly', () => {
     const { container } = render(
-      <StepAddress
-        sgeState={mockGlobalState.sgeConnect}
-        onChange={mockHandleChange}
-      />
+      <StepAddress sgeState={mockSgeState} onChange={mockHandleChange} />
     )
     expect(container).toMatchSnapshot()
   })
@@ -20,10 +17,7 @@ describe('StepAddress component', () => {
   describe('should change inputs', () => {
     it('should change address value', async () => {
       render(
-        <StepAddress
-          sgeState={mockGlobalState.sgeConnect}
-          onChange={mockHandleChange}
-        />
+        <StepAddress sgeState={mockSgeState} onChange={mockHandleChange} />
       )
       const input = screen.getByRole('textbox', {
         name: 'auth.enedissgegrandlyon.address',
@@ -44,9 +38,9 @@ describe('StepAddress component', () => {
         name: 'auth.enedissgegrandlyon.zipCode',
       })
       await act(async () => {
-        await userEvent.type(input, '0')
+        await userEvent.type(input, '1')
       })
-      expect(mockHandleChange).toHaveBeenCalledWith('zipCode', '0', 5)
+      expect(mockHandleChange).toHaveBeenCalledWith('zipCode', '1', 5)
     })
 
     it('should change city value', async () => {
@@ -68,7 +62,7 @@ describe('StepAddress component', () => {
   it('should have an existing zipCode value', () => {
     render(
       <StepAddress
-        sgeState={{ ...mockGlobalState.sgeConnect, zipCode: 69200 }}
+        sgeState={{ ...mockSgeState, zipCode: 69200 }}
         onChange={mockHandleChange}
       />
     )
diff --git a/src/components/Connection/SGEConnect/StepAddress.tsx b/src/components/Connection/SGEConnect/StepAddress.tsx
index dfbcc2d51dd3dfc20d9cea6d97fedfbd9efba956..2ecaed6a2329978ca7637022e4061b52d240b3de 100644
--- a/src/components/Connection/SGEConnect/StepAddress.tsx
+++ b/src/components/Connection/SGEConnect/StepAddress.tsx
@@ -1,5 +1,5 @@
 import { TextField } from '@material-ui/core'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { SgeStore } from 'models'
 import React from 'react'
 import { SGEKeysForm } from './SgeConnectView'
@@ -21,7 +21,6 @@ const StepAddress = ({ sgeState, onChange }: StepAddressProps) => {
         variant="outlined"
         type="text"
         id="address"
-        name="address"
         value={sgeState.address}
         onChange={e => onChange('address', e.target.value)}
         required
@@ -31,7 +30,6 @@ const StepAddress = ({ sgeState, onChange }: StepAddressProps) => {
         variant="outlined"
         type="number"
         id="zipCode"
-        name="zipCode"
         value={sgeState.zipCode ?? undefined}
         onChange={e => onChange('zipCode', e.target.value, 5)}
         required
@@ -41,8 +39,7 @@ const StepAddress = ({ sgeState, onChange }: StepAddressProps) => {
         variant="outlined"
         type="text"
         id="city"
-        name="city"
-        value={sgeState.city}
+        value={sgeState.city || ''}
         onChange={e => onChange('city', e.target.value)}
         required
       />
diff --git a/src/components/Connection/SGEConnect/StepConsent.spec.tsx b/src/components/Connection/SGEConnect/StepConsent.spec.tsx
index 642ebccb39727a42e96b8fc4a45b59f19bb2d2d4..72fb901500d8ab61ec2e69eb3f6ea2373605df41 100644
--- a/src/components/Connection/SGEConnect/StepConsent.spec.tsx
+++ b/src/components/Connection/SGEConnect/StepConsent.spec.tsx
@@ -1,7 +1,7 @@
 import { render, screen } from '@testing-library/react'
 import { userEvent } from '@testing-library/user-event'
 import React from 'react'
-import { mockGlobalState } from 'tests/__mocks__/store'
+import { mockSgeState } from 'tests/__mocks__/forms.mock'
 import StepConsent from './StepConsent'
 
 const mockHandleChange = jest.fn()
@@ -9,21 +9,13 @@ const mockHandleChange = jest.fn()
 describe('StepConsent component', () => {
   it('should be rendered correctly', () => {
     const { container } = render(
-      <StepConsent
-        sgeState={mockGlobalState.sgeConnect}
-        onChange={mockHandleChange}
-      />
+      <StepConsent sgeState={mockSgeState} onChange={mockHandleChange} />
     )
     expect(container).toMatchSnapshot()
   })
 
   it('should change dataConsent and pdlConfirm value', async () => {
-    render(
-      <StepConsent
-        sgeState={mockGlobalState.sgeConnect}
-        onChange={mockHandleChange}
-      />
-    )
+    render(<StepConsent sgeState={mockSgeState} onChange={mockHandleChange} />)
     const consentCheckbox = screen.getByLabelText(
       'auth.enedissgegrandlyon.consentCheck1'
     )
diff --git a/src/components/Connection/SGEConnect/StepConsent.tsx b/src/components/Connection/SGEConnect/StepConsent.tsx
index 33988363d12cafb532a43b721be00e1a02027e4a..500c3b0b4886de9a3eb42471be7b799c387575b0 100644
--- a/src/components/Connection/SGEConnect/StepConsent.tsx
+++ b/src/components/Connection/SGEConnect/StepConsent.tsx
@@ -1,4 +1,5 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { Checkbox } from '@material-ui/core'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { SgeStore } from 'models'
 import React from 'react'
 import { SGEKeysForm } from './SgeConnectView'
@@ -24,14 +25,12 @@ const StepConsent = ({ sgeState, onChange }: StepConsentProps) => {
         <li>{t('auth.enedissgegrandlyon.consentLi3')}</li>
         <li>{t('auth.enedissgegrandlyon.consentLi4')}</li>
       </ul>
-      <label className="inline">
-        <input
-          id="dataConsent"
-          type="checkbox"
-          name="Data-consent-validation"
-          className="inputCheckbox"
+      <label htmlFor="dataConsentSge" className="inline">
+        <Checkbox
+          id="dataConsentSge"
           onChange={e => onChange('dataConsent', e.target.checked)}
           checked={sgeState.dataConsent}
+          required
         />
         <span
           dangerouslySetInnerHTML={{
@@ -39,14 +38,12 @@ const StepConsent = ({ sgeState, onChange }: StepConsentProps) => {
           }}
         />
       </label>
-      <label className="inline">
-        <input
+      <label htmlFor="pdlConfirm" className="inline">
+        <Checkbox
           id="pdlConfirm"
-          type="checkbox"
-          name="Data-consent-validation"
-          className="inputCheckbox"
           onChange={e => onChange('pdlConfirm', e.target.checked)}
           checked={sgeState.pdlConfirm}
+          required
         />
         <span
           dangerouslySetInnerHTML={{
diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx
index 42846fe60b69c7bbe8b135ec64e32e4bf1b00e53..db0bb7e1d6909e0773a57d14d1a092b7840fb256 100644
--- a/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx
+++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.spec.tsx
@@ -1,7 +1,7 @@
 import { act, render, screen } from '@testing-library/react'
 import userEvent from '@testing-library/user-event'
 import React from 'react'
-import { mockGlobalState } from 'tests/__mocks__/store'
+import { mockSgeState } from 'tests/__mocks__/forms.mock'
 import StepIdentityAndPdl from './StepIdentityAndPdl'
 
 const mockHandleChange = jest.fn()
@@ -9,20 +9,14 @@ const mockHandleChange = jest.fn()
 describe('StepIdentityAndPdl component', () => {
   it('should be rendered correctly', () => {
     const { container } = render(
-      <StepIdentityAndPdl
-        sgeState={mockGlobalState.sgeConnect}
-        onChange={mockHandleChange}
-      />
+      <StepIdentityAndPdl sgeState={mockSgeState} onChange={mockHandleChange} />
     )
     expect(container).toMatchSnapshot()
   })
 
   it('should be able to change fields', async () => {
     render(
-      <StepIdentityAndPdl
-        sgeState={mockGlobalState.sgeConnect}
-        onChange={mockHandleChange}
-      />
+      <StepIdentityAndPdl sgeState={mockSgeState} onChange={mockHandleChange} />
     )
     const firstNameInput = screen.getByRole('textbox', {
       name: 'auth.enedissgegrandlyon.firstName',
@@ -51,10 +45,7 @@ describe('StepIdentityAndPdl component', () => {
 
   it('should open hint modal', async () => {
     render(
-      <StepIdentityAndPdl
-        sgeState={mockGlobalState.sgeConnect}
-        onChange={mockHandleChange}
-      />
+      <StepIdentityAndPdl sgeState={mockSgeState} onChange={mockHandleChange} />
     )
     await act(async () => {
       await userEvent.click(
@@ -68,7 +59,7 @@ describe('StepIdentityAndPdl component', () => {
     render(
       <StepIdentityAndPdl
         sgeState={{
-          ...mockGlobalState.sgeConnect,
+          ...mockSgeState,
           pdl: 11111111111111,
           firstName: 'Zack',
           lastName: 'Ichan',
diff --git a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx
index f633f9458f81e7871e01aa9c485b02523edf9baf..e9ef1c8ecaa6d880c75d9018b22d292e9c8ce4a6 100644
--- a/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx
+++ b/src/components/Connection/SGEConnect/StepIdentityAndPdl.tsx
@@ -1,6 +1,6 @@
 import { Button, TextField } from '@material-ui/core'
 import SgeModalHint from 'components/Connection/SGEConnect/SgeModalHint'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { SgeStore } from 'models'
 import React, { useState } from 'react'
 import { SGEKeysForm } from './SgeConnectView'
@@ -20,7 +20,6 @@ const StepIdentityAndPdl = ({
 }: StepIdentityAndPdlProps) => {
   const { t } = useI18n()
   const [openHintModal, setOpenHintModal] = useState<boolean>(false)
-  const toggleModal = () => setOpenHintModal(prev => !prev)
 
   return (
     <div className="stepDetails stepIdentity">
@@ -32,37 +31,39 @@ const StepIdentityAndPdl = ({
         variant="outlined"
         type="text"
         id="firstName"
-        name="firstName"
         value={sgeState.firstName}
         onChange={e => onChange('firstName', e.target.value)}
         required
+        autoComplete="given-name"
       />
       <TextField
         label={t('auth.enedissgegrandlyon.lastName')}
         variant="outlined"
         type="text"
         id="lastName"
-        name="lastName"
         value={sgeState.lastName}
         onChange={e => onChange('lastName', e.target.value)}
         required
+        autoComplete="family-name"
       />
       <h2 className="text-22-bold">{t('auth.enedissgegrandlyon.pdlTitle')}</h2>
       <TextField
         label={t('auth.enedissgegrandlyon.pdlLabel')}
         variant="outlined"
         id="pdl"
-        name="pdl"
         type="number"
-        value={sgeState.pdl ? sgeState.pdl : undefined}
+        value={sgeState.pdl || ''}
         onChange={e => onChange('pdl', e.target.value, 14)}
         inputMode="numeric"
         required
       />
-      <Button className="btnText" onClick={toggleModal}>
+      <Button className="btnText" onClick={() => setOpenHintModal(true)}>
         {t('auth.enedissgegrandlyon.pdlModal.title')}
       </Button>
-      <SgeModalHint open={openHintModal} handleCloseClick={toggleModal} />
+      <SgeModalHint
+        open={openHintModal}
+        handleCloseClick={() => setOpenHintModal(false)}
+      />
     </div>
   )
 }
diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap
index cdc58037adb76fba73cd409447e624c664bda733..8da493fcfe8326d458b5eb7102d8ce1b1c1187a2 100644
--- a/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap
+++ b/src/components/Connection/SGEConnect/__snapshots__/SgeConnectView.spec.tsx.snap
@@ -17,31 +17,8 @@ exports[`SgeConnectView component should be rendered correctly 1`] = `
           class="header-content-top"
         >
           <div
-            class="header-text-desktop text-14-normal-uppercase"
+            class="header-text-selection text-14-normal-uppercase"
           >
-            <button
-              aria-label="header.accessibility.button_back"
-              class="MuiButtonBase-root MuiIconButton-root header-back-button"
-              tabindex="0"
-              type="button"
-            >
-              <span
-                class="MuiIconButton-label"
-              >
-                <svg
-                  class="styles__icon___23x3R"
-                  height="16"
-                  width="16"
-                >
-                  <use
-                    xlink:href="#test-file-stub"
-                  />
-                </svg>
-              </span>
-              <span
-                class="MuiTouchRipple-root"
-              />
-            </button>
             <span>
               common.title_sge_connect
             </span>
@@ -56,6 +33,7 @@ exports[`SgeConnectView component should be rendered correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="40"
                 width="40"
@@ -79,6 +57,7 @@ exports[`SgeConnectView component should be rendered correctly 1`] = `
   <mock-content>
     <div
       class="connectView"
+      tabindex="-1"
     >
       <div
         class="stepContainer"
@@ -138,9 +117,9 @@ exports[`SgeConnectView component should be rendered correctly 1`] = `
             >
               <input
                 aria-invalid="false"
+                autocomplete="given-name"
                 class="MuiInputBase-input MuiOutlinedInput-input"
                 id="firstName"
-                name="firstName"
                 required=""
                 type="text"
                 value=""
@@ -183,9 +162,9 @@ exports[`SgeConnectView component should be rendered correctly 1`] = `
             >
               <input
                 aria-invalid="false"
+                autocomplete="family-name"
                 class="MuiInputBase-input MuiOutlinedInput-input"
                 id="lastName"
-                name="lastName"
                 required=""
                 type="text"
                 value=""
@@ -236,7 +215,6 @@ exports[`SgeConnectView component should be rendered correctly 1`] = `
                 aria-invalid="false"
                 class="MuiInputBase-input MuiOutlinedInput-input"
                 id="pdl"
-                name="pdl"
                 required=""
                 type="number"
                 value=""
diff --git a/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap
index b9ab5c3f9dc4a7569fdc89d10fdbddcf246c804b..45adc444c765eeb371a0d11a51c3f8dbcf0be75d 100644
--- a/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap
+++ b/src/components/Connection/SGEConnect/__snapshots__/SgeModalHint.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`SgeModalHint component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -81,7 +82,7 @@ exports[`SgeModalHint component should be rendered correctly 1`] = `
               class="bill"
             >
               <svg
-                alt=""
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="52"
                 width="52"
@@ -100,7 +101,8 @@ exports[`SgeModalHint component should be rendered correctly 1`] = `
               auth.enedissgegrandlyon.pdlModal.txt4
             </p>
             <svg
-              alt="auth.enedissgegrandlyon.pdlModal.prm_accessibility"
+              aria-hidden="false"
+              aria-label="auth.enedissgegrandlyon.pdlModal.prm_accessibility"
               class="prm styles__icon___23x3R"
               height="16"
               width="16"
diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap
index 9333648f773064e1c9f2b800faca207d7e80aa25..310b53b3a7798f2e8bd9e439f4f92ecece842151 100644
--- a/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap
+++ b/src/components/Connection/SGEConnect/__snapshots__/StepAddress.spec.tsx.snap
@@ -35,7 +35,6 @@ exports[`StepAddress component should be rendered correctly 1`] = `
           aria-invalid="false"
           class="MuiInputBase-input MuiOutlinedInput-input"
           id="address"
-          name="address"
           required=""
           type="text"
           value=""
@@ -59,8 +58,8 @@ exports[`StepAddress component should be rendered correctly 1`] = `
       class="MuiFormControl-root MuiTextField-root"
     >
       <label
-        class="MuiFormLabel-root MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-outlined Mui-required Mui-required"
-        data-shrink="false"
+        class="MuiFormLabel-root MuiInputLabel-root MuiInputLabel-formControl MuiInputLabel-animated MuiInputLabel-shrink MuiInputLabel-outlined MuiFormLabel-filled Mui-required Mui-required"
+        data-shrink="true"
         for="zipCode"
         id="zipCode-label"
       >
@@ -80,17 +79,16 @@ exports[`StepAddress component should be rendered correctly 1`] = `
           aria-invalid="false"
           class="MuiInputBase-input MuiOutlinedInput-input"
           id="zipCode"
-          name="zipCode"
           required=""
           type="number"
-          value=""
+          value="0"
         />
         <fieldset
           aria-hidden="true"
           class="PrivateNotchedOutline-root-1 MuiOutlinedInput-notchedOutline"
         >
           <legend
-            class="PrivateNotchedOutline-legendLabelled-3"
+            class="PrivateNotchedOutline-legendLabelled-3 PrivateNotchedOutline-legendNotched-4"
           >
             <span>
               auth.enedissgegrandlyon.zipCode
@@ -125,7 +123,6 @@ exports[`StepAddress component should be rendered correctly 1`] = `
           aria-invalid="false"
           class="MuiInputBase-input MuiOutlinedInput-input"
           id="city"
-          name="city"
           required=""
           type="text"
           value=""
diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap
index 12291fade1d0270bf8dd71711888143f63131886..a2655d98873bd021555082fb5dfa12ea70622cdd 100644
--- a/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap
+++ b/src/components/Connection/SGEConnect/__snapshots__/StepConsent.spec.tsx.snap
@@ -33,26 +33,76 @@ exports[`StepConsent component should be rendered correctly 1`] = `
     </ul>
     <label
       class="inline"
+      for="dataConsentSge"
     >
-      <input
-        class="inputCheckbox"
-        id="dataConsent"
-        name="Data-consent-validation"
-        type="checkbox"
-      />
+      <span
+        aria-disabled="false"
+        class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-1 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
+      >
+        <span
+          class="MuiIconButton-label"
+        >
+          <input
+            class="PrivateSwitchBase-input-4"
+            data-indeterminate="false"
+            id="dataConsentSge"
+            required=""
+            type="checkbox"
+            value=""
+          />
+          <svg
+            aria-hidden="true"
+            class="MuiSvgIcon-root"
+            focusable="false"
+            viewBox="0 0 24 24"
+          >
+            <path
+              d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
+            />
+          </svg>
+        </span>
+        <span
+          class="MuiTouchRipple-root"
+        />
+      </span>
       <span>
         auth.enedissgegrandlyon.consentCheck1
       </span>
     </label>
     <label
       class="inline"
+      for="pdlConfirm"
     >
-      <input
-        class="inputCheckbox"
-        id="pdlConfirm"
-        name="Data-consent-validation"
-        type="checkbox"
-      />
+      <span
+        aria-disabled="false"
+        class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-1 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
+      >
+        <span
+          class="MuiIconButton-label"
+        >
+          <input
+            class="PrivateSwitchBase-input-4"
+            data-indeterminate="false"
+            id="pdlConfirm"
+            required=""
+            type="checkbox"
+            value=""
+          />
+          <svg
+            aria-hidden="true"
+            class="MuiSvgIcon-root"
+            focusable="false"
+            viewBox="0 0 24 24"
+          >
+            <path
+              d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
+            />
+          </svg>
+        </span>
+        <span
+          class="MuiTouchRipple-root"
+        />
+      </span>
       <span>
         auth.enedissgegrandlyon.consentCheck2
       </span>
diff --git a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap
index 2eaf41d731643a98e6a4fa75ba5903fcaad55e04..05a6887264e695714b1d1cffd1aa20f204bbc26f 100644
--- a/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap
+++ b/src/components/Connection/SGEConnect/__snapshots__/StepIdentityAndPdl.spec.tsx.snap
@@ -33,9 +33,9 @@ exports[`StepIdentityAndPdl component should be rendered correctly 1`] = `
       >
         <input
           aria-invalid="false"
+          autocomplete="given-name"
           class="MuiInputBase-input MuiOutlinedInput-input"
           id="firstName"
-          name="firstName"
           required=""
           type="text"
           value=""
@@ -78,9 +78,9 @@ exports[`StepIdentityAndPdl component should be rendered correctly 1`] = `
       >
         <input
           aria-invalid="false"
+          autocomplete="family-name"
           class="MuiInputBase-input MuiOutlinedInput-input"
           id="lastName"
-          name="lastName"
           required=""
           type="text"
           value=""
@@ -131,7 +131,6 @@ exports[`StepIdentityAndPdl component should be rendered correctly 1`] = `
           aria-invalid="false"
           class="MuiInputBase-input MuiOutlinedInput-input"
           id="pdl"
-          name="pdl"
           required=""
           type="number"
           value=""
diff --git a/src/components/Connection/connection.scss b/src/components/Connection/connection.scss
index bde9ff1d3bb802b579c84895e838e9a8f4bc15fd..ca34a3ae309c71f946d441f3020d6f35fe5657e4 100644
--- a/src/components/Connection/connection.scss
+++ b/src/components/Connection/connection.scss
@@ -33,43 +33,45 @@
     margin: 0 auto 0.5rem auto;
     color: $white;
   }
+}
+
+// EGL
 
-  .connection-form-button {
+.connection-form-button {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 0.5rem;
+  button {
+    height: 2.5rem;
+    max-width: 22.5rem;
+    margin: 0;
+  }
+}
+.connection-form-connect-button {
+  button {
+    height: auto;
+  }
+  &.grdf {
+    margin-top: 2rem;
+  }
+  .connection-form-connect-button-content {
     display: flex;
-    flex-direction: column;
+    justify-content: center;
     align-items: center;
-    gap: 0.5rem;
-    button {
-      height: 2.5rem;
-      max-width: 22.5rem;
-      margin: 0;
-    }
-  }
-  .connection-form-connect-button {
-    button {
-      height: auto;
+    width: 100%;
+    @media #{$large-phone} {
+      justify-content: left;
     }
-    &.grdf {
-      margin-top: 2rem;
+    .connection-form-connect-button-content-icon {
+      margin: 0 0.5rem 0 0;
     }
-    .connection-form-connect-button-content {
+    .connection-form-connect-button-text {
       display: flex;
-      justify-content: center;
-      align-items: center;
-      width: 100%;
-      @media #{$large-phone} {
-        justify-content: left;
-      }
-      .connection-form-connect-button-content-icon {
-        margin: 0 0.5rem 0 0;
-      }
-      .connection-form-connect-button-text {
-        display: flex;
-        flex-direction: column;
-        align-items: flex-start;
-        text-align: left;
-        max-width: 19.5rem;
-      }
+      flex-direction: column;
+      align-items: flex-start;
+      text-align: left;
+      max-width: 19.5rem;
     }
   }
 }
@@ -90,6 +92,7 @@
       display: flex;
       flex-direction: column;
       gap: 1rem;
+      color: $grey-bright;
 
       h2 {
         color: $grey-bright;
@@ -108,7 +111,7 @@
         }
         cursor: pointer;
 
-        span span {
+        span.gold {
           color: $gold-shadow;
         }
       }
@@ -119,7 +122,6 @@
       .MuiInputBase-root {
         max-width: 300px;
       }
-      
 
       /* Chrome, Safari, Edge, Opera */
       input::-webkit-outer-spin-button,
@@ -197,4 +199,3 @@
     }
   }
 }
-
diff --git a/src/components/Connection/useForm.tsx b/src/components/Connection/useForm.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1bf3be72089103ee22d8a0d8ac7efc1e38370a88
--- /dev/null
+++ b/src/components/Connection/useForm.tsx
@@ -0,0 +1,67 @@
+import { Q, QueryDefinition, useQuery } from 'cozy-client'
+import { QueryOptions } from 'cozy-client/types/types'
+import { FORM_DOCTYPE } from 'doctypes'
+import { SgeStep } from 'enums'
+import { AccountGRDFData, SgeStore } from 'models'
+
+export type QueryParams = (arg?: any) => {
+  definition: QueryDefinition
+  options: QueryOptions
+}
+
+interface FormData {
+  firstName: string
+  lastName: string
+  pdl: string
+  pce: string
+  zipCode: string
+  city: string
+  address: string
+}
+
+const getFormData: QueryParams = () => ({
+  definition: Q(FORM_DOCTYPE),
+  options: { as: 'form' },
+})
+
+/** Returns the form data from the form doctype */
+export const useFormData = () => {
+  const { definition, options } = getFormData()
+  // eslint-disable-next-line prefer-const
+  let { data, lastError, fetchStatus } = useQuery(definition, options)
+
+  if (data === null) {
+    data = []
+  }
+
+  const formData = data as [FormData]
+
+  return {
+    formData: formData[0],
+    isFetching: fetchStatus === 'loading',
+    lastError,
+  }
+}
+
+export const createInitialSgeState = (formData?: FormData): SgeStore => ({
+  address: formData?.address ?? '',
+  lastName: formData?.lastName ?? '',
+  firstName: formData?.firstName ?? '',
+  pdl: formData?.pdl ? parseInt(formData.pdl) : null,
+  zipCode: formData?.zipCode ? parseInt(formData.zipCode) : null,
+  city: formData?.city ?? '',
+  currentStep: SgeStep.Address,
+  dataConsent: false,
+  pdlConfirm: false,
+  shouldLaunchAccount: false,
+})
+
+export const createInitialGrdfState = (
+  formData?: FormData
+): AccountGRDFData => ({
+  lastname: formData?.lastName ?? '',
+  firstname: formData?.firstName ?? '',
+  pce: formData?.pce ?? '',
+  postalCode: formData?.zipCode ?? '',
+  email: '',
+})
diff --git a/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.spec.tsx b/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.spec.tsx
index 78b2dc508218534047f0cde124a05df356038db7..3ffa25603c8e63bbbe5fdc34d66d4fb0d5050a56 100644
--- a/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.spec.tsx
+++ b/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.spec.tsx
@@ -8,7 +8,7 @@ import ConsumptionDetails from './ConsumptionDetails'
 describe('ConsumptionDetails component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <ConsumptionDetails fluidType={FluidType.ELECTRICITY} />
diff --git a/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.tsx b/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.tsx
index d74c3bf9c519405750a6acce40e17bb5a896a874..32b9c1021605b43b032f5638bae0e529fea80d13 100644
--- a/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.tsx
+++ b/src/components/Consumption/ConsumptionDetails/ConsumptionDetails.tsx
@@ -1,5 +1,5 @@
 import TotalConsumption from 'components/TotalConsumption/TotalConsumption'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep } from 'enums'
 import React from 'react'
 import { useAppSelector } from 'store/hooks'
diff --git a/src/components/Consumption/ConsumptionView.spec.tsx b/src/components/Consumption/ConsumptionView.spec.tsx
index 96f96183d9ec8a16a75e399a85cdcbc450744fc4..ba2d74b7e7cb6d3349795fba1ceb02ca22184b91 100644
--- a/src/components/Consumption/ConsumptionView.spec.tsx
+++ b/src/components/Consumption/ConsumptionView.spec.tsx
@@ -12,6 +12,7 @@ import { mockTestProfile1 } from 'tests/__mocks__/profileType.mock'
 import {
   createMockEcolyoStore,
   mockChartState,
+  mockGlobalState,
   mockInitialEcolyoState,
   mockModalState,
 } from 'tests/__mocks__/store'
@@ -55,6 +56,9 @@ mockFluidStatus[FluidType.ELECTRICITY].status = FluidState.DONE
 const mockChartStateShowOffline = { ...mockChartState, showOfflineData: true }
 
 describe('ConsumptionView component', () => {
+  beforeEach(() => {
+    jest.clearAllMocks()
+  })
   it('should be rendered correctly', async () => {
     const store = createMockEcolyoStore({
       chart: {
@@ -62,6 +66,7 @@ describe('ConsumptionView component', () => {
         showOfflineData: true,
       },
       global: {
+        ...mockGlobalState,
         fluidStatus: mockFluidStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
@@ -72,6 +77,7 @@ describe('ConsumptionView component', () => {
         <ConsumptionView fluidType={FluidType.ELECTRICITY} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(container.getElementsByTagName('mock-cozybar')[0]).toBeTruthy()
     expect(container.getElementsByTagName('mock-header')[0]).toBeTruthy()
     expect(container.getElementsByTagName('mock-dateNavigator')[0]).toBeTruthy()
@@ -82,31 +88,34 @@ describe('ConsumptionView component', () => {
     ).toBeTruthy()
   })
 
-  it('should set CurrentTimeStep to WEEK when fluid != ELECTRICITY and timeStep = HALF_AN_HOUR', () => {
+  it('should set CurrentTimeStep to WEEK when fluid != ELECTRICITY and timeStep = HALF_AN_HOUR', async () => {
     const store = createMockEcolyoStore({
       chart: {
         ...mockChartState,
         currentTimeStep: TimeStep.HALF_AN_HOUR,
       },
       global: {
+        ...mockGlobalState,
         fluidStatus: mockInitialEcolyoState.global.fluidStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
       modal: mockModalState,
     })
-    render(
+    const { container } = render(
       <Provider store={store}>
         <ConsumptionView fluidType={FluidType.GAS} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(setCurrentTimeStepSpy).toHaveBeenCalledTimes(1)
     expect(setCurrentTimeStepSpy).toHaveBeenCalledWith(TimeStep.WEEK)
   })
 
-  it('should render konnector list when no fluid is connected', () => {
+  it('should render konnector list when no fluid is connected', async () => {
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: [],
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
@@ -117,6 +126,7 @@ describe('ConsumptionView component', () => {
         <ConsumptionView fluidType={FluidType.MULTIFLUID} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(
       container.getElementsByTagName('mock-consumptionDetails')[0]
     ).toBeTruthy()
@@ -126,6 +136,7 @@ describe('ConsumptionView component', () => {
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: mockFluidStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
@@ -149,6 +160,7 @@ describe('ConsumptionView component', () => {
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: mockFluidStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
@@ -175,6 +187,7 @@ describe('ConsumptionView component', () => {
       const store = createMockEcolyoStore({
         chart: mockChartStateShowOffline,
         global: {
+          ...mockGlobalState,
           fluidStatus: updatedStatus,
           releaseNotes: mockInitialEcolyoState.global.releaseNotes,
         },
@@ -203,6 +216,7 @@ describe('ConsumptionView component', () => {
       const store = createMockEcolyoStore({
         chart: mockChartStateShowOffline,
         global: {
+          ...mockGlobalState,
           fluidStatus: updatedStatus,
           releaseNotes: mockInitialEcolyoState.global.releaseNotes,
         },
@@ -225,46 +239,51 @@ describe('ConsumptionView component', () => {
       ).toBeInTheDocument()
     })
   })
-  it('should show expired modal when a GRDF consent is expired', () => {
+  it('should show expired modal when a GRDF consent is expired', async () => {
     const updatedStatus = mockInitialEcolyoState.global.fluidStatus
     updatedStatus[0] = mockExpiredGas
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: updatedStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
       modal: mockModalState,
     })
-    render(
+    const { container } = render(
       <Provider store={store}>
         <ConsumptionView fluidType={FluidType.GAS} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(screen.getByText('consent_outdated.title.2')).toBeInTheDocument()
   })
-  it('should show expired modal when a Enedis consent is expired', () => {
+  it('should show expired modal when a Enedis consent is expired', async () => {
     const updatedStatus = mockInitialEcolyoState.global.fluidStatus
     updatedStatus[0] = mockExpiredElec
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: updatedStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
       modal: mockModalState,
     })
-    render(
+    const { container } = render(
       <Provider store={store}>
         <ConsumptionView fluidType={FluidType.ELECTRICITY} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(screen.getByText('consent_outdated.title.0')).toBeInTheDocument()
   })
   it('should render customPopup Modal', async () => {
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: mockFluidStatus,
         releaseNotes: mockInitialEcolyoState.global.releaseNotes,
       },
@@ -274,17 +293,19 @@ describe('ConsumptionView component', () => {
       },
     })
     mockUpdateProfile.mockResolvedValue(mockTestProfile1)
-    render(
+    const { container } = render(
       <Provider store={store}>
         <ConsumptionView fluidType={FluidType.ELECTRICITY} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(screen.getByRole('dialog')).toBeInTheDocument()
   })
   it('should render releaseNotesModal if releaseNotes.show is true', async () => {
     const store = createMockEcolyoStore({
       chart: mockChartStateShowOffline,
       global: {
+        ...mockGlobalState,
         fluidStatus: mockFluidStatus,
         releaseNotes: {
           show: true,
@@ -294,11 +315,12 @@ describe('ConsumptionView component', () => {
       modal: mockModalState,
     })
     mockUpdateProfile.mockResolvedValue(mockTestProfile1)
-    render(
+    const { container } = render(
       <Provider store={store}>
         <ConsumptionView fluidType={FluidType.ELECTRICITY} />
       </Provider>
     )
+    await waitFor(() => null, { container })
     expect(screen.getByRole('dialog')).toBeInTheDocument()
   })
 })
diff --git a/src/components/Consumption/ConsumptionView.tsx b/src/components/Consumption/ConsumptionView.tsx
index 5b13626490267657c865d676f9627973c77d2a73..3e3cbe47d6aca5fa9cdf8b6f21b424bd8ad4761e 100644
--- a/src/components/Consumption/ConsumptionView.tsx
+++ b/src/components/Consumption/ConsumptionView.tsx
@@ -13,7 +13,6 @@ import { useClient } from 'cozy-client'
 import { FluidState, FluidType, TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import React, { useCallback, useEffect, useMemo, useState } from 'react'
-import { useNavigate } from 'react-router-dom'
 import DateChartService from 'services/dateChart.service'
 import ProfileService from 'services/profile.service'
 import {
@@ -22,20 +21,27 @@ import {
   setSelectedDate,
   setShowOfflineData,
 } from 'store/chart/chart.slice'
-import { showReleaseNotes } from 'store/global/global.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
 import { openPartnersModal, setCustomPopup } from 'store/modal/modal.slice'
 import { isLastDateReached } from 'utils/date'
 import {
+  getFluidName,
   getKonnectorUpdateError,
+  getPartnerKey,
   getTodayDate,
   isKonnectorActive,
 } from 'utils/utils'
 import ConsumptionDetails from './ConsumptionDetails/ConsumptionDetails'
 import FluidButtons from './FluidButtons/FluidButtons'
-
+import { WaterPricing } from './WaterPricing/WaterPricing'
+
+/**
+ * http://ecolyo.cozy.tools:8080/#/consumption
+ * http://ecolyo.cozy.tools:8080/#/consumption/electricity
+ * http://ecolyo.cozy.tools:8080/#/consumption/water
+ * http://ecolyo.cozy.tools:8080/#/consumption/gas
+ */
 const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
-  const navigate = useNavigate()
   const client = useClient()
   const dispatch = useAppDispatch()
   const {
@@ -54,9 +60,6 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
     currentFluidStatus.status === FluidState.CHALLENGE_ASKED
 
   const [openExpiredConsentModal, setOpenExpiredConsentModal] = useState(true)
-  const [openReleaseNoteModal, setOpenReleaseNoteModal] = useState<boolean>(
-    releaseNotes.show
-  )
   const [consentExpiredFluids, setConsentExpiredFluids] = useState<FluidType[]>(
     []
   )
@@ -74,33 +77,11 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
       ? `${currentFluidStatus.lastDataDate.toLocaleString() + fluidType}`
       : ''
 
-  const getPartnerKey = (fluidType: FluidType): 'enedis' | 'egl' | 'grdf' => {
-    switch (fluidType) {
-      case FluidType.ELECTRICITY:
-        return 'enedis'
-      case FluidType.WATER:
-        return 'egl'
-      case FluidType.GAS:
-        return 'grdf'
-      default:
-        throw new Error('unknown fluidtype')
-    }
+  const getTitleKey = (fluidType: FluidType): string => {
+    if (fluidType === FluidType.MULTIFLUID) return 'common.title_consumption'
+    return `common.title_consumption_${getFluidName(fluidType)}`
   }
 
-  const handleCloseReleaseNoteModal = useCallback(() => {
-    setOpenReleaseNoteModal(false)
-    dispatch(
-      showReleaseNotes({
-        show: false,
-        notes: releaseNotes.notes,
-        redirectLink: releaseNotes.redirectLink,
-      })
-    )
-    if (releaseNotes.redirectLink) {
-      navigate(releaseNotes.redirectLink)
-    }
-  }, [dispatch, navigate, releaseNotes.notes, releaseNotes.redirectLink])
-
   const handleClosePartnerIssueModal = useCallback(async () => {
     const profileValues = await profileService.getProfile()
     if (profileValues) {
@@ -168,7 +149,7 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
       }
     }
 
-    if (subscribed) setConsentExpiredFluids(expiredConsents)
+    subscribed && setConsentExpiredFluids(expiredConsents)
     return () => {
       subscribed = false
     }
@@ -210,8 +191,8 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
 
   return (
     <>
-      <CozyBar titleKey="common.title_consumption" />
-      <Header desktopTitleKey="common.title_consumption">
+      <CozyBar titleKey={getTitleKey(fluidType)} />
+      <Header desktopTitleKey={getTitleKey(fluidType)}>
         <DateNavigator
           disableNext={isLastDateReached(selectedDate, currentTimeStep)}
           disablePrev={disablePrev}
@@ -230,18 +211,16 @@ const ConsumptionView = ({ fluidType }: { fluidType: FluidType }) => {
             <ConsumptionDetails fluidType={fluidType} />
           </>
         )}
+
+        {fluidType === FluidType.WATER && showOfflineData && <WaterPricing />}
+
         {!isMulti && <KonnectorViewerCard fluidType={fluidType} />}
 
         {isMulti && !showOfflineData && <KonnectorViewerList />}
       </Content>
 
       {/* MODALS */}
-      {openReleaseNoteModal && (
-        <ReleaseNotesModal
-          open={openReleaseNoteModal}
-          handleCloseClick={handleCloseReleaseNoteModal}
-        />
-      )}
+      {releaseNotes.show && <ReleaseNotesModal open={releaseNotes.show} />}
       {/* Partner issue modals for individual fluids */}
       {fluidStatus
         .filter(fluid => fluid.maintenance)
diff --git a/src/components/Consumption/FluidButtons/FluidButton.spec.tsx b/src/components/Consumption/FluidButtons/FluidButton.spec.tsx
index 09d06751951cf026faba5835fd1c3c13ad34b78f..d78072dfc3ce56f080b1b1c5edba2cd9cf1c3714 100644
--- a/src/components/Consumption/FluidButtons/FluidButton.spec.tsx
+++ b/src/components/Consumption/FluidButtons/FluidButton.spec.tsx
@@ -9,7 +9,7 @@ import FluidButton from './FluidButton'
 describe('FluidButton component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <FluidButton fluidType={FluidType.ELECTRICITY} isActive={false} />
diff --git a/src/components/Consumption/FluidButtons/FluidButton.tsx b/src/components/Consumption/FluidButtons/FluidButton.tsx
index cd08a99446f0f896133baeb5191830565b1f7c07..f6aa3af5b01b22aba90ac4d28f55f3ca37c471ec 100644
--- a/src/components/Consumption/FluidButtons/FluidButton.tsx
+++ b/src/components/Consumption/FluidButtons/FluidButton.tsx
@@ -3,7 +3,7 @@ import ErrorNotif from 'assets/icons/ico/notif_error.svg'
 import PartnerIssueNotif from 'assets/icons/ico/notif_maintenance.svg'
 import classNames from 'classnames'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidState, FluidType } from 'enums'
 import React, { useCallback, useEffect, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
@@ -42,7 +42,7 @@ const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => {
 
   const iconType = getNavPicto(fluidType, isActive, isConnected())
 
-  const goToFluid = useCallback(async () => {
+  const goToFluid = useCallback(() => {
     navigate(isMulti ? '/consumption' : `/consumption/${fluidName}`)
   }, [navigate, isMulti, fluidName])
 
@@ -56,7 +56,11 @@ const FluidButton = ({ fluidType, isActive }: FluidButtonProps) => {
   }, [fluidStatus, fluidType, isConnected, isErrored, isMulti])
 
   return (
-    <IconButton className="fluid-title fluid-button" onClick={goToFluid}>
+    <IconButton
+      role="tab"
+      className="fluid-title fluid-button"
+      onClick={goToFluid}
+    >
       <StyledIcon
         className="fluid-icon"
         icon={iconType}
diff --git a/src/components/Consumption/FluidButtons/FluidButtons.spec.tsx b/src/components/Consumption/FluidButtons/FluidButtons.spec.tsx
index 111456ecb5c280068e07928dbedfe1e66b91a0bc..3a59ea931847bb7002ce5011b90495a0efd06de2 100644
--- a/src/components/Consumption/FluidButtons/FluidButtons.spec.tsx
+++ b/src/components/Consumption/FluidButtons/FluidButtons.spec.tsx
@@ -8,7 +8,7 @@ import FluidButtons from './FluidButtons'
 describe('FluidButtons component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <FluidButtons activeFluid={FluidType.ELECTRICITY} />
diff --git a/src/components/Consumption/FluidButtons/FluidButtons.tsx b/src/components/Consumption/FluidButtons/FluidButtons.tsx
index 09ec44d26b5e6364eb28d3d8ab7de5ae5aa38d18..fb305e20b5c16bb9967b5f5f5eb547f4ac700696 100644
--- a/src/components/Consumption/FluidButtons/FluidButtons.tsx
+++ b/src/components/Consumption/FluidButtons/FluidButtons.tsx
@@ -1,9 +1,12 @@
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import FluidButton from './FluidButton'
 import './fluidButtons.scss'
 
 const FluidButtons = ({ activeFluid }: { activeFluid: FluidType }) => {
+  const { t } = useI18n()
+
   const orderedFluids = [
     FluidType.MULTIFLUID,
     FluidType.ELECTRICITY,
@@ -12,7 +15,11 @@ const FluidButtons = ({ activeFluid }: { activeFluid: FluidType }) => {
   ]
 
   return (
-    <div className="fluid-buttons">
+    <div
+      role="tablist"
+      aria-label={t('consumption.accessibility.fluid_menu')}
+      className="fluid-buttons"
+    >
       <div className="content">
         {orderedFluids.map(fluid => (
           <FluidButton
diff --git a/src/components/Consumption/FluidButtons/__snapshots__/FluidButton.spec.tsx.snap b/src/components/Consumption/FluidButtons/__snapshots__/FluidButton.spec.tsx.snap
index 8c24c5c5e4a9ee60a15420631cef7af09d6dfdd7..e4ba36dde0be8b2b2e7604548c42f6d7f1359c81 100644
--- a/src/components/Consumption/FluidButtons/__snapshots__/FluidButton.spec.tsx.snap
+++ b/src/components/Consumption/FluidButtons/__snapshots__/FluidButton.spec.tsx.snap
@@ -4,6 +4,7 @@ exports[`FluidButton component should be rendered correctly 1`] = `
 <div>
   <button
     class="MuiButtonBase-root MuiIconButton-root fluid-title fluid-button"
+    role="tab"
     tabindex="0"
     type="button"
   >
diff --git a/src/components/Consumption/FluidButtons/__snapshots__/FluidButtons.spec.tsx.snap b/src/components/Consumption/FluidButtons/__snapshots__/FluidButtons.spec.tsx.snap
index 271a057e4ab171d41a738c46816f606037038603..0a7e3429f9c88c29f61fd0f25fd686b7e63bc566 100644
--- a/src/components/Consumption/FluidButtons/__snapshots__/FluidButtons.spec.tsx.snap
+++ b/src/components/Consumption/FluidButtons/__snapshots__/FluidButtons.spec.tsx.snap
@@ -3,13 +3,16 @@
 exports[`FluidButtons component should be rendered correctly 1`] = `
 <div>
   <div
+    aria-label="consumption.accessibility.fluid_menu"
     class="fluid-buttons"
+    role="tablist"
   >
     <div
       class="content"
     >
       <button
         class="MuiButtonBase-root MuiIconButton-root fluid-title fluid-button"
+        role="tab"
         tabindex="0"
         type="button"
       >
@@ -38,6 +41,7 @@ exports[`FluidButtons component should be rendered correctly 1`] = `
       </button>
       <button
         class="MuiButtonBase-root MuiIconButton-root fluid-title fluid-button"
+        role="tab"
         tabindex="0"
         type="button"
       >
@@ -66,6 +70,7 @@ exports[`FluidButtons component should be rendered correctly 1`] = `
       </button>
       <button
         class="MuiButtonBase-root MuiIconButton-root fluid-title fluid-button"
+        role="tab"
         tabindex="0"
         type="button"
       >
@@ -94,6 +99,7 @@ exports[`FluidButtons component should be rendered correctly 1`] = `
       </button>
       <button
         class="MuiButtonBase-root MuiIconButton-root fluid-title fluid-button"
+        role="tab"
         tabindex="0"
         type="button"
       >
diff --git a/src/components/Consumption/WaterPricing/WaterPricing.scss b/src/components/Consumption/WaterPricing/WaterPricing.scss
new file mode 100644
index 0000000000000000000000000000000000000000..769c7e5232593246ef27db5367957b896552b673
--- /dev/null
+++ b/src/components/Consumption/WaterPricing/WaterPricing.scss
@@ -0,0 +1,192 @@
+@import 'src/styles/base/color';
+@import 'src/styles/base/breakpoint';
+
+$price-free: #99cfff;
+$price-regular: #3a98ec;
+$price-double: #3793ff;
+$price-background: #383941;
+
+.pricing-root {
+  margin: 0 auto;
+  margin-bottom: 1rem;
+  max-width: 45.75rem;
+  width: 100%;
+  box-sizing: border-box;
+  @media #{$large-phone} {
+    padding-left: 1rem;
+    padding-right: 1rem;
+  }
+
+  .pricing-container {
+    background: $grey-linear-gradient-background;
+    border-radius: 4px;
+    display: flex;
+    flex-direction: column;
+    gap: 16px;
+    padding: 1rem;
+    p {
+      margin: 0;
+    }
+
+    .row {
+      display: flex;
+      flex-direction: row;
+      justify-content: space-between;
+      align-items: center;
+
+      .year {
+        color: $white;
+      }
+    }
+
+    .gauges {
+      display: grid;
+      grid-template-columns: 1fr auto 3fr auto 1fr;
+      gap: 4px;
+
+      .separator {
+        border-right: 1px solid $soft-grey;
+        height: 130%;
+      }
+    }
+
+    .limit-container {
+      margin-top: 4px;
+      display: grid;
+      grid-template-columns: 1fr auto 3fr auto 1fr;
+      span {
+        color: $soft-grey;
+      }
+      .limit12 {
+        grid-column: 2;
+      }
+      .limit180 {
+        grid-column: 4;
+      }
+    }
+
+    // Colors
+    .gauge-container.free {
+      .gauge-border {
+        border-color: $price-free;
+        background-image: linear-gradient(
+          45deg,
+          $price-free 11.11%,
+          $price-background 11.11%,
+          $price-background 50%,
+          $price-free 50%,
+          $price-free 61.11%,
+          $price-background 61.11%,
+          $price-background 100%
+        );
+      }
+      .gauge-content {
+        background-color: $price-free;
+      }
+    }
+    .gauge-container.regular {
+      .gauge-border {
+        border-radius: 0;
+        border-color: $price-regular;
+        background-image: linear-gradient(
+          45deg,
+          $price-regular 11.11%,
+          $price-background 11.11%,
+          $price-background 50%,
+          $price-regular 50%,
+          $price-regular 61.11%,
+          $price-background 61.11%,
+          $price-background 100%
+        );
+      }
+      .gauge-content {
+        background-color: $price-regular;
+      }
+    }
+
+    .gauge-container.double {
+      .gauge-border {
+        border-radius: 0 20px 20px 0;
+        border-color: $price-double;
+        background-image: linear-gradient(
+          45deg,
+          $price-double 11.11%,
+          $price-background 11.11%,
+          $price-background 50%,
+          $price-double 50%,
+          $price-double 61.11%,
+          $price-background 61.11%,
+          $price-background 100%
+        );
+      }
+      .gauge-content {
+        background-color: $price-double;
+      }
+    }
+
+    .gauge-container.no-color {
+      .gauge-border {
+        border-color: transparent;
+        background-color: $price-background;
+        background-image: none;
+      }
+      .gauge-content {
+        background-color: transparent;
+      }
+    }
+
+    .gauge-container {
+      .gauge-border {
+        height: 16px;
+        box-sizing: border-box;
+        border: 1px solid;
+        background-size: 9px 9px;
+        border-radius: 20px 0 0 20px;
+        overflow: hidden;
+        position: relative;
+        .gauge-content {
+          position: absolute;
+          transition: all 0.5s ease;
+          height: 17px;
+          width: 100%;
+          &.rounded {
+            border-radius: 0 20px 20px 0;
+          }
+        }
+      }
+    }
+
+    .iconFree,
+    .iconRegular,
+    .iconDouble {
+      z-index: 10;
+      position: absolute;
+      top: 1px;
+      left: 1px;
+      &.filled {
+        color: #1b1c22;
+      }
+    }
+    .iconDouble:nth-of-type(2) {
+      left: 15px;
+    }
+
+    .pricing {
+      margin-bottom: 4px;
+      &.free {
+        color: $price-free;
+      }
+      &.regular {
+        color: $price-regular;
+      }
+      &.double {
+        color: $price-double;
+      }
+    }
+
+    .consumption span {
+      color: $white;
+      font-weight: 700;
+    }
+  }
+}
diff --git a/src/components/Consumption/WaterPricing/WaterPricing.spec.tsx b/src/components/Consumption/WaterPricing/WaterPricing.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..14ac6b98f94280ec7d37b1994496a85450c9d90e
--- /dev/null
+++ b/src/components/Consumption/WaterPricing/WaterPricing.spec.tsx
@@ -0,0 +1,29 @@
+import { render, screen } from '@testing-library/react'
+import userEvent from '@testing-library/user-event'
+import React from 'react'
+import { Provider } from 'react-redux'
+import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { WaterPricing } from './WaterPricing'
+
+const store = createMockEcolyoStore()
+
+describe('WaterPricing component', () => {
+  it('should be rendered correctly', () => {
+    const { container } = render(
+      <Provider store={store}>
+        <WaterPricing />
+      </Provider>
+    )
+    expect(container).toMatchSnapshot()
+  })
+
+  it('should open modal when click on button', async () => {
+    render(
+      <Provider store={store}>
+        <WaterPricing />
+      </Provider>
+    )
+    userEvent.click(screen.getByRole('button'))
+    expect(await screen.findByRole('dialog')).toBeInTheDocument()
+  })
+})
diff --git a/src/components/Consumption/WaterPricing/WaterPricing.tsx b/src/components/Consumption/WaterPricing/WaterPricing.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..91107bbfc3d6fb2d4bd5358e94be97135cd80147
--- /dev/null
+++ b/src/components/Consumption/WaterPricing/WaterPricing.tsx
@@ -0,0 +1,164 @@
+import { Button } from '@material-ui/core'
+import euroCrossedIcon from 'assets/icons/ico/euro-crossed.svg'
+import euroIcon from 'assets/icons/ico/euro.svg'
+import classNames from 'classnames'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useClient } from 'cozy-client'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import { FluidType, TimeStep } from 'enums'
+import { DateTime } from 'luxon'
+import React, { useEffect, useState } from 'react'
+import ConsumptionService from 'services/consumption.service'
+import { useAppSelector } from 'store/hooks'
+import './WaterPricing.scss'
+import { WaterPricingModal } from './WaterPricingModal'
+
+// In m³
+const MAX_FREE = 12
+const MAX_REGULAR = 180
+
+export const WaterPricing = () => {
+  const { t } = useI18n()
+  const client = useClient()
+  const { selectedDate } = useAppSelector(state => state.ecolyo.chart)
+  const [showModal, setShowModal] = useState(false)
+  const [consumption, setConsumption] = useState(0)
+
+  const pricing =
+    consumption > 180 ? 'double' : consumption > 12 ? 'regular' : 'free'
+  const isFreeExceeded = consumption >= MAX_FREE
+  const isRegularExceeded = consumption >= MAX_REGULAR
+
+  const freePercentage = Math.min((consumption / MAX_FREE) * 100, 100)
+  // threshold of 30% to display icon
+  const freeWithThreshold = Math.max(30, freePercentage)
+
+  const regularPercentage = Math.min((consumption / MAX_REGULAR) * 100, 100)
+  const regularWithThreshold = Math.max(10, regularPercentage)
+
+  const year = Number(selectedDate.toFormat('y'))
+
+  useEffect(() => {
+    async function fetchData() {
+      const cs = new ConsumptionService(client)
+      const startDate = DateTime.local(year, 1, 1)
+      const endDate = DateTime.local(year, 12, 31)
+
+      const dataLoad = await cs.getGraphData({
+        fluidTypes: [FluidType.WATER],
+        timeStep: TimeStep.YEAR,
+        timePeriod: { startDate, endDate },
+      })
+
+      if (!dataLoad?.actualData) return null
+
+      const rounded = Math.ceil(dataLoad.actualData[0].value / 100) / 10
+      setConsumption(rounded)
+    }
+    fetchData()
+  }, [client, year])
+
+  return (
+    <div className="pricing-root">
+      <div className="pricing-container">
+        <div className="row">
+          <span className="year text-16-bold">
+            {t('consumption.water_pricing.year', { year })}
+          </span>
+          <Button className="btnText" onClick={() => setShowModal(true)}>
+            {t('consumption.water_pricing.more')}
+          </Button>
+        </div>
+
+        <div>
+          <div className="gauges">
+            <div className="gauge-container free">
+              <div className="gauge-border">
+                <StyledIcon
+                  className="iconFree"
+                  icon={euroCrossedIcon}
+                  size={12}
+                />
+                <div
+                  className={classNames('gauge-content', {
+                    rounded: !isFreeExceeded,
+                  })}
+                  style={{ right: `${100 - freeWithThreshold}%` }}
+                />
+              </div>
+            </div>
+
+            <div className="separator" />
+
+            <div
+              className={classNames('gauge-container regular', {
+                'no-color': !isFreeExceeded,
+              })}
+            >
+              <div className="gauge-border">
+                <StyledIcon
+                  className={`iconRegular ${!isFreeExceeded ? '' : 'filled'}`}
+                  icon={euroIcon}
+                  size={12}
+                />
+                <div
+                  className={classNames('gauge-content', {
+                    rounded: !isRegularExceeded,
+                  })}
+                  style={{ right: `${100 - regularWithThreshold}%` }}
+                />
+              </div>
+            </div>
+
+            <div className="separator" />
+
+            <div
+              className={classNames('gauge-container double', {
+                'no-color': !isRegularExceeded,
+              })}
+            >
+              <div className="gauge-border">
+                <StyledIcon
+                  className={`iconDouble ${!isRegularExceeded ? '' : 'filled'}`}
+                  icon={euroIcon}
+                  size={12}
+                />
+                <StyledIcon
+                  className={`iconDouble ${!isRegularExceeded ? '' : 'filled'}`}
+                  icon={euroIcon}
+                  size={12}
+                />
+                <div
+                  className="gauge-content rounded"
+                  style={{ right: `${40}%` }}
+                />
+              </div>
+            </div>
+          </div>
+
+          <div className="limit-container">
+            <span className="limit12">{MAX_FREE}m³</span>
+            <span className="limit180">{MAX_REGULAR}m³</span>
+          </div>
+        </div>
+
+        <div>
+          <p className={`pricing ${pricing} text-14`}>
+            {t(`consumption.water_pricing.${pricing}`)}
+          </p>
+          <p
+            className="consumption text-14"
+            dangerouslySetInnerHTML={{
+              __html: t('consumption.water_pricing.consumption', {
+                consumption,
+              }),
+            }}
+          />
+        </div>
+        {showModal && (
+          <WaterPricingModal handleCloseClick={() => setShowModal(false)} />
+        )}
+      </div>
+    </div>
+  )
+}
diff --git a/src/components/Consumption/WaterPricing/WaterPricingModal.scss b/src/components/Consumption/WaterPricing/WaterPricingModal.scss
new file mode 100644
index 0000000000000000000000000000000000000000..71c4d0c34ba6ea25c3aa80f55b7112d60cda56db
--- /dev/null
+++ b/src/components/Consumption/WaterPricing/WaterPricingModal.scss
@@ -0,0 +1,13 @@
+@import 'src/styles/base/color';
+
+.waterPricingModal {
+  text-align: center;
+
+  h1 {
+    color: $water-color;
+  }
+
+  p {
+    color: $grey-bright;
+  }
+}
diff --git a/src/components/Consumption/WaterPricing/WaterPricingModal.tsx b/src/components/Consumption/WaterPricing/WaterPricingModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..1caad1470cd4f0ec174f3b42650a46226c6e5a95
--- /dev/null
+++ b/src/components/Consumption/WaterPricing/WaterPricingModal.tsx
@@ -0,0 +1,49 @@
+import { Dialog } from '@material-ui/core'
+import Button from '@material-ui/core/Button'
+import CloseIcon from 'assets/icons/ico/close.svg'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import React from 'react'
+import './WaterPricingModal.scss'
+
+export const WaterPricingModal = ({
+  handleCloseClick,
+}: {
+  handleCloseClick: () => void
+}) => {
+  const { t } = useI18n()
+  return (
+    <Dialog
+      open={true}
+      disableEscapeKeyDown
+      onClose={(event, reason): void => {
+        event && reason !== 'backdropClick' && handleCloseClick()
+      }}
+      classes={{
+        root: 'modal-root',
+        paper: 'modal-paper',
+      }}
+    >
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
+        aria-label={t('feedback.accessibility.button_close')}
+        className="modal-paper-close-button"
+      />
+      <div className="waterPricingModal">
+        <h1 className="text-20-bold">
+          {t('consumption.water_pricing.modal.title')}
+        </h1>
+        <p
+          dangerouslySetInnerHTML={{
+            __html: t('consumption.water_pricing.modal.details'),
+          }}
+        />
+
+        <Button onClick={handleCloseClick} className="btnPrimary">
+          {t('consumption.water_pricing.modal.understood')}
+        </Button>
+      </div>
+    </Dialog>
+  )
+}
diff --git a/src/components/Consumption/WaterPricing/__snapshots__/WaterPricing.spec.tsx.snap b/src/components/Consumption/WaterPricing/__snapshots__/WaterPricing.spec.tsx.snap
new file mode 100644
index 0000000000000000000000000000000000000000..d36d9c0a74aee4b1aa936ee226e28e7954f5a635
--- /dev/null
+++ b/src/components/Consumption/WaterPricing/__snapshots__/WaterPricing.spec.tsx.snap
@@ -0,0 +1,153 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`WaterPricing component should be rendered correctly 1`] = `
+<div>
+  <div
+    class="pricing-root"
+  >
+    <div
+      class="pricing-container"
+    >
+      <div
+        class="row"
+      >
+        <span
+          class="year text-16-bold"
+        >
+          consumption.water_pricing.year
+        </span>
+        <button
+          class="MuiButtonBase-root MuiButton-root MuiButton-text btnText"
+          tabindex="0"
+          type="button"
+        >
+          <span
+            class="MuiButton-label"
+          >
+            consumption.water_pricing.more
+          </span>
+          <span
+            class="MuiTouchRipple-root"
+          />
+        </button>
+      </div>
+      <div>
+        <div
+          class="gauges"
+        >
+          <div
+            class="gauge-container free"
+          >
+            <div
+              class="gauge-border"
+            >
+              <svg
+                aria-hidden="true"
+                class="iconFree styles__icon___23x3R"
+                height="12"
+                width="12"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              <div
+                class="gauge-content rounded"
+                style="right: 70%;"
+              />
+            </div>
+          </div>
+          <div
+            class="separator"
+          />
+          <div
+            class="gauge-container regular no-color"
+          >
+            <div
+              class="gauge-border"
+            >
+              <svg
+                aria-hidden="true"
+                class="iconRegular  styles__icon___23x3R"
+                height="12"
+                width="12"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              <div
+                class="gauge-content rounded"
+                style="right: 90%;"
+              />
+            </div>
+          </div>
+          <div
+            class="separator"
+          />
+          <div
+            class="gauge-container double no-color"
+          >
+            <div
+              class="gauge-border"
+            >
+              <svg
+                aria-hidden="true"
+                class="iconDouble  styles__icon___23x3R"
+                height="12"
+                width="12"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              <svg
+                aria-hidden="true"
+                class="iconDouble  styles__icon___23x3R"
+                height="12"
+                width="12"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              <div
+                class="gauge-content rounded"
+                style="right: 40%;"
+              />
+            </div>
+          </div>
+        </div>
+        <div
+          class="limit-container"
+        >
+          <span
+            class="limit12"
+          >
+            12
+            m³
+          </span>
+          <span
+            class="limit180"
+          >
+            180
+            m³
+          </span>
+        </div>
+      </div>
+      <div>
+        <p
+          class="pricing free text-14"
+        >
+          consumption.water_pricing.free
+        </p>
+        <p
+          class="consumption text-14"
+        >
+          consumption.water_pricing.consumption
+        </p>
+      </div>
+    </div>
+  </div>
+</div>
+`;
diff --git a/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx
index ab0e5d35ef66101aebf52175ca76c3c1f1b2779c..fcdbc54ad617e3e44dd79df554a8cbcd10236b9f 100644
--- a/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx
@@ -1,20 +1,25 @@
 import DataloadConsumptionVisualizer from 'components/ConsumptionVisualizer/DataloadConsumptionVisualizer'
 import { FluidType } from 'enums'
 import { DateTime } from 'luxon'
-import { Dataload } from 'models'
 import React from 'react'
 import { useAppSelector } from 'store/hooks'
 import InfoDataConsumptionVisualizer from './InfoDataConsumptionVisualizer'
 import './consumptionVisualizer.scss'
 
-const ConsumptionVisualizer = ({ fluidType }: { fluidType: FluidType }) => {
+const ConsumptionVisualizer = ({
+  fluidType,
+  focusable,
+}: {
+  fluidType: FluidType
+  focusable?: boolean
+}) => {
   const {
     chart: { currentDatachart, currentDatachartIndex },
     global: { fluidStatus, fluidTypes },
   } = useAppSelector(state => state.ecolyo)
 
-  const dataload: Dataload = currentDatachart.actualData[currentDatachartIndex]
-  const compareDataload: Dataload | null = currentDatachart.comparisonData
+  const dataload = currentDatachart.actualData[currentDatachartIndex]
+  const compareDataload = currentDatachart.comparisonData
     ? currentDatachart.comparisonData[currentDatachartIndex]
     : null
 
@@ -23,7 +28,7 @@ const ConsumptionVisualizer = ({ fluidType }: { fluidType: FluidType }) => {
     const lastDays: DateTime[] = []
     if (fluidType === FluidType.MULTIFLUID) {
       for (const _fluidType of fluidTypes) {
-        const date: DateTime | null = fluidStatus[_fluidType].lastDataDate
+        const date = fluidStatus[_fluidType].lastDataDate
         if (date) {
           lastDays.push(date)
         }
@@ -38,7 +43,7 @@ const ConsumptionVisualizer = ({ fluidType }: { fluidType: FluidType }) => {
     }
     return lastDay
   }
-  const lastDataDate: DateTime | null = getLastDataDate()
+  const lastDataDate = getLastDataDate()
 
   return (
     <div className="consumptionvisualizer-root">
@@ -46,12 +51,14 @@ const ConsumptionVisualizer = ({ fluidType }: { fluidType: FluidType }) => {
         fluidType={fluidType}
         dataload={dataload}
         compareDataload={compareDataload}
+        focusable={focusable}
       />
       <div className="consumptionvisualizer-info">
         <InfoDataConsumptionVisualizer
           dataload={dataload}
           fluidType={fluidType}
           lastDataDate={lastDataDate}
+          focusable={focusable}
         />
       </div>
     </div>
diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx
index e0afcdfbd52fa876d4cb2a597f6d8055a1021657..72f8920ca8e556d755e766cfc62b8b47869cc575 100644
--- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.spec.tsx
@@ -44,7 +44,7 @@ const dataLoadWithValueDetail: Dataload = {
 describe('Dataload consumption visualizer component', () => {
   const store = createMockEcolyoStore()
 
-  it('should render with single fluid', async () => {
+  it('should render with single fluid', () => {
     const { container } = render(
       <Provider store={store}>
         <DataloadConsumptionVisualizer
@@ -120,7 +120,7 @@ describe('Dataload consumption visualizer component', () => {
     expect(links.length).toBe(3)
   })
 
-  it('should render with no value to compare available', async () => {
+  it('should render with no value to compare available', () => {
     const store = createMockEcolyoStore({
       chart: { ...mockChartState, showCompare: true },
     })
@@ -138,7 +138,7 @@ describe('Dataload consumption visualizer component', () => {
       .item(0)
     expect(element).toBeInTheDocument()
   })
-  it('should render with water comparison data', async () => {
+  it('should render with water comparison data', () => {
     const store = createMockEcolyoStore({
       chart: { ...mockChartState, showCompare: true },
     })
@@ -154,7 +154,7 @@ describe('Dataload consumption visualizer component', () => {
     const element = container.getElementsByClassName('water-compare').item(0)
     expect(element).toBeInTheDocument()
   })
-  it('should render multifluid with no compare and display estimation modal', async () => {
+  it('should render multifluid with no compare and display estimation modal', () => {
     const { container } = render(
       <Provider store={store}>
         <DataloadConsumptionVisualizer
@@ -169,7 +169,7 @@ describe('Dataload consumption visualizer component', () => {
       .item(0)
     expect(element).toBeInTheDocument()
   })
-  it('should render multifluid with euro conversions', async () => {
+  it('should render multifluid with euro conversions', () => {
     jest.mock('services/converter.service', () => {
       return jest.fn(() => ({
         LoadToEuro: jest.fn(),
diff --git a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
index e28a077ee9150bb6862ee91bb293b8582f007ddd..70162cd080db976256c3429a9c58c9412c073245 100644
--- a/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
@@ -1,7 +1,7 @@
 import { DataloadSectionType, DataloadState, FluidType } from 'enums'
 import { DateTime } from 'luxon'
 import { Dataload } from 'models'
-import React, { useCallback, useState } from 'react'
+import React, { useState } from 'react'
 import { useAppSelector } from 'store/hooks'
 import DataloadNoValue from './DataloadNoValue'
 import DataloadSection from './DataloadSection'
@@ -12,17 +12,17 @@ interface DataloadConsumptionVisualizerProps {
   fluidType: FluidType
   dataload: Dataload
   compareDataload: Dataload | null
+  focusable?: boolean
 }
 const DataloadConsumptionVisualizer = ({
   fluidType,
   dataload,
   compareDataload,
+  focusable,
 }: DataloadConsumptionVisualizerProps) => {
   const { showCompare } = useAppSelector(state => state.ecolyo.chart)
   const [openEstimationModal, setOpenEstimationModal] = useState<boolean>(false)
-  const toggleEstimationModal = useCallback(() => {
-    setOpenEstimationModal(prev => !prev)
-  }, [])
+  const toggleEstimationModal = () => setOpenEstimationModal(prev => !prev)
 
   if (!dataload || dataload.date > DateTime.local()) {
     return <div className="dataloadvisualizer-root" />
@@ -37,7 +37,11 @@ const DataloadConsumptionVisualizer = ({
   ) {
     return (
       <div className="dataloadvisualizer-root">
-        <DataloadNoValue dataload={dataload} fluidType={fluidType} />
+        <DataloadNoValue
+          dataload={dataload}
+          fluidType={fluidType}
+          focusable={focusable}
+        />
       </div>
     )
   }
@@ -52,12 +56,14 @@ const DataloadConsumptionVisualizer = ({
               fluidType={fluidType}
               dataloadSectionType={DataloadSectionType.LEFT}
               toggleEstimationModal={toggleEstimationModal}
+              focusable={focusable}
             />
             <DataloadSection
               dataload={dataload}
               fluidType={fluidType}
               dataloadSectionType={DataloadSectionType.RIGHT}
               toggleEstimationModal={toggleEstimationModal}
+              focusable={focusable}
             />
           </>
         ) : (
@@ -66,6 +72,7 @@ const DataloadConsumptionVisualizer = ({
             fluidType={fluidType}
             dataloadSectionType={DataloadSectionType.NO_COMPARE}
             toggleEstimationModal={toggleEstimationModal}
+            focusable={focusable}
           />
         )}
       </div>
diff --git a/src/components/ConsumptionVisualizer/DataloadNoValue.tsx b/src/components/ConsumptionVisualizer/DataloadNoValue.tsx
index 7598813152c06aaa5ab6fc6d841cc15c10b2af0f..7bcb4b4e0500dca79596e5d6bfca7396258859dd 100644
--- a/src/components/ConsumptionVisualizer/DataloadNoValue.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadNoValue.tsx
@@ -1,5 +1,5 @@
 import { Button } from '@material-ui/core'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DataloadState, FluidType } from 'enums'
 import { Dataload } from 'models'
 import React, { useCallback } from 'react'
@@ -11,9 +11,14 @@ import './consumptionVisualizer.scss'
 interface DataloadNoValueProps {
   dataload: Dataload
   fluidType: FluidType
+  focusable?: boolean
 }
 
-const DataloadNoValue = ({ dataload, fluidType }: DataloadNoValueProps) => {
+const DataloadNoValue = ({
+  dataload,
+  fluidType,
+  focusable,
+}: DataloadNoValueProps) => {
   const { t } = useI18n()
   const dispatch = useAppDispatch()
   const fluidName = getFluidName(fluidType)
@@ -63,6 +68,7 @@ const DataloadNoValue = ({ dataload, fluidType }: DataloadNoValueProps) => {
       <Button
         onClick={handleToggleKonnectorCard}
         classes={{ root: 'btnText', label: 'text-22-normal' }}
+        tabIndex={focusable ? 0 : -1}
       >
         {t('consumption_visualizer.missing_data')}
       </Button>
diff --git a/src/components/ConsumptionVisualizer/DataloadSection.tsx b/src/components/ConsumptionVisualizer/DataloadSection.tsx
index 84a6185eefcd99189f94671696fb370539330759..f15b5ad208a90d2608363e17f28ef7a04d19d94b 100644
--- a/src/components/ConsumptionVisualizer/DataloadSection.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadSection.tsx
@@ -1,5 +1,5 @@
 import classNames from 'classnames'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DataloadSectionType, FluidType } from 'enums'
 import { Dataload } from 'models'
 import React from 'react'
@@ -13,12 +13,14 @@ interface DataloadSectionProps {
   fluidType: FluidType
   dataloadSectionType: DataloadSectionType
   toggleEstimationModal: () => void
+  focusable?: boolean
 }
 const DataloadSection = ({
   dataload,
   fluidType,
   dataloadSectionType,
   toggleEstimationModal,
+  focusable,
 }: DataloadSectionProps) => {
   const { t } = useI18n()
   const isLeft = dataloadSectionType === DataloadSectionType.LEFT
@@ -59,12 +61,14 @@ const DataloadSection = ({
           fluidType={fluidType}
           dataloadSectionType={dataloadSectionType}
           toggleEstimationModal={toggleEstimationModal}
+          focusable={focusable}
         />
       </div>
       <DataloadSectionDetail
         dataload={dataload}
         fluidType={fluidType}
         dataloadSectionType={dataloadSectionType}
+        focusable={focusable}
       />
     </div>
   )
diff --git a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx
index b16a11c999c779d482b909339e28b9ca433f5b92..2b87396502c960a8a47c8dab90410bd0a2b07911 100644
--- a/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadSectionDetail.tsx
@@ -1,6 +1,6 @@
 import classNames from 'classnames'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DataloadSectionType, DataloadState, FluidType } from 'enums'
 import { Dataload } from 'models'
 import React from 'react'
@@ -13,12 +13,14 @@ interface DataloadSectionDetailProps {
   dataload: Dataload
   fluidType: FluidType
   dataloadSectionType: DataloadSectionType
+  focusable?: boolean
 }
 
 const DataloadSectionDetail = ({
   dataload,
   fluidType,
   dataloadSectionType,
+  focusable,
 }: DataloadSectionDetailProps) => {
   const { t } = useI18n()
   const converterService = new ConverterService()
@@ -53,7 +55,7 @@ const DataloadSectionDetail = ({
 
   if (isMulti && isCompare && dataload.valueDetail) {
     return (
-      <div className="dataloadvisualizer-euro text-16-normal">
+      <div role="group" className="dataloadvisualizer-euro text-16-normal">
         {dataload.valueDetail.map((value, index) => {
           const isValid = value.state === DataloadState.VALID
           const isUpcoming = value.state === DataloadState.UPCOMING
@@ -64,8 +66,14 @@ const DataloadSectionDetail = ({
           return (
             <NavLink
               key={FluidType[index]}
+              aria-label={t(
+                `consumption_visualizer.cost_per_fluid.${FluidType[
+                  index
+                ].toLowerCase()}`
+              )}
               to={`/consumption/${FluidType[index].toLowerCase()}`}
               className="dataloadvisualizer-euro-link"
+              tabIndex={focusable ? 0 : -1}
             >
               <div
                 className={classNames('dataloadvisualizer-euro-fluid', {
@@ -74,7 +82,7 @@ const DataloadSectionDetail = ({
                   error: isMissing,
                 })}
               >
-                <Icon
+                <StyledIcon
                   className="dataloadvisualizer-euro-fluid-icon"
                   icon={getNavPicto(index, true, true)}
                   size={22}
@@ -99,11 +107,12 @@ const DataloadSectionDetail = ({
       <NavLink
         to={`/consumption/${getFluidName(fluidType)}`}
         className="dataloadvisualizer-euro-link"
+        tabIndex={focusable ? 0 : -1}
       >
         <div
           className={`dataloadvisualizer-euro-fluid ${getFluidName(fluidType)}`}
         >
-          <Icon
+          <StyledIcon
             className="dataloadvisualizer-euro-fluid-icon"
             icon={getNavPicto(fluidType, true, true)}
             size={22}
diff --git a/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx b/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx
index 77e227da2ad89bcde169a42729c620e712c8955a..61edc3c75d8459af18b034e3ab04228ca84495d2 100644
--- a/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadSectionValue.tsx
@@ -1,5 +1,5 @@
 import { Button } from '@material-ui/core'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DataloadSectionType, FluidType } from 'enums'
 import { Dataload } from 'models'
 import React from 'react'
@@ -10,6 +10,7 @@ interface DataloadSectionValueProps {
   fluidType: FluidType
   dataloadSectionType: DataloadSectionType
   toggleEstimationModal: () => void
+  focusable?: boolean
 }
 
 const DataloadSectionValue = ({
@@ -17,6 +18,7 @@ const DataloadSectionValue = ({
   fluidType,
   dataloadSectionType,
   toggleEstimationModal,
+  focusable,
 }: DataloadSectionValueProps) => {
   const { t } = useI18n()
   const FLUIDNAME = getFluidName(fluidType).toUpperCase()
@@ -36,6 +38,7 @@ const DataloadSectionValue = ({
             }}
             size="small"
             onClick={toggleEstimationModal}
+            tabIndex={focusable ? 0 : -1}
           >
             {t('consumption_visualizer.estimated')}
           </Button>
@@ -46,21 +49,21 @@ const DataloadSectionValue = ({
 
   const formattedValue = formatNumberValues(dataload.value, FLUIDNAME, true)
 
+  if (Number(formattedValue) >= 1000) {
+    return (
+      <>
+        {formatNumberValues(dataload.value, FLUIDNAME)}
+        <span className="text-18-normal">
+          {t(`FLUID.${FLUIDNAME}.MEGAUNIT`)}
+        </span>
+      </>
+    )
+  }
+
   return (
     <>
-      {Number(formattedValue) >= 1000 ? (
-        <>
-          {formatNumberValues(dataload.value, FLUIDNAME)}
-          <span className="text-18-normal">
-            {t(`FLUID.${FLUIDNAME}.MEGAUNIT`)}
-          </span>
-        </>
-      ) : (
-        <>
-          {formatNumberValues(dataload.value)}
-          <span className="text-18-normal">{t(`FLUID.${FLUIDNAME}.UNIT`)}</span>
-        </>
-      )}
+      {formatNumberValues(dataload.value)}
+      <span className="text-18-normal">{t(`FLUID.${FLUIDNAME}.UNIT`)}</span>
     </>
   )
 }
diff --git a/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx b/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx
index a362aa740509e42e6792918e7353cada49f2e520..f3eb6da60b24e005fbff339b7cc2eedac4c7edac 100644
--- a/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx
+++ b/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.spec.tsx
@@ -10,7 +10,7 @@ jest.mock('services/fluidsPrices.service', () => {
 })
 
 describe('EstimatedConsumptionModal component', () => {
-  it('should render correctly', async () => {
+  it('should render correctly', () => {
     const { baseElement } = render(
       <EstimatedConsumptionModal open={true} handleCloseClick={jest.fn()} />
     )
diff --git a/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.tsx b/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.tsx
index a2dfa28b7ca4cf69670b7d9a251cce79fb29e23d..da00e0488fe303448c8c1dfa18ab5f030b16b63f 100644
--- a/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.tsx
+++ b/src/components/ConsumptionVisualizer/EstimatedConsumptionModal.tsx
@@ -1,9 +1,8 @@
-import { IconButton } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import { DateTime } from 'luxon'
 import { FluidPrice } from 'models'
@@ -30,11 +29,11 @@ const EstimatedConsumptionModal = ({
     const fluidsPricesService = new FluidPricesService(client)
     async function getAllLastPrices() {
       const prices = await fluidsPricesService.getAllLastPrices()
-      if (subscribed && prices) {
+      if (prices) {
         setPrices(prices)
       }
     }
-    getAllLastPrices()
+    subscribed && getAllLastPrices()
     return () => {
       subscribed = false
     }
@@ -53,13 +52,12 @@ const EstimatedConsumptionModal = ({
       <div id="accessibility-title">
         {t('consumption_visualizer.modal.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('consumption_visualizer.modal.close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="estimation-modal">
         <div className="text-20-normal modal-title">
           {t('consumption_visualizer.modal.title')}
diff --git a/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx
index 2c0381eb6f25890ee3a081d8f4d7801222095876..f623087cd5e8c8599c0bb66e8b6b1aa09fef1972 100644
--- a/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/InfoDataConsumptionVisualizer.tsx
@@ -1,10 +1,10 @@
 import { Button } from '@material-ui/core'
 import { useMoveToLatestDate } from 'components/Hooks/useMoveToDate'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DataloadState, FluidType } from 'enums'
 import { DateTime } from 'luxon'
 import { Dataload } from 'models'
-import React, { useCallback, useState } from 'react'
+import React, { useState } from 'react'
 import NoDataModal from './NoDataModal'
 import './infoDataConsumptionVisualizer.scss'
 
@@ -12,23 +12,21 @@ interface InfoDataConsumptionVisualizerProps {
   dataload: Dataload
   fluidType: FluidType
   lastDataDate: DateTime | null
+  focusable?: boolean
 }
 
 const InfoDataConsumptionVisualizer = ({
   dataload,
   fluidType,
   lastDataDate,
+  focusable,
 }: InfoDataConsumptionVisualizerProps) => {
   const { t } = useI18n()
   const [openNoDataModal, setOpenNoDataModal] = useState<boolean>(false)
   const { moveToLatestDate } = useMoveToLatestDate(lastDataDate)
 
-  const toggleNoDataModal = useCallback(() => {
-    setOpenNoDataModal(prev => !prev)
-  }, [])
-
   if (!dataload) {
-    return <></>
+    return null
   }
 
   if (
@@ -45,7 +43,11 @@ const InfoDataConsumptionVisualizer = ({
         ? 'last_valid_data_multi'
         : 'last_available_data'
     return (
-      <Button className="btnText" onClick={moveToLatestDate}>
+      <Button
+        className="btnText"
+        onClick={moveToLatestDate}
+        tabIndex={focusable ? 0 : -1}
+      >
         {t(`consumption_visualizer.${key}`, {
           date: lastDate,
         })}
@@ -60,20 +62,24 @@ const InfoDataConsumptionVisualizer = ({
   ) {
     return (
       <>
-        <Button className="btnText" onClick={toggleNoDataModal}>
+        <Button
+          className="btnText"
+          onClick={() => setOpenNoDataModal(true)}
+          tabIndex={focusable ? 0 : -1}
+        >
           <span className="text-16-normal underlined-error">
             {t('consumption_visualizer.why_no_data')}
           </span>
         </Button>
         <NoDataModal
           open={openNoDataModal}
-          handleCloseClick={toggleNoDataModal}
+          handleCloseClick={() => setOpenNoDataModal(false)}
         />
       </>
     )
   }
 
-  return <></>
+  return null
 }
 
 export default InfoDataConsumptionVisualizer
diff --git a/src/components/ConsumptionVisualizer/NoDataModal.spec.tsx b/src/components/ConsumptionVisualizer/NoDataModal.spec.tsx
index c9ff69e6525aa1d2e4a0dbf18c4f52017af31b9c..87dbacbb311b85ccedc09f0a03b1c62364506cf7 100644
--- a/src/components/ConsumptionVisualizer/NoDataModal.spec.tsx
+++ b/src/components/ConsumptionVisualizer/NoDataModal.spec.tsx
@@ -3,7 +3,7 @@ import React from 'react'
 import NoDataModal from './NoDataModal'
 
 describe('NoDataModal component', () => {
-  it('should render correctly', async () => {
+  it('should render correctly', () => {
     const { baseElement } = render(
       <NoDataModal open={true} handleCloseClick={jest.fn()} />
     )
diff --git a/src/components/ConsumptionVisualizer/NoDataModal.tsx b/src/components/ConsumptionVisualizer/NoDataModal.tsx
index 8462aa25dbfde8220f91859007fa9c8b8dc50d33..dca4186e26dc393d3fc11b470f43d65802b8e635 100644
--- a/src/components/ConsumptionVisualizer/NoDataModal.tsx
+++ b/src/components/ConsumptionVisualizer/NoDataModal.tsx
@@ -1,9 +1,10 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import QuestionIcon from 'assets/icons/ico/questionMark.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './noDataModal.scss'
 
@@ -28,16 +29,15 @@ const NoDataModal = ({ open, handleCloseClick }: NoDataModalProps) => {
       <div id="accessibility-title">
         {t('consumption_visualizer.modal.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('consumption_visualizer.modal.close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="nodata-modal">
         <div className="question-mark">
-          <Icon icon={QuestionIcon} size={36} />
+          <StyledIcon icon={QuestionIcon} size={36} />
         </div>
 
         <div className="text-20-normal title">
@@ -52,11 +52,7 @@ const NoDataModal = ({ open, handleCloseClick }: NoDataModalProps) => {
           <li>{t('consumption_visualizer.dataModal.item3')}</li>
           <li>{t('consumption_visualizer.dataModal.item4')}</li>
         </ul>
-        <Button
-          aria-label={t('ecogesture_info_modal.button_close')}
-          onClick={handleCloseClick}
-          className="btnPrimary"
-        >
+        <Button onClick={handleCloseClick} className="btnPrimary">
           {t('ecogesture_info_modal.button_close')}
         </Button>
       </div>
diff --git a/src/components/ConsumptionVisualizer/__snapshots__/EstimatedConsumptionModal.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/EstimatedConsumptionModal.spec.tsx.snap
index c864e8304fa7049b021cf603cdf0f491e8f1e608..6f79fffa991e5ea667f6ee2a4e58f20c728a0f76 100644
--- a/src/components/ConsumptionVisualizer/__snapshots__/EstimatedConsumptionModal.spec.tsx.snap
+++ b/src/components/ConsumptionVisualizer/__snapshots__/EstimatedConsumptionModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`EstimatedConsumptionModal component should render correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
diff --git a/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap
index 41ed4044abb04d88c77a57f53f4c00475bdedc57..f17d502b28fb9a5be3e5eec2ef160d0b8c992c7d 100644
--- a/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap
+++ b/src/components/ConsumptionVisualizer/__snapshots__/InfoDataConsumptionVisualizer.spec.tsx.snap
@@ -4,7 +4,7 @@ exports[`InfoDataConsumptionVisualizer component should render correctly when da
 <div>
   <button
     class="MuiButtonBase-root MuiButton-root MuiButton-text btnText"
-    tabindex="0"
+    tabindex="-1"
     type="button"
   >
     <span
diff --git a/src/components/ConsumptionVisualizer/__snapshots__/NoDataModal.spec.tsx.snap b/src/components/ConsumptionVisualizer/__snapshots__/NoDataModal.spec.tsx.snap
index 971b2e6f4b797334794ace1f0a9db07b5491ff43..c3145b9318cb1ab0698ee473c6f1627a8f0f414a 100644
--- a/src/components/ConsumptionVisualizer/__snapshots__/NoDataModal.spec.tsx.snap
+++ b/src/components/ConsumptionVisualizer/__snapshots__/NoDataModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`NoDataModal component should render correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -67,6 +68,7 @@ exports[`NoDataModal component should render correctly 1`] = `
             class="question-mark"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="36"
               width="36"
@@ -101,7 +103,6 @@ exports[`NoDataModal component should render correctly 1`] = `
             </li>
           </ul>
           <button
-            aria-label="ecogesture_info_modal.button_close"
             class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
             tabindex="0"
             type="button"
diff --git a/src/components/Content/Content.spec.tsx b/src/components/Content/Content.spec.tsx
index 33f8405641d3a810e3aeba704fb74c7eee72e220..a68cc4d18356ad90b46bc4cf745d22a483f84731 100644
--- a/src/components/Content/Content.spec.tsx
+++ b/src/components/Content/Content.spec.tsx
@@ -5,6 +5,7 @@ import {
   createMockEcolyoStore,
   mockChallengeState,
   mockGlobalState,
+  mockModalState,
 } from 'tests/__mocks__/store'
 import Content from './Content'
 
@@ -26,7 +27,7 @@ describe('Content component', () => {
     const store = createMockEcolyoStore({
       global: mockGlobalState,
       challenge: mockChallengeState,
-      modal: { isFeedbacksOpen: true },
+      modal: { ...mockModalState, isFeedbacksOpen: true },
     })
     const { container } = render(
       <Provider store={store}>
diff --git a/src/components/Content/Content.tsx b/src/components/Content/Content.tsx
index f30e26160617fbeb18479fcec8327522b93e548a..287f8f48619b85dbcd03a17e39139abe9de3f517 100644
--- a/src/components/Content/Content.tsx
+++ b/src/components/Content/Content.tsx
@@ -1,6 +1,6 @@
 import FeedbackModal from 'components/Feedback/FeedbackModal'
 import { ScreenType } from 'enums'
-import React, { useEffect } from 'react'
+import React, { useEffect, useRef } from 'react'
 import { changeScreenType } from 'store/global/global.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
 import './content.scss'
@@ -10,6 +10,7 @@ const Content = ({ children }: { children: React.ReactNode }) => {
   const { screenType, headerHeight } = useAppSelector(
     state => state.ecolyo.global
   )
+  const currentScreenType = useRef(screenType)
 
   const cozyBarHeight = 48
   const cozyNavHeight = 56
@@ -21,16 +22,24 @@ const Content = ({ children }: { children: React.ReactNode }) => {
 
   useEffect(() => {
     function handleResize() {
+      let newScreenType: ScreenType
       if (innerWidth <= 768) {
-        dispatch(changeScreenType(ScreenType.MOBILE))
+        newScreenType = ScreenType.MOBILE
       } else if (innerWidth <= 1024) {
-        dispatch(changeScreenType(ScreenType.TABLET))
+        newScreenType = ScreenType.TABLET
       } else {
-        dispatch(changeScreenType(ScreenType.DESKTOP))
+        newScreenType = ScreenType.DESKTOP
+      }
+
+      if (currentScreenType.current !== newScreenType) {
+        currentScreenType.current = newScreenType
+        dispatch(changeScreenType(newScreenType))
       }
     }
+
     handleResize()
     window.addEventListener('resize', handleResize)
+
     return () => {
       window.removeEventListener('resize', handleResize)
     }
diff --git a/src/components/CustomPopup/CustomPopupModal.tsx b/src/components/CustomPopup/CustomPopupModal.tsx
index 189e1d290e39dc2775682d56692158f51c020caf..47bd999706ef7d692c3f7ae69971e7c9fad537eb 100644
--- a/src/components/CustomPopup/CustomPopupModal.tsx
+++ b/src/components/CustomPopup/CustomPopupModal.tsx
@@ -1,11 +1,10 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import IconButton from '@material-ui/core/IconButton'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import DefaultIcon from 'assets/icons/visu/ecogesture/bullhorn.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { DateTime } from 'luxon'
 import { CustomPopup } from 'models'
 import React, { useEffect, useState } from 'react'
@@ -48,13 +47,12 @@ const CustomPopupModal = ({
       }}
     >
       <div id="accessibility-title">{customPopup.title}</div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="customPopupModal">
         <StyledIcon icon={icon} size={100} role="img" ariaHidden={false} />
 
diff --git a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap
index eaf9112489058b5343173335bd0e8254e9578380..8acb6fa60c9f0515e2a047484a4f323125a61f8a 100644
--- a/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap
+++ b/src/components/CustomPopup/__snapshots__/CustomPopupModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`CustomPopupModal component should render correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
diff --git a/src/components/DateNavigator/DateNavigator.spec.tsx b/src/components/DateNavigator/DateNavigator.spec.tsx
index 9d19aca3820b73cde756941e61b9b8c4535196ce..29f83296380f5c16c5c913ba90c6e36beba16723 100644
--- a/src/components/DateNavigator/DateNavigator.spec.tsx
+++ b/src/components/DateNavigator/DateNavigator.spec.tsx
@@ -5,11 +5,6 @@ import { DateTime } from 'luxon'
 import React from 'react'
 import DateNavigator from './DateNavigator'
 
-jest.mock(
-  'components/DateNavigator/DateNavigatorFormat',
-  () => 'mock-date-navigator-format'
-)
-
 const mockedDate = DateTime.local(2021, 7, 1)
   .setZone('utc', {
     keepLocalTime: true,
@@ -17,7 +12,7 @@ const mockedDate = DateTime.local(2021, 7, 1)
   .startOf('day')
 
 describe('DateNavigator component', () => {
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <DateNavigator
         disableNext={false}
@@ -58,7 +53,7 @@ describe('DateNavigator component', () => {
     expect(mockHandleNextDate).toHaveBeenCalledTimes(1)
   })
 
-  it('should not be able to click nav buttons', async () => {
+  it('should not be able to click nav buttons', () => {
     render(
       <DateNavigator
         disableNext={true}
diff --git a/src/components/DateNavigator/DateNavigator.tsx b/src/components/DateNavigator/DateNavigator.tsx
index b23c9ae51343a0ac6a33044c08da0fb791ecab24..7a936ab06ef633f3474b43650153399f538c6456 100644
--- a/src/components/DateNavigator/DateNavigator.tsx
+++ b/src/components/DateNavigator/DateNavigator.tsx
@@ -1,13 +1,12 @@
-import IconButton from '@material-ui/core/IconButton'
 import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg'
 import RightArrowIcon from 'assets/icons/ico/right-arrow.svg'
 import classNames from 'classnames'
-import DateNavigatorFormat from 'components/DateNavigator/DateNavigatorFormat'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import React from 'react'
+import { formatDate } from 'utils/date'
 import './datenavigator.scss'
 
 interface DateNavigatorProps {
@@ -30,34 +29,55 @@ const DateNavigator = ({
   timeStep,
 }: DateNavigatorProps) => {
   const { t } = useI18n()
+  const formattedDate = formatDate(timeStep, navigatorDate)
 
   return (
-    <div className="date-navigator">
-      <IconButton
-        disabled={disablePrev}
+    <div
+      role="group"
+      aria-label={t('consumption.accessibility.navigation_group')}
+      className="date-navigator"
+    >
+      <StyledIconButton
+        icon={LeftArrowIcon}
         onClick={handlePrevDate}
+        disabled={disablePrev}
+        aria-label={t('consumption.accessibility.button_previous_value')}
         className={classNames('date-navigator-button', {
           ['disable']: disablePrev,
         })}
-        aria-label={t('consumption.accessibility.button_previous_value')}
-      >
-        <Icon icon={LeftArrowIcon} size={16} />
-      </IconButton>
-      <DateNavigatorFormat
-        timeStep={timeStep}
-        date={navigatorDate}
-        inline={inlineDateDisplay}
       />
-      <IconButton
-        disabled={disableNext}
+
+      <div className="date-navigator-format">
+        {inlineDateDisplay && formattedDate[0] && formattedDate[1] && (
+          <div className="date-navigator-format-date text-16-bold">
+            {formattedDate[0]} {formattedDate[1]}
+          </div>
+        )}
+        {!inlineDateDisplay && (
+          <>
+            {formattedDate[0] && (
+              <div className="date-navigator-format-date text-16-bold timeRange">
+                {formattedDate[0]}
+              </div>
+            )}
+            {formattedDate[1] && (
+              <div className="date-navigator-format-date text-15-normal">
+                {formattedDate[1]}
+              </div>
+            )}
+          </>
+        )}
+      </div>
+
+      <StyledIconButton
+        icon={RightArrowIcon}
         onClick={handleNextDate}
+        disabled={disableNext}
+        aria-label={t('consumption.accessibility.button_next_value')}
         className={classNames('date-navigator-button', {
           ['disable']: disableNext,
         })}
-        aria-label={t('consumption.accessibility.button_next_value')}
-      >
-        <Icon icon={RightArrowIcon} size={16} />
-      </IconButton>
+      />
     </div>
   )
 }
diff --git a/src/components/DateNavigator/DateNavigatorFormat.tsx b/src/components/DateNavigator/DateNavigatorFormat.tsx
deleted file mode 100644
index d5c835b35eb04908ab9051f8f92d3ece610abba7..0000000000000000000000000000000000000000
--- a/src/components/DateNavigator/DateNavigatorFormat.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import { TimeStep } from 'enums'
-import { DateTime } from 'luxon'
-import React from 'react'
-import './datenavigatorformat.scss'
-
-interface DateNavigatorFormatProps {
-  timeStep: TimeStep
-  date: DateTime
-  inline: boolean
-}
-
-const DateNavigatorFormat = ({
-  timeStep,
-  date,
-  inline,
-}: DateNavigatorFormatProps) => {
-  const formatDate = (_timeStep: TimeStep) => {
-    switch (_timeStep) {
-      case TimeStep.YEAR:
-        return [
-          date.toLocaleString({
-            year: 'numeric',
-          }),
-          '',
-        ]
-      case TimeStep.MONTH:
-        return [
-          date.toLocaleString({
-            month: 'long',
-          }),
-          date.toLocaleString({
-            year: 'numeric',
-          }),
-        ]
-      case TimeStep.DAY:
-      case TimeStep.WEEK:
-        return [
-          date.toLocaleString({
-            weekday: 'long',
-            day: '2-digit',
-          }),
-          date.toLocaleString({
-            month: 'long',
-          }),
-        ]
-      case TimeStep.HALF_AN_HOUR:
-        /**
-         * Format date to range:
-         * 9:00 - 9:30
-         * Day 0X Month
-         */
-        return [
-          `${date.toLocaleString({
-            hour: 'numeric',
-            minute: 'numeric',
-          })} -
-         ${date.plus({ minutes: 30 }).toLocaleString({
-           hour: 'numeric',
-           minute: 'numeric',
-         })}`,
-          date.toLocaleString({
-            weekday: 'long',
-            day: '2-digit',
-            month: 'long',
-          }),
-        ]
-      default:
-        return [date.toLocaleString(DateTime.DATETIME_SHORT), '']
-    }
-  }
-  const formatedDate = formatDate(timeStep)
-
-  return (
-    <div className="date-navigator-format">
-      {inline ? (
-        <>
-          {formatedDate[0] && formatedDate[1] && (
-            <div className="date-navigator-format-date text-16-bold">
-              {formatedDate[0]} {formatedDate[1]}
-            </div>
-          )}
-        </>
-      ) : (
-        <>
-          {formatedDate[0] && (
-            <div className="date-navigator-format-date text-16-bold timeRange">
-              {formatedDate[0]}
-            </div>
-          )}
-          {formatedDate[1] && (
-            <div className="date-navigator-format-date text-15-normal">
-              {formatedDate[1]}
-            </div>
-          )}
-        </>
-      )}
-    </div>
-  )
-}
-
-export default DateNavigatorFormat
diff --git a/src/components/DateNavigator/__snapshots__/DateNavigator.spec.tsx.snap b/src/components/DateNavigator/__snapshots__/DateNavigator.spec.tsx.snap
index aef335f2e5a5c2279374f2c02a5e1c608975850e..f56eb23830f9226fefadb567ea4dbd0e6e8c52ab 100644
--- a/src/components/DateNavigator/__snapshots__/DateNavigator.spec.tsx.snap
+++ b/src/components/DateNavigator/__snapshots__/DateNavigator.spec.tsx.snap
@@ -3,7 +3,9 @@
 exports[`DateNavigator component should be rendered correctly 1`] = `
 <div>
   <div
+    aria-label="consumption.accessibility.navigation_group"
     class="date-navigator"
+    role="group"
   >
     <button
       aria-label="consumption.accessibility.button_previous_value"
@@ -15,6 +17,7 @@ exports[`DateNavigator component should be rendered correctly 1`] = `
         class="MuiIconButton-label"
       >
         <svg
+          aria-hidden="true"
           class="styles__icon___23x3R"
           height="16"
           width="16"
@@ -28,11 +31,20 @@ exports[`DateNavigator component should be rendered correctly 1`] = `
         class="MuiTouchRipple-root"
       />
     </button>
-    <mock-date-navigator-format
-      date="1625097600000"
-      inline="false"
-      timestep="40"
-    />
+    <div
+      class="date-navigator-format"
+    >
+      <div
+        class="date-navigator-format-date text-16-bold timeRange"
+      >
+        July
+      </div>
+      <div
+        class="date-navigator-format-date text-15-normal"
+      >
+        2021
+      </div>
+    </div>
     <button
       aria-label="consumption.accessibility.button_next_value"
       class="MuiButtonBase-root MuiIconButton-root date-navigator-button"
@@ -43,6 +55,7 @@ exports[`DateNavigator component should be rendered correctly 1`] = `
         class="MuiIconButton-label"
       >
         <svg
+          aria-hidden="true"
           class="styles__icon___23x3R"
           height="16"
           width="16"
diff --git a/src/components/DateNavigator/datenavigator.scss b/src/components/DateNavigator/datenavigator.scss
index 34451ece836569368a1c60fb1f3485cc438b4b62..4d8b9d5201a5173c4aecb137cd2bcade681e4420 100644
--- a/src/components/DateNavigator/datenavigator.scss
+++ b/src/components/DateNavigator/datenavigator.scss
@@ -14,4 +14,25 @@
       opacity: 0.3;
     }
   }
+
+  .date-navigator-format {
+    display: flex;
+    flex-direction: column;
+    min-width: 7.81rem;
+    text-align: center;
+    @media all and(max-width: $width-small-phone) {
+      min-width: 10.32rem;
+    }
+    align-items: center;
+    align-self: center;
+    .date-navigator-format-date {
+      color: $grey-bright;
+      &::first-letter {
+        text-transform: uppercase;
+      }
+      &.timeRange {
+        white-space: normal;
+      }
+    }
+  }
 }
diff --git a/src/components/DateNavigator/datenavigatorformat.scss b/src/components/DateNavigator/datenavigatorformat.scss
deleted file mode 100644
index b8dddbc5cb60e5be15a7f51609328d6eabe156f3..0000000000000000000000000000000000000000
--- a/src/components/DateNavigator/datenavigatorformat.scss
+++ /dev/null
@@ -1,23 +0,0 @@
-@import 'src/styles/base/color';
-@import 'src/styles/base/breakpoint';
-
-.date-navigator-format {
-  display: flex;
-  flex-direction: column;
-  min-width: 7.81rem;
-  text-align: center;
-  @media all and(max-width: $width-small-phone) {
-    min-width: 10.32rem;
-  }
-  align-items: center;
-  align-self: center;
-  .date-navigator-format-date {
-    color: $grey-bright;
-    &::first-letter {
-      text-transform: uppercase;
-    }
-    &.timeRange {
-      white-space: normal;
-    }
-  }
-}
diff --git a/src/components/Duel/DuelChart/DuelBar.tsx b/src/components/Duel/DuelChart/DuelBar.tsx
index d90ebddcefa7d14d1763717c7768601a6f7bb6e9..0adb9717ae2201a8508d037fba6bfd2a6ddc2bff 100644
--- a/src/components/Duel/DuelChart/DuelBar.tsx
+++ b/src/components/Duel/DuelChart/DuelBar.tsx
@@ -35,9 +35,7 @@ const DuelBar = ({
   marginBottom = 50,
 }: BarChartProps) => {
   const { currentDataload } = useAppSelector(state => state.ecolyo.challenge)
-  const dataload: Dataload[] = finishedDataLoad
-    ? finishedDataLoad
-    : currentDataload
+  const dataload = finishedDataLoad ? finishedDataLoad : currentDataload
   const getContentWidth = () => {
     return width - marginLeft - marginRight
   }
@@ -47,15 +45,11 @@ const DuelBar = ({
   }
 
   const getMaxLoad = () => {
-    return dataload ? Math.max(...dataload.map((d: Dataload) => d.value)) : 0
+    return dataload ? Math.max(...dataload.map(d => d.value)) : 0
   }
 
   const xScale: ScaleBand<string> = scaleBand()
-    .domain(
-      dataload.map((d: Dataload) =>
-        d.date.toLocaleString(DateTime.DATETIME_SHORT)
-      )
-    )
+    .domain(dataload.map(d => d.date.toLocaleString(DateTime.DATETIME_SHORT)))
     .range([0, getContentWidth()])
     .padding(0.2)
 
diff --git a/src/components/Duel/DuelChart/DuelChart.tsx b/src/components/Duel/DuelChart/DuelChart.tsx
index 993328d4911ba67af59cc6318e38ef791c96301a..e0baa475bf6673b4d7b6e9b89fd305e2c0ecc8f7 100644
--- a/src/components/Duel/DuelChart/DuelChart.tsx
+++ b/src/components/Duel/DuelChart/DuelChart.tsx
@@ -1,7 +1,7 @@
 import DuelBar from 'components/Duel/DuelChart/DuelBar'
 import { TimeStep } from 'enums'
 import { Dataload, UserChallenge } from 'models'
-import React, { useEffect, useState } from 'react'
+import React from 'react'
 import './duelChart.scss'
 
 interface DuelChartProps {
@@ -17,11 +17,8 @@ const DuelChart = ({
   width,
   height,
 }: DuelChartProps) => {
-  const [average, setAverage] = useState<number>(0)
-
-  useEffect(() => {
-    setAverage(userChallenge.duel.threshold / userChallenge.duel.duration.days)
-  }, [userChallenge.duel.duration.days, userChallenge.duel.threshold])
+  const average =
+    userChallenge.duel.threshold / userChallenge.duel.duration.days
 
   return (
     <div className="fs-slide">
diff --git a/src/components/Duel/DuelEmptyValueModal/DuelEmptyValueModal.tsx b/src/components/Duel/DuelEmptyValueModal/DuelEmptyValueModal.tsx
index 70e1f0261ac08777fe51fd2e49d15184c91da5a0..4d76611574562487ec05dff5b2d9e1ad527a05f3 100644
--- a/src/components/Duel/DuelEmptyValueModal/DuelEmptyValueModal.tsx
+++ b/src/components/Duel/DuelEmptyValueModal/DuelEmptyValueModal.tsx
@@ -1,8 +1,8 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
 import defaultIcon from 'assets/icons/visu/duelResult/default.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useEffect, useState } from 'react'
 import { importIconById } from 'utils/utils'
 import './duelEmptyValueModal.scss'
@@ -18,6 +18,7 @@ const DuelEmptyValueModal = ({
 }: DuelEmptyValueModalProps) => {
   const { t } = useI18n()
   const [emptyIcon, setEmptyIcon] = useState<string>(defaultIcon)
+
   useEffect(() => {
     async function handleEcogestureIcon() {
       const icon = await importIconById('emptyValue', 'duel')
@@ -41,7 +42,7 @@ const DuelEmptyValueModal = ({
         {t('duel_empty_value_modal.accessibility.window_title')}
       </div>
       <div className="modal-empty-value-root">
-        <Icon className="imgResult" icon={emptyIcon} size={208} />
+        <StyledIcon className="imgResult" icon={emptyIcon} size={208} />
         <div className="text-28-normal-uppercase modal-empty-value-title">
           {t('duel_empty_value_modal.title')}
         </div>
diff --git a/src/components/Duel/DuelError/DuelError.tsx b/src/components/Duel/DuelError/DuelError.tsx
index 6d9f119e6740e2b8bda49f8c02c8652400a3a524..b05418475ef61178c143828796f10e7f3395684e 100644
--- a/src/components/Duel/DuelError/DuelError.tsx
+++ b/src/components/Duel/DuelError/DuelError.tsx
@@ -1,6 +1,6 @@
 import Button from '@material-ui/core/Button'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import React, { useCallback } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './duelError.scss'
 
@@ -8,17 +8,13 @@ const DuelError = () => {
   const { t } = useI18n()
   const navigate = useNavigate()
 
-  const goBack = useCallback(() => {
-    navigate(-1)
-  }, [navigate])
-
   return (
     <div className="duel-error-container">
       <div className="duel-error-message">{t('duel.global_error')}</div>
       <div className="duel-error-button">
         <Button
           aria-label={t('duel.accessibility.button_go_back')}
-          onClick={goBack}
+          onClick={() => navigate(-1)}
           className="btnSecondary"
         >
           {t('duel.button_go_back')}
diff --git a/src/components/Duel/DuelOngoing/DuelOngoing.spec.tsx b/src/components/Duel/DuelOngoing/DuelOngoing.spec.tsx
index caadee189cd8e0b9668787c3b9b32c6a82407cc5..781ef84c653535a11162acf724ba689268c81caf 100644
--- a/src/components/Duel/DuelOngoing/DuelOngoing.spec.tsx
+++ b/src/components/Duel/DuelOngoing/DuelOngoing.spec.tsx
@@ -21,11 +21,10 @@ jest.mock('components/Duel/DuelChart/DuelChart', () => 'mock-duelchart')
 
 describe('DuelOngoing component', () => {
   const store = createMockEcolyoStore()
-  it('should be rendered correctly', async () => {
-    mockIsChallengeDone.mockResolvedValue({
+  it('should be rendered correctly', () => {
+    mockIsChallengeDone.mockReturnValue({
       isDone: false,
       isWin: false,
-      isEmpty: false,
     })
     const { container } = render(
       <Provider store={store}>
@@ -44,7 +43,7 @@ describe('DuelOngoing component', () => {
       state: UserChallengeState.DUEL,
       startDate: DateTime.local().setZone('utc', { keepLocalTime: true }),
     }
-    mockIsChallengeDone.mockResolvedValue({
+    mockIsChallengeDone.mockReturnValue({
       isDone: true,
       isWin: true,
     })
diff --git a/src/components/Duel/DuelOngoing/DuelOngoing.tsx b/src/components/Duel/DuelOngoing/DuelOngoing.tsx
index e5f8335b43654c066cdb4492f4835e49ae55884d..fae8b15bfb96cb2b2d9cc2b0765fb519c058bfee 100644
--- a/src/components/Duel/DuelOngoing/DuelOngoing.tsx
+++ b/src/components/Duel/DuelOngoing/DuelOngoing.tsx
@@ -4,7 +4,7 @@ import CaptionIncomingIcon from 'assets/icons/visu/duel/captionIncoming.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useChartResize } from 'components/Hooks/useChartResize'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import {
   UserChallengeSuccess,
   UserChallengeUpdateFlag,
@@ -39,14 +39,18 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
   const { currentDataload, userChallengeList } = useAppSelector(
     state => state.ecolyo.challenge
   )
-  const [resultModal, setResultModal] = useState<boolean>(false)
-  const [winChallenge, setWinChallenge] = useState<boolean>(false)
+
   const [showLastDuelModal, setShowLastDuelModal] = useState<boolean>(false)
   const [finishedDataLoad, setFinishedDataLoad] = useState<Dataload[]>()
   const chartContainer = useRef<HTMLDivElement>(null)
   const { height, width } = useChartResize(chartContainer, false)
   const challengeService = useMemo(() => new ChallengeService(client), [client])
 
+  const { isDone, isWin } = challengeService.isChallengeDone(
+    userChallenge,
+    currentDataload
+  )
+
   const duel = userChallenge.duel
 
   const isLastDuel =
@@ -60,7 +64,7 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
   const setResult = useCallback(async () => {
     const updatedChallenge = await challengeService.updateUserChallenge(
       userChallenge,
-      winChallenge
+      isWin
         ? UserChallengeUpdateFlag.DUEL_WIN
         : UserChallengeUpdateFlag.DUEL_LOSS
     )
@@ -73,45 +77,18 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
     } else {
       navigate('/challenges')
     }
-  }, [
-    challengeService,
-    userChallenge,
-    winChallenge,
-    dispatch,
-    isLastDuel,
-    navigate,
-  ])
-
-  useEffect(() => {
-    let subscribed = true
-    async function setChallengeResult() {
-      const { isDone, isWin } = await challengeService.isChallengeDone(
-        userChallenge,
-        currentDataload
-      )
-      if (subscribed) {
-        setResultModal(isDone)
-        setWinChallenge(isWin)
-      }
-    }
-    setChallengeResult()
-    return () => {
-      subscribed = false
-    }
-  }, [challengeService, client, currentDataload, userChallenge])
+  }, [challengeService, userChallenge, isWin, dispatch, isLastDuel, navigate])
 
   useEffect(() => {
     let subscribed = true
     async function populateData() {
       if (isFinished) {
-        const dataloads: Dataload[] =
+        const dataloads =
           await challengeService.getUserChallengeDataload(userChallenge)
-        if (subscribed) {
-          setFinishedDataLoad(dataloads)
-        }
+        setFinishedDataLoad(dataloads)
       }
     }
-    populateData()
+    subscribed && populateData()
     return () => {
       subscribed = false
     }
@@ -128,7 +105,7 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
               : t('duel.goal_failed')}
           </div>
         ) : (
-          <div className="duel-goal text-18-normal">
+          <div className="duel-goal text-18-bold">
             {t('duel.goal1', {
               durationInDays: duel.duration.days,
             })}
@@ -150,14 +127,14 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
             height={height}
           />
         </div>
-        <div className="duel-chart-caption text-15-normal">
+        <div className="duel-chart-caption">
           <div className="duel-caption">
             <StyledIcon
               className="caption-icon"
               icon={CaptionAverageIcon}
               size={25}
             />
-            <div className="caption-label">{t('duel.caption_average')}</div>
+            <span>{t('duel.caption_average')}</span>
           </div>
           <div className="duel-caption">
             <StyledIcon
@@ -165,7 +142,7 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
               icon={CaptionConsumptionIcon}
               size={25}
             />
-            <div className="caption-label">{t('duel.caption_consumption')}</div>
+            <span>{t('duel.caption_consumption')}</span>
           </div>
           <div className="duel-caption">
             <StyledIcon
@@ -173,14 +150,14 @@ const DuelOngoing = ({ userChallenge, isFinished }: DuelOngoingProps) => {
               icon={CaptionIncomingIcon}
               size={25}
             />
-            <div className="caption-label">{t('duel.caption_incoming')}</div>
+            <span>{t('duel.caption_incoming')}</span>
           </div>
         </div>
       </div>
       <DuelResultModal
-        open={resultModal}
+        open={isDone}
         userChallenge={userChallenge}
-        win={winChallenge}
+        win={isWin}
         handleCloseClick={setResult}
       />
       <LastDuelModal
diff --git a/src/components/Duel/DuelOngoing/__snapshots__/DuelOngoing.spec.tsx.snap b/src/components/Duel/DuelOngoing/__snapshots__/DuelOngoing.spec.tsx.snap
index f04488e4ae9cba174bae61d3bdba4812ef221d0d..fe911daa474b74f040df5c1ed6c79edcc1804936 100644
--- a/src/components/Duel/DuelOngoing/__snapshots__/DuelOngoing.spec.tsx.snap
+++ b/src/components/Duel/DuelOngoing/__snapshots__/DuelOngoing.spec.tsx.snap
@@ -11,7 +11,7 @@ exports[`DuelOngoing component should be rendered correctly 1`] = `
       Title DUEL001
     </div>
     <div
-      class="duel-goal text-18-normal"
+      class="duel-goal text-18-bold"
     >
       duel.goal1
       <span>
@@ -39,7 +39,7 @@ exports[`DuelOngoing component should be rendered correctly 1`] = `
       />
     </div>
     <div
-      class="duel-chart-caption text-15-normal"
+      class="duel-chart-caption"
     >
       <div
         class="duel-caption"
@@ -54,11 +54,9 @@ exports[`DuelOngoing component should be rendered correctly 1`] = `
             xlink:href="#test-file-stub"
           />
         </svg>
-        <div
-          class="caption-label"
-        >
+        <span>
           duel.caption_average
-        </div>
+        </span>
       </div>
       <div
         class="duel-caption"
@@ -73,11 +71,9 @@ exports[`DuelOngoing component should be rendered correctly 1`] = `
             xlink:href="#test-file-stub"
           />
         </svg>
-        <div
-          class="caption-label"
-        >
+        <span>
           duel.caption_consumption
-        </div>
+        </span>
       </div>
       <div
         class="duel-caption"
@@ -92,11 +88,9 @@ exports[`DuelOngoing component should be rendered correctly 1`] = `
             xlink:href="#test-file-stub"
           />
         </svg>
-        <div
-          class="caption-label"
-        >
+        <span>
           duel.caption_incoming
-        </div>
+        </span>
       </div>
     </div>
   </div>
diff --git a/src/components/Duel/DuelOngoing/duelOngoing.scss b/src/components/Duel/DuelOngoing/duelOngoing.scss
index 27de1c0bfe3b85505e63a744e64b7d1ebbc0a43c..4e3d318dd8bcf65a1ab155d821501821fdeefed6 100644
--- a/src/components/Duel/DuelOngoing/duelOngoing.scss
+++ b/src/components/Duel/DuelOngoing/duelOngoing.scss
@@ -2,49 +2,42 @@
 @import 'src/styles/base/breakpoint';
 
 .duel-ongoing-container {
+  padding-top: 1rem;
+  padding-inline: 1rem;
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
-}
-.duel-title {
-  color: $soft-grey;
-  margin-top: 1rem;
-}
-.duel-goal {
-  color: $grey-bright;
-  margin: 1rem 3rem;
-  text-align: center;
-}
-.duel-consumption {
-  color: $grey-bright;
-  margin: 1rem auto;
-  @media (max-width: $width-phone) {
-    margin: 0.5rem auto -0.5rem;
+  gap: 1rem;
+
+  .duel-title {
+    color: $soft-grey;
   }
-  .consumption {
+
+  .duel-consumption .consumption {
     color: $gold-light;
   }
-}
-.duel-chart {
-  height: 15.625rem;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  width: 80%;
-}
-.duel-chart-caption {
-  display: flex;
-  flex-direction: column;
-  align-self: flex-start;
-  .duel-caption {
+
+  .duel-chart {
+    height: 15.625rem;
     display: flex;
-    margin-top: 0.75rem;
-    .caption-icon {
-      margin: auto 1.5rem;
-    }
-    .caption-label {
-      color: $grey-bright;
+    align-items: center;
+    justify-content: center;
+    width: 80%;
+  }
+  .duel-chart-caption {
+    display: flex;
+    flex-direction: column;
+    align-self: flex-start;
+    gap: 12px;
+    .duel-caption {
+      display: flex;
+      .caption-icon {
+        margin: auto 1.5rem;
+      }
+      span {
+        color: $grey-bright;
+      }
     }
   }
 }
diff --git a/src/components/Duel/DuelResultModal/DuelResultModal.spec.tsx b/src/components/Duel/DuelResultModal/DuelResultModal.spec.tsx
index 199878a12050aecaccad580936213290144de33a..c73a61c4cc3e5caaa0a790da0dc238a7118ecbd9 100644
--- a/src/components/Duel/DuelResultModal/DuelResultModal.spec.tsx
+++ b/src/components/Duel/DuelResultModal/DuelResultModal.spec.tsx
@@ -15,7 +15,7 @@ describe('DuelResultModal component', () => {
     )
     expect(baseElement).toMatchSnapshot()
   })
-  it('should render a loss modal', async () => {
+  it('should render a loss modal', () => {
     render(
       <DuelResultModal
         open={true}
diff --git a/src/components/Duel/DuelResultModal/DuelResultModal.tsx b/src/components/Duel/DuelResultModal/DuelResultModal.tsx
index 7b23acb614d1cc6da4d9a060c55dc6fa2c60380b..aee02473b3fa722ce8c1a93040ece54a3ba9a2b4 100644
--- a/src/components/Duel/DuelResultModal/DuelResultModal.tsx
+++ b/src/components/Duel/DuelResultModal/DuelResultModal.tsx
@@ -2,8 +2,8 @@ import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
 import challengeWon from 'assets/icons/visu/duelResult/challengeWon.svg'
 import defaultIcon from 'assets/icons/visu/duelResult/default.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallenge } from 'models'
 import React, { useEffect, useState } from 'react'
 import { formatNumberValues, importIconById } from 'utils/utils'
@@ -23,8 +23,7 @@ const DuelResultModal = ({
   handleCloseClick,
 }: DuelResultModalProps) => {
   const { t } = useI18n()
-  const [winIcon, setWinIcon] = useState<string>(defaultIcon)
-  const [lossIcon, setLossIcon] = useState<string>(defaultIcon)
+  const [resultIcon, setResultIcon] = useState<string>(defaultIcon)
   const result = formatNumberValues(
     Math.abs(userChallenge.duel.threshold - userChallenge.duel.userConsumption)
   )
@@ -33,13 +32,14 @@ const DuelResultModal = ({
 
   useEffect(() => {
     async function handleEcogestureIcon() {
-      const icon = await importIconById(userChallenge.id + '-1', 'duelResult')
-      setWinIcon(icon || defaultIcon)
-      const icon2 = await importIconById(userChallenge.id + '-0', 'duelResult')
-      setLossIcon(icon2 || defaultIcon)
+      const icon = await importIconById(
+        userChallenge.id + '-' + Number(win),
+        'duelResult'
+      )
+      setResultIcon(icon || defaultIcon)
     }
     handleEcogestureIcon()
-  }, [userChallenge])
+  }, [userChallenge, win])
 
   return (
     <Dialog
@@ -57,13 +57,13 @@ const DuelResultModal = ({
       <div className="duel-result-modal-root">
         <div className="imgResultContainer">
           {win && (
-            <Icon className="challengeWon" icon={challengeWon} size={300} />
+            <StyledIcon
+              className="challengeWon"
+              icon={challengeWon}
+              size={300}
+            />
           )}
-          <Icon
-            className="imgResult"
-            icon={win ? winIcon : lossIcon}
-            size={180}
-          />
+          <StyledIcon className="imgResult" icon={resultIcon} size={180} />
         </div>
         <div className="text-28-normal-uppercase title">
           {t(`duel_result_modal.${statusKey}.title`)}
diff --git a/src/components/Duel/DuelResultModal/__snapshots__/DuelResultModal.spec.tsx.snap b/src/components/Duel/DuelResultModal/__snapshots__/DuelResultModal.spec.tsx.snap
index aa23ded2d78cd0d202f78d5202ed92f1a4540c17..a310546601d98a120f2865f4685bde452348b1fc 100644
--- a/src/components/Duel/DuelResultModal/__snapshots__/DuelResultModal.spec.tsx.snap
+++ b/src/components/Duel/DuelResultModal/__snapshots__/DuelResultModal.spec.tsx.snap
@@ -44,6 +44,7 @@ exports[`DuelResultModal component should render correctly 1`] = `
             class="imgResultContainer"
           >
             <svg
+              aria-hidden="true"
               class="challengeWon styles__icon___23x3R"
               height="300"
               width="300"
@@ -53,6 +54,7 @@ exports[`DuelResultModal component should render correctly 1`] = `
               />
             </svg>
             <svg
+              aria-hidden="true"
               class="imgResult styles__icon___23x3R"
               height="180"
               width="180"
diff --git a/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx b/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx
index 60e1521ee5c96dc6b2864c1579b9e3d74da7aa67..ac8509e849ed3878b23ce96f47f6d703ca926ec0 100644
--- a/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx
+++ b/src/components/Duel/DuelUnlocked/DuelUnlocked.spec.tsx
@@ -9,11 +9,10 @@ import { formatNumberValues } from 'utils/utils'
 import DuelUnlocked from './DuelUnlocked'
 
 const mockUserChallengeUpdateFlag = jest.fn()
-const mockGetUserChallengeDataload = jest.fn()
 jest.mock('services/challenge.service', () => {
   return jest.fn(() => ({
     updateUserChallenge: mockUserChallengeUpdateFlag,
-    getUserChallengeDataload: mockGetUserChallengeDataload,
+    getUserChallengeDataload: jest.fn(),
   }))
 })
 
@@ -42,6 +41,7 @@ describe('DuelUnlocked component', () => {
   })
 
   it('should update userChallenge when launching duel with configured fluid', async () => {
+    mockUserChallengeUpdateFlag.mockResolvedValueOnce(userChallengeData[0])
     const store = createMockEcolyoStore({
       global: {
         ...mockGlobalState,
diff --git a/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx b/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx
index eb4ddcd86952d5ccb0eb188ceb51b8ec497ab27a..b8e32347e2ca2e98acd856ee07d2ecb53ca4656f 100644
--- a/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx
+++ b/src/components/Duel/DuelUnlocked/DuelUnlocked.tsx
@@ -3,7 +3,7 @@ import defaultDuelIcon from 'assets/icons/visu/challenge/CHALLENGE0001.svg'
 import defaultIcon from 'assets/icons/visu/duel/default.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { UserChallenge } from 'models'
 import React, { useCallback, useEffect, useState } from 'react'
@@ -19,11 +19,9 @@ const DuelUnlocked = ({ userChallenge }: { userChallenge: UserChallenge }) => {
   const dispatch = useAppDispatch()
 
   const [duelIcon, setDuelIcon] = useState(defaultIcon)
-  const average: string = formatNumberValues(
-    userChallenge.duel.threshold
-  ).toString()
-  const duration: string = userChallenge.duel.duration.days.toString()
-  const description: string = userChallenge.duel.description
+  const average = formatNumberValues(userChallenge.duel.threshold).toString()
+  const duration = userChallenge.duel.duration.days.toString()
+  const description = userChallenge.duel.description
     .replace('#CONSUMPTION', average)
     .replace('#DURATION', duration)
 
@@ -33,6 +31,7 @@ const DuelUnlocked = ({ userChallenge }: { userChallenge: UserChallenge }) => {
       userChallenge,
       UserChallengeUpdateFlag.DUEL_START
     )
+
     const dataloads =
       await challengeService.getUserChallengeDataload(updatedChallenge)
     dispatch(
@@ -52,30 +51,28 @@ const DuelUnlocked = ({ userChallenge }: { userChallenge: UserChallenge }) => {
   }, [userChallenge])
 
   return (
-    <>
-      <div className="duel-unlocked-container">
-        <StyledIcon className="duel-icon" icon={duelIcon} size={219} />
-        <div className="duel-description text-20-italic">{`"${description}"`}</div>
-        <div className="duel-title text-16-normal">
-          {userChallenge.duel.title}
-        </div>
-        <div className="duel-average-info text-18-normal">
-          {t('duel.average_info', {
-            average,
-            smartCount: average,
-          })}
-        </div>
-        <div className="button-start">
-          <Button
-            aria-label={t('duel.accessibility.button_start_duel')}
-            onClick={launchDuel}
-            className="btnSecondary"
-          >
-            {t('duel.button_start')}
-          </Button>
-        </div>
+    <div className="duel-unlocked-container">
+      <StyledIcon className="duel-icon" icon={duelIcon} size={219} />
+      <div className="duel-description text-20-italic">{`"${description}"`}</div>
+      <div className="duel-title text-16-normal">
+        {userChallenge.duel.title}
+      </div>
+      <div className="duel-average-info text-18-normal">
+        {t('duel.average_info', {
+          average,
+          smartCount: average,
+        })}
+      </div>
+      <div className="button-start">
+        <Button
+          aria-label={t('duel.accessibility.button_start_duel')}
+          onClick={launchDuel}
+          className="btnSecondary"
+        >
+          {t('duel.button_start')}
+        </Button>
       </div>
-    </>
+    </div>
   )
 }
 
diff --git a/src/components/Duel/DuelView.tsx b/src/components/Duel/DuelView.tsx
index b4004e0732b552ae5393eaa7b1ab0d8b32630ec3..99b938ed031ba52ce926ba61c32b5be4a97dcb36 100644
--- a/src/components/Duel/DuelView.tsx
+++ b/src/components/Duel/DuelView.tsx
@@ -11,6 +11,9 @@ import DuelError from './DuelError/DuelError'
 import DuelOngoing from './DuelOngoing/DuelOngoing'
 import DuelUnlocked from './DuelUnlocked/DuelUnlocked'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/challenges/duel
+ */
 const DuelView = () => {
   const navigate = useNavigate()
   const { userChallengeList } = useAppSelector(state => state.ecolyo.challenge)
diff --git a/src/components/Duel/LastDuelModal/__snapshots__/lastDuelModal.spec.tsx.snap b/src/components/Duel/LastDuelModal/__snapshots__/lastDuelModal.spec.tsx.snap
index 94080d04db0112ac94524c000602b89c7c440d93..f242546792eb2c27d80b64111897dc0196dbf588 100644
--- a/src/components/Duel/LastDuelModal/__snapshots__/lastDuelModal.spec.tsx.snap
+++ b/src/components/Duel/LastDuelModal/__snapshots__/lastDuelModal.spec.tsx.snap
@@ -41,6 +41,7 @@ exports[`lastDuelModal component should render correctly 1`] = `
           class="duel-last-modal-root"
         >
           <button
+            aria-label="last_duel_modal.close"
             class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button"
             tabindex="0"
             type="button"
@@ -49,6 +50,7 @@ exports[`lastDuelModal component should render correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="16"
                 width="16"
diff --git a/src/components/Duel/LastDuelModal/lastDuelModal.tsx b/src/components/Duel/LastDuelModal/lastDuelModal.tsx
index 2e13dfff83fa585f7aed4b97b0c1bc3cac8b84fd..256e15644fa4283c38f1419f86d14dd45922650e 100644
--- a/src/components/Duel/LastDuelModal/lastDuelModal.tsx
+++ b/src/components/Duel/LastDuelModal/lastDuelModal.tsx
@@ -1,10 +1,9 @@
-import { IconButton } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import star from 'assets/icons/visu/duel/star.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './lastDuelModal.scss'
 
@@ -28,12 +27,12 @@ const LastDuelModal = ({ open, handleCloseClick }: LastDuelModalProps) => {
     >
       <div id="accessibility-title">{t('last_duel_modal.title')}</div>
       <div className="duel-last-modal-root">
-        <IconButton
-          className="modal-paper-close-button"
+        <StyledIconButton
+          icon={CloseIcon}
           onClick={handleCloseClick}
-        >
-          <Icon size={16} icon={CloseIcon} />
-        </IconButton>
+          aria-label={t('last_duel_modal.close')}
+          className="modal-paper-close-button"
+        />
         <StyledIcon className="icon" icon={star} size={48} />
         <h1 className="text-28-bold">{t('last_duel_modal.title')}</h1>
         <div>
diff --git a/src/components/Ecogesture/EcogestureCard/EcogestureCard.tsx b/src/components/Ecogesture/EcogestureCard/EcogestureCard.tsx
index 2ae4fb300120eff93e1a2ed31a8c902fe3146868..b2dfc8f5bfc99d28c72406aa2acce2c92447c18f 100644
--- a/src/components/Ecogesture/EcogestureCard/EcogestureCard.tsx
+++ b/src/components/Ecogesture/EcogestureCard/EcogestureCard.tsx
@@ -24,6 +24,7 @@ const EcogestureCard = ({ ecogesture }: { ecogesture: Ecogesture }) => {
 
   return (
     <StyledEcogestureCard
+      role="listitem"
       onClick={() => navigate(`/ecogesture/${ecogesture.id}`)}
       className="ecogesture-list-item"
     >
diff --git a/src/components/Ecogesture/EcogestureCard/__snapshots__/EcogestureCard.spec.tsx.snap b/src/components/Ecogesture/EcogestureCard/__snapshots__/EcogestureCard.spec.tsx.snap
index 3096c7c182a2bb6559e467571b1def474a743d07..3ab49975997b8803b086ad42e0cb921f4536d9a9 100644
--- a/src/components/Ecogesture/EcogestureCard/__snapshots__/EcogestureCard.spec.tsx.snap
+++ b/src/components/Ecogesture/EcogestureCard/__snapshots__/EcogestureCard.spec.tsx.snap
@@ -4,6 +4,7 @@ exports[`EcogestureCard component should be rendered correctly 1`] = `
 <div>
   <button
     class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 ecogesture-list-item"
+    role="listitem"
     tabindex="0"
     type="button"
   >
diff --git a/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.spec.tsx b/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.spec.tsx
index 8c7af8fa436ff6f007d0c6531447e7591056a068..20f5c94c90cbe9613cafdb70e5e70a8c4db99aff 100644
--- a/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.spec.tsx
+++ b/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.spec.tsx
@@ -17,7 +17,7 @@ describe('EcogestureEmptyList component', () => {
         setTab={mockChangeTab}
         isObjective={true}
         isSelectionDone={false}
-        handleReinitClick={jest.fn()}
+        openResetEcogestureModal={jest.fn()}
       />
     )
     expect(container).toMatchSnapshot()
@@ -28,11 +28,13 @@ describe('EcogestureEmptyList component', () => {
         setTab={mockChangeTab}
         isObjective={false}
         isSelectionDone={true}
-        handleReinitClick={jest.fn()}
+        openResetEcogestureModal={jest.fn()}
       />
     )
     await act(async () => {
-      await userEvent.click(screen.getByLabelText('ecogesture.emptyList.btn1'))
+      await userEvent.click(
+        screen.getByRole('button', { name: 'ecogesture.emptyList.btn1' })
+      )
     })
     expect(mockChangeTab).toHaveBeenCalledTimes(1)
   })
@@ -42,11 +44,13 @@ describe('EcogestureEmptyList component', () => {
         setTab={mockChangeTab}
         isObjective={false}
         isSelectionDone={false}
-        handleReinitClick={jest.fn()}
+        openResetEcogestureModal={jest.fn()}
       />
     )
     await act(async () => {
-      await userEvent.click(screen.getByLabelText('ecogesture.emptyList.btn2'))
+      await userEvent.click(
+        screen.getByRole('button', { name: 'ecogesture.emptyList.btn2' })
+      )
     })
     expect(mockedNavigate).toHaveBeenCalledWith('/ecogesture-form')
   })
@@ -56,7 +60,7 @@ describe('EcogestureEmptyList component', () => {
         setTab={mockChangeTab}
         isObjective={false}
         isSelectionDone={true}
-        handleReinitClick={jest.fn()}
+        openResetEcogestureModal={jest.fn()}
       />
     )
     expect(
@@ -69,7 +73,7 @@ describe('EcogestureEmptyList component', () => {
         setTab={mockChangeTab}
         isObjective={true}
         isSelectionDone={true}
-        handleReinitClick={jest.fn()}
+        openResetEcogestureModal={jest.fn()}
       />
     )
     expect(
diff --git a/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.tsx b/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.tsx
index b51c6f032edcc8c9b68cbd4b0fe82ea13d842e18..2898c3515c4909046845d6fcf14e8b86766a970d 100644
--- a/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.tsx
+++ b/src/components/Ecogesture/EcogestureEmptyList/EcogestureEmptyList.tsx
@@ -2,7 +2,7 @@ import Button from '@material-ui/core/Button'
 import doingIcon from 'assets/icons/ico/doing-enabled.svg'
 import objectiveIcon from 'assets/icons/ico/objective-enabled.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './ecogestureEmptyList.scss'
@@ -11,13 +11,13 @@ interface EcogestureEmptyListProps {
   setTab: React.Dispatch<React.SetStateAction<number>>
   isObjective: boolean
   isSelectionDone: boolean
-  handleReinitClick: () => void
+  openResetEcogestureModal: () => void
 }
 const EcogestureEmptyList = ({
   setTab,
   isObjective,
   isSelectionDone,
-  handleReinitClick,
+  openResetEcogestureModal,
 }: EcogestureEmptyListProps) => {
   const { t } = useI18n()
   const navigate = useNavigate()
@@ -38,27 +38,18 @@ const EcogestureEmptyList = ({
           {t(`ecogesture.emptyList.${objOrDoing}2${isDone}`)}
         </div>
         <div className="buttons">
-          <Button
-            aria-label={t('ecogesture.emptyList.btn1')}
-            onClick={() => setTab(2)}
-            className="btnSecondary"
-          >
+          <Button onClick={() => setTab(2)} className="btnSecondary">
             {t('ecogesture.emptyList.btn1')}
           </Button>
 
           {isSelectionDone && (
-            <Button
-              aria-label={t('ecogesture.reinit')}
-              onClick={handleReinitClick}
-              className="btnSecondary"
-            >
-              {t('ecogesture.reinit')}
+            <Button onClick={openResetEcogestureModal} className="btnSecondary">
+              {t('ecogesture.reset')}
             </Button>
           )}
 
           {!isSelectionDone && (
             <Button
-              aria-label={t('ecogesture.emptyList.btn2')}
               onClick={() => {
                 navigate('/ecogesture-form')
               }}
diff --git a/src/components/Ecogesture/EcogestureEmptyList/__snapshots__/EcogestureEmptyList.spec.tsx.snap b/src/components/Ecogesture/EcogestureEmptyList/__snapshots__/EcogestureEmptyList.spec.tsx.snap
index 3fcc1897fd30e95764ae4a513e3220b41e039d85..e3f1bf13dff495bdea274da2fa76b1bd01728d3c 100644
--- a/src/components/Ecogesture/EcogestureEmptyList/__snapshots__/EcogestureEmptyList.spec.tsx.snap
+++ b/src/components/Ecogesture/EcogestureEmptyList/__snapshots__/EcogestureEmptyList.spec.tsx.snap
@@ -32,7 +32,6 @@ exports[`EcogestureEmptyList component should be rendered correctly 1`] = `
         class="buttons"
       >
         <button
-          aria-label="ecogesture.emptyList.btn1"
           class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
           tabindex="0"
           type="button"
@@ -47,7 +46,6 @@ exports[`EcogestureEmptyList component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture.emptyList.btn2"
           class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
           tabindex="0"
           type="button"
diff --git a/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.spec.tsx b/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.spec.tsx
index f42e399cf57084624bb061cff2dc17dae592fb1e..8c97e6e22465d3046251099ac39e70f912b76a35 100644
--- a/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.spec.tsx
+++ b/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.spec.tsx
@@ -1,45 +1,92 @@
 import { act, render, screen } from '@testing-library/react'
-import { userEvent } from '@testing-library/user-event'
+import userEvent from '@testing-library/user-event'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
+import { Provider } from 'react-redux'
+import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import '../../../locales/fr.json'
 import EcogestureInitModal from './EcogestureInitModal'
 
-const mockHandleClose = jest.fn()
-const mockHandleLaunchForm = jest.fn()
+const mockedNavigate = jest.fn()
+const mockOnClose = jest.fn()
+const mockOnAccept = jest.fn()
+
+jest.mock('react-router-dom', () => ({
+  ...jest.requireActual('react-router-dom'),
+  useNavigate: () => mockedNavigate,
+}))
+
 describe('EcogestureInitModal component', () => {
-  it('should be rendered correctly', () => {
+  const store = createMockEcolyoStore()
+  const { t } = useI18n()
+
+  beforeEach(() => {
+    jest.clearAllMocks()
+  })
+
+  it('should not render the modal when open is false', () => {
+    const { queryByRole } = render(
+      <Provider store={store}>
+        <EcogestureInitModal
+          open={false}
+          onClose={mockOnClose}
+          onAccept={mockOnAccept}
+        />
+      </Provider>
+    )
+    expect(queryByRole('dialog')).toBeNull()
+  })
+
+  it('should render correctly when open is true', () => {
     const { baseElement } = render(
-      <EcogestureInitModal
-        open={true}
-        handleCloseClick={mockHandleClose}
-        handleLaunchForm={mockHandleLaunchForm}
-      />
+      <Provider store={store}>
+        <EcogestureInitModal
+          open={true}
+          onClose={mockOnClose}
+          onAccept={mockOnAccept}
+        />
+      </Provider>
     )
     expect(baseElement).toMatchSnapshot()
   })
-  it('should close modal', async () => {
+
+  it('should call onAccept and navigate to /ecogesture-form?modal=false when the accept button is clicked', async () => {
     render(
-      <EcogestureInitModal
-        open={true}
-        handleCloseClick={mockHandleClose}
-        handleLaunchForm={mockHandleLaunchForm}
-      />
+      <Provider store={store}>
+        <EcogestureInitModal
+          open={true}
+          onClose={mockOnClose}
+          onAccept={() => {
+            mockOnAccept()
+            mockedNavigate('/ecogesture-form?modal=false')
+          }}
+        />
+      </Provider>
     )
     await act(async () => {
-      await userEvent.click(screen.getByText('ecogesture.initModal.btn1'))
+      await userEvent.click(screen.getByText(t('ecogesture.initModal.btn2')))
     })
-    expect(mockHandleClose).toHaveBeenCalledTimes(1)
+    expect(mockedNavigate).toHaveBeenCalledWith('/ecogesture-form?modal=false')
+    expect(mockOnAccept).toHaveBeenCalled()
   })
-  it('should close modal and launch form', async () => {
+
+  it('should call onClose and navigate to /ecogestures when the close button is clicked', async () => {
     render(
-      <EcogestureInitModal
-        open={true}
-        handleCloseClick={mockHandleClose}
-        handleLaunchForm={mockHandleLaunchForm}
-      />
+      <Provider store={store}>
+        <EcogestureInitModal
+          open={true}
+          onClose={() => {
+            mockOnClose()
+            mockedNavigate('/ecogestures')
+          }}
+          onAccept={mockOnAccept}
+        />
+      </Provider>
     )
     await act(async () => {
-      await userEvent.click(screen.getByText('ecogesture.initModal.btn2'))
+      await userEvent.click(screen.getByText(t('ecogesture.initModal.btn1')))
     })
-    expect(mockHandleLaunchForm).toHaveBeenCalledTimes(1)
+    expect(mockedNavigate).toHaveBeenCalledWith('/ecogestures')
+    expect(mockOnClose).toHaveBeenCalled()
   })
 })
diff --git a/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.tsx b/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.tsx
index 4575d4809619dfd37401dbcb0342ce84baa10c47..49f747c44ea25a2a2372df805ef0e6edce4cde37 100644
--- a/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.tsx
+++ b/src/components/Ecogesture/EcogestureInitModal/EcogestureInitModal.tsx
@@ -1,27 +1,28 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './ecogestureInitModal.scss'
 
 interface EcogestureInitModalProps {
   open: boolean
-  handleCloseClick: () => void
-  handleLaunchForm: () => void
+  onClose: () => void
+  onAccept: () => void
 }
 
 const EcogestureInitModal = ({
   open,
-  handleCloseClick,
-  handleLaunchForm,
+  onClose,
+  onAccept,
 }: EcogestureInitModalProps) => {
   const { t } = useI18n()
+
   return (
     <Dialog
       open={open}
-      onClose={handleCloseClick}
+      onClose={onClose}
       aria-labelledby="accessibility-title"
       classes={{
         root: 'modal-root',
@@ -31,13 +32,12 @@ const EcogestureInitModal = ({
       <div id="accessibility-title">
         {t('feedback.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={onClose}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="eg-init-modal">
         <div className="title text-20-bold">
           {t('ecogesture.initModal.title')}
@@ -45,18 +45,10 @@ const EcogestureInitModal = ({
         <div className="text-16-normal">{t('ecogesture.initModal.text1')}</div>
         <div className="text-16-normal">{t('ecogesture.initModal.text2')}</div>
         <div className="buttons-container">
-          <Button
-            aria-label={t('ecogesture.initModal.btn2')}
-            onClick={handleLaunchForm}
-            className="btnPrimary"
-          >
+          <Button onClick={onAccept} className="btnPrimary">
             {t('ecogesture.initModal.btn2')}
           </Button>
-          <Button
-            aria-label={t('ecogesture.initModal.btn1')}
-            onClick={handleCloseClick}
-            className="btnSecondary"
-          >
+          <Button onClick={onClose} className="btnSecondary">
             {t('ecogesture.initModal.btn1')}
           </Button>
         </div>
diff --git a/src/components/Ecogesture/EcogestureInitModal/__snapshots__/EcogestureInitModal.spec.tsx.snap b/src/components/Ecogesture/EcogestureInitModal/__snapshots__/EcogestureInitModal.spec.tsx.snap
index e0eb858751c570042ded61b7df0222b2ce2fcb68..a9f9d04742decea5edcf5f6d091218e2d87f20ff 100644
--- a/src/components/Ecogesture/EcogestureInitModal/__snapshots__/EcogestureInitModal.spec.tsx.snap
+++ b/src/components/Ecogesture/EcogestureInitModal/__snapshots__/EcogestureInitModal.spec.tsx.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`EcogestureInitModal component should be rendered correctly 1`] = `
+exports[`EcogestureInitModal component should render correctly when open is true 1`] = `
 <body
   style="padding-right: 0px; overflow: hidden;"
 >
@@ -47,6 +47,7 @@ exports[`EcogestureInitModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -82,7 +83,6 @@ exports[`EcogestureInitModal component should be rendered correctly 1`] = `
             class="buttons-container"
           >
             <button
-              aria-label="ecogesture.initModal.btn2"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
               tabindex="0"
               type="button"
@@ -97,7 +97,6 @@ exports[`EcogestureInitModal component should be rendered correctly 1`] = `
               />
             </button>
             <button
-              aria-label="ecogesture.initModal.btn1"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
               tabindex="0"
               type="button"
diff --git a/src/components/Ecogesture/EcogestureList/EcogestureList.spec.tsx b/src/components/Ecogesture/EcogestureList/EcogestureList.spec.tsx
index bff4393a53fdfed61b124c92955352205e7fd2a0..1e7f223c9b4436f8eb7dd1b6c1a7e9979d048c19 100644
--- a/src/components/Ecogesture/EcogestureList/EcogestureList.spec.tsx
+++ b/src/components/Ecogesture/EcogestureList/EcogestureList.spec.tsx
@@ -19,7 +19,6 @@ jest.mock(
   () => 'mock-ecogesturecard'
 )
 
-const mockHandleReinit = jest.fn()
 const updateEcogestureFilter = jest.fn()
 const mockAppDispatch = jest.spyOn(storeHooks, 'useAppDispatch')
 mockAppDispatch.mockImplementation(() => updateEcogestureFilter)
@@ -30,7 +29,7 @@ describe('EcogesturesList component', () => {
   beforeAll(() => {
     mockAppDispatch.mockClear()
   })
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <BrowserRouter>
@@ -39,7 +38,7 @@ describe('EcogesturesList component', () => {
             displaySelection={false}
             selectionTotal={0}
             selectionViewed={0}
-            handleReinitClick={mockHandleReinit}
+            openResetEcogestureModal={jest.fn()}
           />
         </BrowserRouter>
       </Provider>
diff --git a/src/components/Ecogesture/EcogestureList/EcogestureList.tsx b/src/components/Ecogesture/EcogestureList/EcogestureList.tsx
index 35377c4fcb7bca2ef861c29dc220be1ff38a0c65..07c98e91824e3f984eded45cf1a8d73b6a765218 100644
--- a/src/components/Ecogesture/EcogestureList/EcogestureList.tsx
+++ b/src/components/Ecogesture/EcogestureList/EcogestureList.tsx
@@ -4,7 +4,7 @@ import CheckIcon from 'assets/icons/ico/check.svg'
 import SortIcon from 'assets/icons/ico/sort.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import EcogestureCard from 'components/Ecogesture/EcogestureCard/EcogestureCard'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { Usage } from 'enums'
 import { Ecogesture } from 'models'
 import React, { useState } from 'react'
@@ -18,7 +18,7 @@ interface EcogestureListProps {
   displaySelection: boolean
   selectionTotal: number
   selectionViewed: number
-  handleReinitClick?: () => void
+  openResetEcogestureModal?: () => void
 }
 
 const EcogestureList = ({
@@ -26,7 +26,7 @@ const EcogestureList = ({
   displaySelection,
   selectionTotal,
   selectionViewed,
-  handleReinitClick,
+  openResetEcogestureModal,
 }: EcogestureListProps) => {
   const { t } = useI18n()
   const navigate = useNavigate()
@@ -153,11 +153,11 @@ const EcogestureList = ({
         {displaySelection && continueSelection()}
       </div>
 
-      <div className="ecogesture-content">
+      <div role="list" className="ecogesture-content">
         {renderEcogestureContent()}
-        {!displaySelection && handleReinitClick && (
-          <Button onClick={handleReinitClick} className="btnSecondary">
-            {t('ecogesture.reinit')}
+        {!displaySelection && openResetEcogestureModal && (
+          <Button onClick={openResetEcogestureModal} className="btnSecondary">
+            {t('ecogesture.reset')}
           </Button>
         )}
       </div>
diff --git a/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap b/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap
index 73e301dfd68e276c7580c291e7a93f8ed16ec738..46e1c2cfb82a05bd3f88feb60eda3cca79fc1388 100644
--- a/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap
+++ b/src/components/Ecogesture/EcogestureList/__snapshots__/EcogestureList.spec.tsx.snap
@@ -42,6 +42,7 @@ exports[`EcogesturesList component should be rendered correctly 1`] = `
     </div>
     <div
       class="ecogesture-content"
+      role="list"
     >
       <mock-ecogesturecard
         ecogesture="[object Object]"
@@ -60,7 +61,7 @@ exports[`EcogesturesList component should be rendered correctly 1`] = `
         <span
           class="MuiButton-label"
         >
-          ecogesture.reinit
+          ecogesture.reset
         </span>
         <span
           class="MuiTouchRipple-root"
diff --git a/src/components/Ecogesture/EcogestureList/ecogestureList.scss b/src/components/Ecogesture/EcogestureList/ecogestureList.scss
index 0380ee61055442ed5baa898e1b1dad1e1bb217a8..ae851825811769e6c56536ee22d40ead6887b718 100644
--- a/src/components/Ecogesture/EcogestureList/ecogestureList.scss
+++ b/src/components/Ecogesture/EcogestureList/ecogestureList.scss
@@ -121,6 +121,10 @@ div.filter-menu {
   &.item-active {
     font-weight: 700;
   }
+  &:focus-visible {
+    outline: 2px solid $blue-accessibility;
+    outline-offset: 2px;
+  }
 }
 .filter-menu-icon {
   margin-left: auto;
diff --git a/src/components/Ecogesture/EcogestureModal/EcogestureModal.tsx b/src/components/Ecogesture/EcogestureModal/EcogestureModal.tsx
index ab7b5595c206e7bb4616f34ab170f7847df91e7c..1fbc1ff79d9b5a2caded8256875cd022f4492294 100644
--- a/src/components/Ecogesture/EcogestureModal/EcogestureModal.tsx
+++ b/src/components/Ecogesture/EcogestureModal/EcogestureModal.tsx
@@ -1,13 +1,12 @@
 import { Collapse } from '@material-ui/core'
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import IconButton from '@material-ui/core/IconButton'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import defaultIcon from 'assets/icons/visu/ecogesture/default.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import useExploration from 'components/Hooks/useExploration'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { Ecogesture } from 'models'
 import React, { useEffect, useState } from 'react'
 import { useAppSelector } from 'store/hooks'
@@ -66,13 +65,12 @@ const EcogestureModal = ({
           ? t('ecogesture_modal.accessibility.window_title_action')
           : t('ecogesture_modal.accessibility.window_title_ecogesture')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('ecogesture_modal.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="em-header text-14-normal-uppercase">
         {isAction
           ? t('ecogesture_modal.title_action')
diff --git a/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.spec.tsx b/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.spec.tsx
index 2ca68993812bf704ba4c9caa6ca2024f649beb1b..7ae9d83388a642af0afa226befd9d44c17467d89 100644
--- a/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.spec.tsx
+++ b/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.spec.tsx
@@ -14,7 +14,7 @@ jest.mock('components/Header/CozyBar', () => 'mock-cozybar')
 jest.mock('components/Content/Content', () => 'mock-content')
 
 describe('EcogestureNotFound component', () => {
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <EcogestureNotFound text="test" returnPage="ecogestures" />
     )
diff --git a/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.tsx b/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.tsx
index c4bf6436168bc290dd586869332eacff4c980af0..21b5aab6c5e80b04456b4d1decfd82c241e7dde2 100644
--- a/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.tsx
+++ b/src/components/Ecogesture/EcogestureNotFound/EcogestureNotFound.tsx
@@ -4,7 +4,7 @@ import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import Content from 'components/Content/Content'
 import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './ecogestureNotFound.scss'
@@ -29,7 +29,6 @@ const EcogestureNotFound = ({
 
           <div className="text-18-bold head">{text}</div>
           <Button
-            aria-label={t('error_page.back')}
             onClick={() => navigate(`/${returnPage}`)}
             className="btnPrimary"
           >
diff --git a/src/components/Ecogesture/EcogestureNotFound/__snapshots__/EcogestureNotFound.spec.tsx.snap b/src/components/Ecogesture/EcogestureNotFound/__snapshots__/EcogestureNotFound.spec.tsx.snap
index c6390dcbde7545e575c73c7134cb4eac3b4bc6a4..bc2f4b297e7baf3862807c12a31ec31424b98761 100644
--- a/src/components/Ecogesture/EcogestureNotFound/__snapshots__/EcogestureNotFound.spec.tsx.snap
+++ b/src/components/Ecogesture/EcogestureNotFound/__snapshots__/EcogestureNotFound.spec.tsx.snap
@@ -28,7 +28,6 @@ exports[`EcogestureNotFound component should be rendered correctly 1`] = `
         test
       </div>
       <button
-        aria-label="error_page.back"
         class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
         tabindex="0"
         type="button"
diff --git a/src/components/Ecogesture/EcogestureReinitModal/EcogestureReinitModal.spec.tsx b/src/components/Ecogesture/EcogestureReinitModal/EcogestureReinitModal.spec.tsx
deleted file mode 100644
index a37d0c48f64a214b5eddc8553bfaa81331dc50c6..0000000000000000000000000000000000000000
--- a/src/components/Ecogesture/EcogestureReinitModal/EcogestureReinitModal.spec.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { render } from '@testing-library/react'
-import React from 'react'
-import EcogestureReinitModal from './EcogestureReinitModal'
-
-describe('EcogestureReinitModal component', () => {
-  it('should be rendered correctly', async () => {
-    const { baseElement } = render(
-      <EcogestureReinitModal
-        open={true}
-        handleCloseClick={jest.fn()}
-        handleLaunchReinit={jest.fn()}
-      />
-    )
-    expect(baseElement).toMatchSnapshot()
-  })
-})
diff --git a/src/components/Ecogesture/EcogestureReinitModal/EcogestureReinitModal.tsx b/src/components/Ecogesture/EcogestureReinitModal/EcogestureReinitModal.tsx
deleted file mode 100644
index 6fa3b3934dffa31e4bf02f7c1c259422ae54c2d9..0000000000000000000000000000000000000000
--- a/src/components/Ecogesture/EcogestureReinitModal/EcogestureReinitModal.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import { Button, IconButton } from '@material-ui/core'
-import Dialog from '@material-ui/core/Dialog'
-import CloseIcon from 'assets/icons/ico/close.svg'
-import warningIcon from 'assets/icons/ico/warn-orange.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
-import React from 'react'
-import './ecogestureReinitModal.scss'
-
-interface EcogestureReinitModalProps {
-  open: boolean
-  handleCloseClick: () => void
-  handleLaunchReinit: () => void
-}
-
-const EcogestureReinitModal = ({
-  open,
-  handleCloseClick,
-  handleLaunchReinit,
-}: EcogestureReinitModalProps) => {
-  const { t } = useI18n()
-  return (
-    <Dialog
-      open={open}
-      onClose={handleCloseClick}
-      aria-labelledby="accessibility-title"
-      classes={{
-        root: 'modal-root',
-        paper: 'modal-paper',
-      }}
-    >
-      <div id="accessibility-title">
-        {t('feedback.accessibility.window_title')}
-      </div>
-      <IconButton
-        aria-label={t('feedback.accessibility.button_close')}
-        className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
-      <div className="eg-reinit-modal">
-        <Icon icon={warningIcon} size={63} />
-        <div className="title text-20-bold">
-          {t('ecogesture.reinitModal.title_part1')}
-          <span className="warn-title">
-            {t('ecogesture.reinitModal.title_part2')}
-          </span>
-          {t('ecogesture.reinitModal.title_part3')}
-          <span className="warn-title">
-            {t('ecogesture.reinitModal.title_part4')}
-          </span>
-          {t('ecogesture.reinitModal.title_part5')}
-          <span className="warn-title">
-            {t('ecogesture.reinitModal.title_part6')}
-          </span>
-        </div>
-        <div className="text-16-normal text">
-          {t('ecogesture.reinitModal.text1')}
-        </div>
-        <div className="text-16-bold text">
-          {t('ecogesture.reinitModal.text2')}
-        </div>
-        <div className="buttons-container">
-          <Button
-            aria-label={t('ecogesture.reinitModal.btn1')}
-            onClick={handleCloseClick}
-            className="btnSecondary"
-          >
-            {t('ecogesture.reinitModal.btn1')}
-          </Button>
-          <Button
-            aria-label={t('ecogesture.reinitModal.btn2')}
-            onClick={handleLaunchReinit}
-            className="btnPrimary"
-          >
-            {t('ecogesture.reinitModal.btn2')}
-          </Button>
-        </div>
-      </div>
-    </Dialog>
-  )
-}
-
-export default EcogestureReinitModal
diff --git a/src/components/Ecogesture/EcogestureResetModal/EcogestureResetModal.spec.tsx b/src/components/Ecogesture/EcogestureResetModal/EcogestureResetModal.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c19a04ed6a29efe0a5df3c71adfaf7212de62498
--- /dev/null
+++ b/src/components/Ecogesture/EcogestureResetModal/EcogestureResetModal.spec.tsx
@@ -0,0 +1,16 @@
+import { render } from '@testing-library/react'
+import React from 'react'
+import EcogestureResetModal from './EcogestureResetModal'
+
+describe('EcogestureResetModal component', () => {
+  it('should be rendered correctly', () => {
+    const { baseElement } = render(
+      <EcogestureResetModal
+        open={true}
+        closeEcogestureResetModal={jest.fn()}
+        handleConfirmReset={jest.fn()}
+      />
+    )
+    expect(baseElement).toMatchSnapshot()
+  })
+})
diff --git a/src/components/Ecogesture/EcogestureResetModal/EcogestureResetModal.tsx b/src/components/Ecogesture/EcogestureResetModal/EcogestureResetModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e579947e91aff6898c6f79ad8705dee790759e33
--- /dev/null
+++ b/src/components/Ecogesture/EcogestureResetModal/EcogestureResetModal.tsx
@@ -0,0 +1,77 @@
+import { Button } from '@material-ui/core'
+import Dialog from '@material-ui/core/Dialog'
+import CloseIcon from 'assets/icons/ico/close.svg'
+import warningIcon from 'assets/icons/ico/warn-orange.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import React from 'react'
+import './ecogestureResetModal.scss'
+
+interface EcogestureResetModalProps {
+  open: boolean
+  closeEcogestureResetModal: () => void
+  handleConfirmReset: () => void
+}
+
+const EcogestureResetModal = ({
+  open,
+  closeEcogestureResetModal,
+  handleConfirmReset,
+}: EcogestureResetModalProps) => {
+  const { t } = useI18n()
+  return (
+    <Dialog
+      open={open}
+      onClose={closeEcogestureResetModal}
+      aria-labelledby="accessibility-title"
+      classes={{
+        root: 'modal-root',
+        paper: 'modal-paper',
+      }}
+    >
+      <div id="accessibility-title">
+        {t('feedback.accessibility.window_title')}
+      </div>
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={closeEcogestureResetModal}
+        aria-label={t('feedback.accessibility.button_close')}
+        className="modal-paper-close-button"
+      />
+      <div className="eg-reset-modal">
+        <StyledIcon icon={warningIcon} size={63} />
+        <div className="title text-20-bold">
+          {t('ecogesture.resetModal.title_part1')}
+          <span className="warn-title">
+            {t('ecogesture.resetModal.title_part2')}
+          </span>
+          {t('ecogesture.resetModal.title_part3')}
+          <span className="warn-title">
+            {t('ecogesture.resetModal.title_part4')}
+          </span>
+          {t('ecogesture.resetModal.title_part5')}
+          <span className="warn-title">
+            {t('ecogesture.resetModal.title_part6')}
+          </span>
+        </div>
+        <div className="text-16-normal text">
+          {t('ecogesture.resetModal.text1')}
+        </div>
+        <div className="text-16-bold text">
+          {t('ecogesture.resetModal.text2')}
+        </div>
+        <div className="buttons-container">
+          <Button onClick={closeEcogestureResetModal} className="btnSecondary">
+            {t('ecogesture.resetModal.btn1')}
+          </Button>
+          <Button onClick={handleConfirmReset} className="btnPrimary">
+            {t('ecogesture.resetModal.btn2')}
+          </Button>
+        </div>
+      </div>
+    </Dialog>
+  )
+}
+
+export default EcogestureResetModal
diff --git a/src/components/Ecogesture/EcogestureReinitModal/__snapshots__/EcogestureReinitModal.spec.tsx.snap b/src/components/Ecogesture/EcogestureResetModal/__snapshots__/EcogestureResetModal.spec.tsx.snap
similarity index 83%
rename from src/components/Ecogesture/EcogestureReinitModal/__snapshots__/EcogestureReinitModal.spec.tsx.snap
rename to src/components/Ecogesture/EcogestureResetModal/__snapshots__/EcogestureResetModal.spec.tsx.snap
index 18d92802a010d3557aee5ec1a19713867e41f0d7..c8e3570d53e98a167adff9aed4a22ddd120af42e 100644
--- a/src/components/Ecogesture/EcogestureReinitModal/__snapshots__/EcogestureReinitModal.spec.tsx.snap
+++ b/src/components/Ecogesture/EcogestureResetModal/__snapshots__/EcogestureResetModal.spec.tsx.snap
@@ -1,6 +1,6 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`EcogestureReinitModal component should be rendered correctly 1`] = `
+exports[`EcogestureResetModal component should be rendered correctly 1`] = `
 <body
   style="padding-right: 0px; overflow: hidden;"
 >
@@ -47,6 +47,7 @@ exports[`EcogestureReinitModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -61,9 +62,10 @@ exports[`EcogestureReinitModal component should be rendered correctly 1`] = `
           />
         </button>
         <div
-          class="eg-reinit-modal"
+          class="eg-reset-modal"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="63"
             width="63"
@@ -75,40 +77,39 @@ exports[`EcogestureReinitModal component should be rendered correctly 1`] = `
           <div
             class="title text-20-bold"
           >
-            ecogesture.reinitModal.title_part1
+            ecogesture.resetModal.title_part1
             <span
               class="warn-title"
             >
-              ecogesture.reinitModal.title_part2
+              ecogesture.resetModal.title_part2
             </span>
-            ecogesture.reinitModal.title_part3
+            ecogesture.resetModal.title_part3
             <span
               class="warn-title"
             >
-              ecogesture.reinitModal.title_part4
+              ecogesture.resetModal.title_part4
             </span>
-            ecogesture.reinitModal.title_part5
+            ecogesture.resetModal.title_part5
             <span
               class="warn-title"
             >
-              ecogesture.reinitModal.title_part6
+              ecogesture.resetModal.title_part6
             </span>
           </div>
           <div
             class="text-16-normal text"
           >
-            ecogesture.reinitModal.text1
+            ecogesture.resetModal.text1
           </div>
           <div
             class="text-16-bold text"
           >
-            ecogesture.reinitModal.text2
+            ecogesture.resetModal.text2
           </div>
           <div
             class="buttons-container"
           >
             <button
-              aria-label="ecogesture.reinitModal.btn1"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
               tabindex="0"
               type="button"
@@ -116,14 +117,13 @@ exports[`EcogestureReinitModal component should be rendered correctly 1`] = `
               <span
                 class="MuiButton-label"
               >
-                ecogesture.reinitModal.btn1
+                ecogesture.resetModal.btn1
               </span>
               <span
                 class="MuiTouchRipple-root"
               />
             </button>
             <button
-              aria-label="ecogesture.reinitModal.btn2"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
               tabindex="0"
               type="button"
@@ -131,7 +131,7 @@ exports[`EcogestureReinitModal component should be rendered correctly 1`] = `
               <span
                 class="MuiButton-label"
               >
-                ecogesture.reinitModal.btn2
+                ecogesture.resetModal.btn2
               </span>
               <span
                 class="MuiTouchRipple-root"
diff --git a/src/components/Ecogesture/EcogestureReinitModal/ecogestureReinitModal.scss b/src/components/Ecogesture/EcogestureResetModal/ecogestureResetModal.scss
similarity index 94%
rename from src/components/Ecogesture/EcogestureReinitModal/ecogestureReinitModal.scss
rename to src/components/Ecogesture/EcogestureResetModal/ecogestureResetModal.scss
index d5f0ae349fb52fa9e1ccb1031db1ec374f864383..5b8d193b0808b173d131ff6e45684482c7ae2d69 100644
--- a/src/components/Ecogesture/EcogestureReinitModal/ecogestureReinitModal.scss
+++ b/src/components/Ecogesture/EcogestureResetModal/ecogestureResetModal.scss
@@ -1,6 +1,6 @@
 @import 'src/styles/base/color';
 
-.eg-reinit-modal {
+.eg-reset-modal {
   display: flex;
   flex-direction: column;
   gap: 1rem;
diff --git a/src/components/Ecogesture/EcogestureTabsView.tsx b/src/components/Ecogesture/EcogestureTabsView.tsx
index f968257255b60a1a1d08624853602f1be02a1dce..7b1ba5cb8c9ec07d7db39e18382d885e42c97532 100644
--- a/src/components/Ecogesture/EcogestureTabsView.tsx
+++ b/src/components/Ecogesture/EcogestureTabsView.tsx
@@ -5,7 +5,7 @@ import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { EcogestureTab } from 'enums'
 import { Ecogesture } from 'models'
 import React, { useCallback, useEffect, useMemo, useState } from 'react'
@@ -16,7 +16,7 @@ import { updateProfile } from 'store/profile/profile.slice'
 import EcogestureEmptyList from './EcogestureEmptyList/EcogestureEmptyList'
 import EcogestureInitModal from './EcogestureInitModal/EcogestureInitModal'
 import EcogestureList from './EcogestureList/EcogestureList'
-import EcogestureReinitModal from './EcogestureReinitModal/EcogestureReinitModal'
+import EcogestureResetModal from './EcogestureResetModal/EcogestureResetModal'
 import './ecogestureTabsView.scss'
 
 interface TabPanelProps {
@@ -37,6 +37,11 @@ const TabPanel = ({ children, tab, value }: TabPanelProps) => {
   )
 }
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/ecogestures
+ * http://ecolyo.cozy.tools:8080/#/ecogestures?tab=1
+ * http://ecolyo.cozy.tools:8080/#/ecogestures?tab=2
+ */
 const EcogestureTabsView = () => {
   const { t } = useI18n()
   const client = useClient()
@@ -46,60 +51,35 @@ const EcogestureTabsView = () => {
   const { profile, profileEcogesture, profileType } = useAppSelector(
     state => state.ecolyo
   )
-
-  const [tabValue, setTabValue] = useState<EcogestureTab>(
+  const [tabValue, setTabValue] = useState<EcogestureTab>(() =>
     tab ? parseInt(tab) : EcogestureTab.OBJECTIVE
   )
   const [isLoading, setIsLoading] = useState<boolean>(true)
-  const [allEcogestureList, setAllEcogestureList] = useState<Ecogesture[]>([])
-  const [doingEcogestureList, setDoingEcogestureList] = useState<Ecogesture[]>(
-    []
-  )
-  const [objectiveEcogestureList, setObjectiveEcogestureList] = useState<
-    Ecogesture[]
-  >([])
+  const [openEcResetModal, setOpenEcResetModal] = useState(false)
+  const [ecogestures, setEcogestures] = useState<Ecogesture[]>([])
   const [totalViewed, setTotalViewed] = useState<number>(0)
   const [totalAvailable, setTotalAvailable] = useState<number>(0)
-  const [openEcogestureInitModal, setOpenEcogestureInitModal] =
-    useState<boolean>(!profile.haveSeenEcogestureModal)
-  const [openEcogestureReinitModal, setOpenEcogestureReinitModal] =
-    useState<boolean>(false)
+
+  const objective = ecogestures.filter(({ objective }) => objective)
+  const doing = ecogestures.filter(({ doing }) => doing)
 
   const ecogestureService = useMemo(
     () => new EcogestureService(client),
     [client]
   )
 
-  const handleReinitClick = useCallback(() => {
-    setOpenEcogestureReinitModal(true)
-  }, [])
-
-  const handleLaunchForm = useCallback(async () => {
-    dispatch(updateProfile({ haveSeenEcogestureModal: true }))
-    setOpenEcogestureInitModal(false)
-    navigate('/ecogesture-form?modal=false')
-  }, [dispatch, navigate])
-
-  const handleCloseEcogestureInitModal = useCallback(async () => {
-    dispatch(updateProfile({ haveSeenEcogestureModal: true }))
-    setOpenEcogestureInitModal(false)
-  }, [dispatch])
+  const openResetEcogestureModal = () => setOpenEcResetModal(true)
+  const closeEcogestureResetModal = () => setOpenEcResetModal(false)
 
-  const handleLaunchReinit = useCallback(async () => {
-    setOpenEcogestureReinitModal(false)
+  const handleConfirmReset = useCallback(async () => {
+    closeEcogestureResetModal()
     setIsLoading(true)
-    const reset = await ecogestureService.reinitAllEcogestures()
-    if (reset) {
-      setOpenEcogestureReinitModal(false)
-      setIsLoading(false)
-      navigate('/ecogesture-form?modal=true')
-    }
+    const reset = await ecogestureService.resetAllEcogestures()
+    if (!reset) return
+    setIsLoading(false)
+    navigate('/ecogesture-form?modal=true')
   }, [ecogestureService, navigate])
 
-  const handleCloseEcogestureReinitModal = useCallback(() => {
-    setOpenEcogestureReinitModal(false)
-  }, [])
-
   const handleChange = useCallback(
     (event: React.ChangeEvent<object>, newValue: number) => {
       event.preventDefault()
@@ -114,9 +94,9 @@ const EcogestureTabsView = () => {
   const getTabLabel = useCallback(
     (tab: EcogestureTab) => {
       const tabCounts = {
-        [EcogestureTab.OBJECTIVE]: objectiveEcogestureList.length,
-        [EcogestureTab.DOING]: doingEcogestureList.length,
-        [EcogestureTab.ALL]: allEcogestureList.length,
+        [EcogestureTab.OBJECTIVE]: objective.length,
+        [EcogestureTab.DOING]: doing.length,
+        [EcogestureTab.ALL]: ecogestures.length,
       }
 
       return (
@@ -127,12 +107,7 @@ const EcogestureTabsView = () => {
         </>
       )
     },
-    [
-      allEcogestureList.length,
-      doingEcogestureList.length,
-      objectiveEcogestureList.length,
-      t,
-    ]
+    [doing.length, ecogestures.length, objective.length, t]
   )
 
   useEffect(() => {
@@ -148,29 +123,22 @@ const EcogestureTabsView = () => {
         dispatch(updateProfile({ ecogestureHash }))
       }
 
-      const availableList =
-        await ecogestureService.getEcogestureListByProfile(currentProfile)
-      const filteredList = availableList.filter(
-        ecogesture => ecogesture.viewedInSelection === false
-      )
-
-      if (subscribed && ecogestureList) {
-        const doing = ecogestureList.filter(
-          ecogesture => ecogesture.doing === true
-        )
-        const objective = ecogestureList.filter(
-          ecogesture => ecogesture.objective === true
+      if (ecogestureList) {
+        const availableList =
+          await ecogestureService.getEcogestureListByProfile(currentProfile)
+        const notViewedList = availableList.filter(
+          ecogesture => ecogesture.viewedInSelection === false
         )
-        setAllEcogestureList(ecogestureList)
-        setObjectiveEcogestureList(objective)
-        setDoingEcogestureList(doing)
+
+        setEcogestures(ecogestureList)
         setTotalAvailable(availableList.length)
-        setTotalViewed(availableList.length - filteredList.length)
+        setTotalViewed(availableList.length - notViewedList.length)
       }
+
       setIsLoading(false)
     }
 
-    loadEcogestures()
+    subscribed && loadEcogestures()
     return () => {
       subscribed = false
     }
@@ -183,6 +151,13 @@ const EcogestureTabsView = () => {
     ecogestureService,
   ])
 
+  const handleCloseInitModal = (redirect: boolean) => {
+    dispatch(updateProfile({ haveSeenEcogestureModal: true }))
+    if (redirect) {
+      navigate('/ecogesture-form?modal=false')
+    }
+  }
+
   return (
     <>
       <CozyBar titleKey="common.title_ecogestures" />
@@ -235,21 +210,20 @@ const EcogestureTabsView = () => {
           <>
             <TabPanel value={tabValue} tab={EcogestureTab.OBJECTIVE}>
               {profile.isProfileEcogestureCompleted &&
-                (totalAvailable === totalViewed &&
-                objectiveEcogestureList.length === 0 ? (
+                (totalAvailable === totalViewed && objective.length === 0 ? (
                   <EcogestureEmptyList
                     setTab={setTabValue}
                     isObjective={true}
                     isSelectionDone={true}
-                    handleReinitClick={handleReinitClick}
+                    openResetEcogestureModal={openResetEcogestureModal}
                   />
                 ) : (
                   <EcogestureList
-                    list={objectiveEcogestureList}
+                    list={objective}
                     displaySelection={totalAvailable !== totalViewed}
                     selectionTotal={totalAvailable}
                     selectionViewed={totalViewed}
-                    handleReinitClick={handleReinitClick}
+                    openResetEcogestureModal={openResetEcogestureModal}
                   />
                 ))}
               {!profile.isProfileEcogestureCompleted && (
@@ -257,28 +231,27 @@ const EcogestureTabsView = () => {
                   setTab={setTabValue}
                   isObjective={true}
                   isSelectionDone={false}
-                  handleReinitClick={handleReinitClick}
+                  openResetEcogestureModal={openResetEcogestureModal}
                 />
               )}
             </TabPanel>
 
             <TabPanel value={tabValue} tab={EcogestureTab.DOING}>
               {profile.isProfileEcogestureCompleted &&
-                (totalAvailable === totalViewed &&
-                doingEcogestureList.length === 0 ? (
+                (totalAvailable === totalViewed && doing.length === 0 ? (
                   <EcogestureEmptyList
                     setTab={setTabValue}
                     isObjective={false}
                     isSelectionDone={true}
-                    handleReinitClick={handleReinitClick}
+                    openResetEcogestureModal={openResetEcogestureModal}
                   />
                 ) : (
                   <EcogestureList
-                    list={doingEcogestureList}
+                    list={doing}
                     displaySelection={totalAvailable !== totalViewed}
                     selectionTotal={totalAvailable}
                     selectionViewed={totalViewed}
-                    handleReinitClick={handleReinitClick}
+                    openResetEcogestureModal={openResetEcogestureModal}
                   />
                 ))}
               {!profile.isProfileEcogestureCompleted && (
@@ -286,15 +259,15 @@ const EcogestureTabsView = () => {
                   setTab={setTabValue}
                   isObjective={false}
                   isSelectionDone={false}
-                  handleReinitClick={handleReinitClick}
+                  openResetEcogestureModal={openResetEcogestureModal}
                 />
               )}
             </TabPanel>
 
             <TabPanel value={tabValue} tab={EcogestureTab.ALL}>
-              {Boolean(allEcogestureList.length) && (
+              {Boolean(ecogestures.length) && (
                 <EcogestureList
-                  list={allEcogestureList}
+                  list={ecogestures}
                   displaySelection={false}
                   selectionTotal={totalAvailable}
                   selectionViewed={totalViewed}
@@ -303,18 +276,16 @@ const EcogestureTabsView = () => {
             </TabPanel>
           </>
         )}
-        {openEcogestureInitModal && (
-          <EcogestureInitModal
-            open={openEcogestureInitModal}
-            handleCloseClick={handleCloseEcogestureInitModal}
-            handleLaunchForm={handleLaunchForm}
-          />
-        )}
-        {openEcogestureReinitModal && (
-          <EcogestureReinitModal
-            open={openEcogestureReinitModal}
-            handleCloseClick={handleCloseEcogestureReinitModal}
-            handleLaunchReinit={handleLaunchReinit}
+        <EcogestureInitModal
+          open={!profile.haveSeenEcogestureModal}
+          onClose={() => handleCloseInitModal(false)}
+          onAccept={() => handleCloseInitModal(true)}
+        />
+        {openEcResetModal && (
+          <EcogestureResetModal
+            open={openEcResetModal}
+            closeEcogestureResetModal={closeEcogestureResetModal}
+            handleConfirmReset={handleConfirmReset}
           />
         )}
       </Content>
diff --git a/src/components/Ecogesture/SingleEcogestureView.tsx b/src/components/Ecogesture/SingleEcogestureView.tsx
index 3254cab1b5023afba53c6a495c5b653feb01ec27..9112bc8774e01b5f470f713a5b1e179064aea65c 100644
--- a/src/components/Ecogesture/SingleEcogestureView.tsx
+++ b/src/components/Ecogesture/SingleEcogestureView.tsx
@@ -14,8 +14,7 @@ import Header from 'components/Header/Header'
 import useExploration from 'components/Hooks/useExploration'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { Ecogesture } from 'models'
 import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import { useParams } from 'react-router-dom'
@@ -26,38 +25,36 @@ import { importIconById } from 'utils/utils'
 import EfficiencyRating from './EfficiencyRating/EfficiencyRating'
 import './singleEcogestureView.scss'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/ecogesture/ECOGESTURE0001
+ */
 const SingleEcogestureView = () => {
   const { t } = useI18n()
   const client = useClient()
+  const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
+  const { ecogestureID } = useParams<{ ecogestureID: string }>()
+  const [isLoading, setIsLoading] = useState<boolean>(true)
   const [ecogesture, setEcogesture] = useState<Ecogesture>()
   const [ecogestureIcon, setEcogestureIcon] = useState<string>('')
   const [showDetails, setShowDetails] = useState<boolean>(false)
-  const [isDoing, setIsDoing] = useState<boolean>(false)
-  const [isObjective, setIsObjective] = useState<boolean>(false)
-  const [isLoading, setIsLoading] = useState<boolean>(true)
-  const { ecogestureID } = useParams<{ ecogestureID: string }>()
+  const isDoing = ecogesture?.doing
+  const isObjective = ecogesture?.objective
 
   const ecogestureService = useMemo(
     () => new EcogestureService(client),
     [client]
   )
-  const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
   const [, setValidExploration] = useExploration()
 
   const updateEcogesture = useCallback(
     async (objective: boolean, doing: boolean) => {
       if (ecogesture) {
-        const updates: Ecogesture = {
+        const result = await ecogestureService.updateEcogesture({
           ...ecogesture,
           objective,
           doing,
-        }
-        const result = await ecogestureService.updateEcogesture(updates)
-        if (result) {
-          setIsObjective(result.objective)
-          setIsDoing(result.doing)
-          setEcogesture(result)
-        }
+        })
+        if (result) setEcogesture(result)
       }
     },
     [ecogesture, ecogestureService]
@@ -77,27 +74,23 @@ const SingleEcogestureView = () => {
       const data = await ecogestureService.getEcogesturesByIds([
         ecogestureID || '',
       ])
-      if (subscribed) {
-        if (data?.[0]) {
-          setEcogesture(data[0])
-          // Prevent case this key doesn't exist in doctype
-          setIsObjective(data[0].objective)
-          setIsDoing(data[0].doing)
-          const icon = await importIconById(data[0].id, 'ecogesture')
-          if (subscribed) {
-            setEcogestureIcon(icon || defaultIcon)
-            if (currentChallenge?.exploration.ecogesture_id === data[0]._id) {
-              setValidExploration(currentChallenge.exploration.id)
-            }
-          }
-        } else {
-          logApp.error(`Could not find ecogesture ${ecogestureID}`)
-          Sentry.captureException(new Error('Could not find ecogesture'))
+
+      if (data?.[0]) {
+        setEcogesture(data[0])
+        // Prevent case this key doesn't exist in doctype
+        const icon = await importIconById(data[0].id, 'ecogesture')
+
+        setEcogestureIcon(icon || defaultIcon)
+        if (currentChallenge?.exploration.ecogesture_id === data[0]._id) {
+          setValidExploration(currentChallenge.exploration.id)
         }
-        setIsLoading(false)
+      } else {
+        logApp.error(`Could not find ecogesture ${ecogestureID}`)
+        Sentry.captureException(new Error('Could not find ecogesture'))
       }
+      setIsLoading(false)
     }
-    getSingleEcogesture()
+    subscribed && getSingleEcogesture()
 
     return () => {
       subscribed = false
@@ -118,94 +111,99 @@ const SingleEcogestureView = () => {
         displayBackArrow={true}
       />
       <Content>
-        {isLoading && (
-          <div className="loaderContainer">
-            <Loader />
-          </div>
-        )}
-        {!isLoading && !ecogesture && (
-          <ErrorPage
-            text={t('error_page.no_ecogesture')}
-            returnPage="ecogestures"
-          />
-        )}
-        {!isLoading && ecogesture && (
-          <div className="single-ecogesture">
-            <div className="icon-container">
-              {ecogestureIcon && (
-                <StyledIcon
-                  className="icon-big"
-                  icon={ecogestureIcon}
-                  size={220}
-                />
-              )}
+        <div className="content-wrapper">
+          {isLoading && (
+            <div className="loaderContainer">
+              <Loader />
             </div>
-            <div className="details">
-              <div className="text-22-bold title">{ecogesture.shortName}</div>
-              <div className="efficiency">
-                <span className="text-14-normal">
-                  {t('ecogesture_modal.efficiency')}
-                </span>
-                <EfficiencyRating result={Math.round(ecogesture.efficiency)} />
+          )}
+          {!isLoading && !ecogesture && (
+            <ErrorPage
+              text={t('error_page.no_ecogesture')}
+              returnPage="ecogestures"
+            />
+          )}
+          {!isLoading && ecogesture && (
+            <div className="single-ecogesture">
+              <div className="icon-container">
+                {ecogestureIcon && (
+                  <StyledIcon
+                    className="icon-big"
+                    icon={ecogestureIcon}
+                    size={220}
+                  />
+                )}
               </div>
-            </div>
-            <div className="styled-container">
-              <div className="long-name text-18-bold">
-                {ecogesture.longName}
+              <div className="details">
+                <div className="text-22-bold title">{ecogesture.shortName}</div>
+                <div className="efficiency">
+                  <span className="text-14-normal">
+                    {t('ecogesture_modal.efficiency')}
+                  </span>
+                  <EfficiencyRating
+                    result={Math.round(ecogesture.efficiency)}
+                  />
+                </div>
               </div>
-              <Button
-                classes={{
-                  root: 'btnText showMore',
-                  label: 'text-15-normal',
-                }}
-                onClick={() => setShowDetails(prev => !prev)}
-              >
-                {t(`ecogesture_modal.show_${showDetails ? 'less' : 'more'}`)}
-              </Button>
-
-              <Collapse in={showDetails}>
-                <div className="longDescription text-16-normal-150">
-                  {ecogesture.longDescription}
+              <div className="styled-container">
+                <div className="long-name text-18-bold">
+                  {ecogesture.longName}
                 </div>
-              </Collapse>
-            </div>
+                <Button
+                  classes={{
+                    root: 'btnText showMore',
+                    label: 'text-15-normal',
+                  }}
+                  onClick={() => setShowDetails(prev => !prev)}
+                >
+                  {t(`ecogesture_modal.show_${showDetails ? 'less' : 'more'}`)}
+                </Button>
 
-            <div className="buttons-selection">
-              <IconButton
-                aria-label={t('ecogesture.objective')}
-                onClick={toggleObjective}
-                classes={{
-                  root: `btnSecondary objective-btn ${isObjective && 'active'}`,
-                  label: 'text-15-normal',
-                }}
-              >
-                <Icon
-                  className="status-icon"
-                  icon={
-                    isObjective ? objectiveEnabledIcon : objectiveDisabledIcon
-                  }
-                  size={40}
-                />
-                <span>{t('ecogesture.objective')}</span>
-              </IconButton>
-              <IconButton
-                aria-label={t('ecogesture.doing')}
-                onClick={toggleDoing}
-                classes={{
-                  root: `btnSecondary doing-btn ${isDoing && 'active'}`,
-                  label: 'text-15-normal',
-                }}
-              >
-                <Icon
-                  className="status-icon"
-                  icon={isDoing ? doingEnabledIcon : doingDisabledIcon}
-                  size={40}
-                />
-                <span>{t('ecogesture.doing')}</span>
-              </IconButton>
+                <Collapse in={showDetails} timeout={300}>
+                  <div className="longDescription text-16-normal-150">
+                    {ecogesture.longDescription}
+                  </div>
+                </Collapse>
+              </div>
+              <div className="buttons-selection">
+                <IconButton
+                  aria-label={t('ecogesture.objective')}
+                  onClick={toggleObjective}
+                  classes={{
+                    root: `btnSecondary objective-btn ${
+                      isObjective && 'active'
+                    }`,
+                    label: 'text-15-normal',
+                  }}
+                >
+                  <StyledIcon
+                    className="status-icon"
+                    icon={
+                      isObjective ? objectiveEnabledIcon : objectiveDisabledIcon
+                    }
+                    size={40}
+                  />
+                  <span>{t('ecogesture.objective')}</span>
+                </IconButton>
+                <IconButton
+                  aria-label={t('ecogesture.doing')}
+                  onClick={toggleDoing}
+                  classes={{
+                    root: `btnSecondary doing-btn ${isDoing && 'active'}`,
+                    label: 'text-15-normal',
+                  }}
+                >
+                  <StyledIcon
+                    className="status-icon"
+                    icon={isDoing ? doingEnabledIcon : doingDisabledIcon}
+                    size={40}
+                  />
+                  <span>{t('ecogesture.doing')}</span>
+                </IconButton>
+              </div>
             </div>
-          </div>
-        )}
+          )}
+        </div>
       </Content>
     </>
   )
diff --git a/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap
index 7ccd151382e3967c0377207e3fe1b6bf5c066cc7..e1aeb701831ac33e157476bf3a59781392e6d98b 100644
--- a/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap
+++ b/src/components/Ecogesture/__snapshots__/EcogestureTabsView.spec.tsx.snap
@@ -126,7 +126,6 @@ exports[`EcogestureView component should be rendered correctly with 3 clickable
             class="buttons"
           >
             <button
-              aria-label="ecogesture.emptyList.btn1"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
               tabindex="0"
               type="button"
@@ -138,7 +137,6 @@ exports[`EcogestureView component should be rendered correctly with 3 clickable
               </span>
             </button>
             <button
-              aria-label="ecogesture.emptyList.btn2"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
               tabindex="0"
               type="button"
@@ -189,7 +187,6 @@ exports[`EcogestureView component should be rendered correctly with 3 clickable
             class="buttons"
           >
             <button
-              aria-label="ecogesture.emptyList.btn1"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
               tabindex="0"
               type="button"
@@ -201,7 +198,6 @@ exports[`EcogestureView component should be rendered correctly with 3 clickable
               </span>
             </button>
             <button
-              aria-label="ecogesture.emptyList.btn2"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
               tabindex="0"
               type="button"
diff --git a/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap b/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap
index e035305baaeb0458c5215c6fdfcca0a0defea995..059d02251fb883ddcbd96e53b40abcf77001a063 100644
--- a/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap
+++ b/src/components/Ecogesture/__snapshots__/SingleEcogestureView.spec.tsx.snap
@@ -12,130 +12,136 @@ exports[`SingleEcogesture component should be rendered correctly 1`] = `
   />
   <mock-content>
     <div
-      class="single-ecogesture"
+      class="content-wrapper"
     >
       <div
-        class="icon-container"
-      >
-        <svg
-          aria-hidden="true"
-          class="icon-big styles__icon___23x3R"
-          height="220"
-          width="220"
-        >
-          <use
-            xlink:href="#test-file-stub"
-          />
-        </svg>
-      </div>
-      <div
-        class="details"
+        class="single-ecogesture"
       >
         <div
-          class="text-22-bold title"
+          class="icon-container"
         >
-          Bonhomme de neige
+          <svg
+            aria-hidden="true"
+            class="icon-big styles__icon___23x3R"
+            height="220"
+            width="220"
+          >
+            <use
+              xlink:href="#test-file-stub"
+            />
+          </svg>
         </div>
         <div
-          class="efficiency"
+          class="details"
         >
-          <span
-            class="text-14-normal"
+          <div
+            class="text-22-bold title"
+          >
+            Bonhomme de neige
+          </div>
+          <div
+            class="efficiency"
           >
-            ecogesture_modal.efficiency
-          </span>
-          <mock-efficiencyrating
-            result="4"
-          />
+            <span
+              class="text-14-normal"
+            >
+              ecogesture_modal.efficiency
+            </span>
+            <mock-efficiencyrating
+              result="4"
+            />
+          </div>
         </div>
-      </div>
-      <div
-        class="styled-container"
-      >
         <div
-          class="long-name text-18-bold"
-        >
-          Je baisse le chauffage en mode hors gel lorsque je m'absente plus de 2 jours.
-        </div>
-        <button
-          class="MuiButtonBase-root MuiButton-root btnText showMore MuiButton-text"
-          tabindex="0"
-          type="button"
+          class="styled-container"
         >
-          <span
-            class="MuiButton-label text-15-normal"
+          <div
+            class="long-name text-18-bold"
           >
-            ecogesture_modal.show_more
-          </span>
-        </button>
-        <div
-          class="MuiCollapse-root MuiCollapse-hidden"
-          style="min-height: 0px;"
-        >
+            Je baisse le chauffage en mode hors gel lorsque je m'absente plus de 2 jours.
+          </div>
+          <button
+            class="MuiButtonBase-root MuiButton-root btnText showMore MuiButton-text"
+            tabindex="0"
+            type="button"
+          >
+            <span
+              class="MuiButton-label text-15-normal"
+            >
+              ecogesture_modal.show_more
+            </span>
+          </button>
           <div
-            class="MuiCollapse-wrapper"
+            class="MuiCollapse-root MuiCollapse-hidden"
+            style="min-height: 0px;"
           >
             <div
-              class="MuiCollapse-wrapperInner"
+              class="MuiCollapse-wrapper"
             >
               <div
-                class="longDescription text-16-normal-150"
+                class="MuiCollapse-wrapperInner"
               >
-                On se demande parfois si cela vaut le coup de "couper le chauffage" quand on s’absente… dès qu’il s’agit d’un week-end la réponse est « oui sûrement » ! Attention cependant au retour à ne pas faire de la surchauffe ! L’idéal est bien évidemment de régler sa programmation pour que le chauffage se relance quelques heures avant votre retour…
+                <div
+                  class="longDescription text-16-normal-150"
+                >
+                  On se demande parfois si cela vaut le coup de "couper le chauffage" quand on s’absente… dès qu’il s’agit d’un week-end la réponse est « oui sûrement » ! Attention cependant au retour à ne pas faire de la surchauffe ! L’idéal est bien évidemment de régler sa programmation pour que le chauffage se relance quelques heures avant votre retour…
+                </div>
               </div>
             </div>
           </div>
         </div>
-      </div>
-      <div
-        class="buttons-selection"
-      >
-        <button
-          aria-label="ecogesture.objective"
-          class="MuiButtonBase-root MuiIconButton-root btnSecondary objective-btn false"
-          tabindex="0"
-          type="button"
+        <div
+          class="buttons-selection"
         >
-          <span
-            class="MuiIconButton-label text-15-normal"
+          <button
+            aria-label="ecogesture.objective"
+            class="MuiButtonBase-root MuiIconButton-root btnSecondary objective-btn false"
+            tabindex="0"
+            type="button"
           >
-            <svg
-              class="status-icon styles__icon___23x3R"
-              height="40"
-              width="40"
+            <span
+              class="MuiIconButton-label text-15-normal"
             >
-              <use
-                xlink:href="#test-file-stub"
-              />
-            </svg>
-            <span>
-              ecogesture.objective
+              <svg
+                aria-hidden="true"
+                class="status-icon styles__icon___23x3R"
+                height="40"
+                width="40"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              <span>
+                ecogesture.objective
+              </span>
             </span>
-          </span>
-        </button>
-        <button
-          aria-label="ecogesture.doing"
-          class="MuiButtonBase-root MuiIconButton-root btnSecondary doing-btn false"
-          tabindex="0"
-          type="button"
-        >
-          <span
-            class="MuiIconButton-label text-15-normal"
+          </button>
+          <button
+            aria-label="ecogesture.doing"
+            class="MuiButtonBase-root MuiIconButton-root btnSecondary doing-btn false"
+            tabindex="0"
+            type="button"
           >
-            <svg
-              class="status-icon styles__icon___23x3R"
-              height="40"
-              width="40"
+            <span
+              class="MuiIconButton-label text-15-normal"
             >
-              <use
-                xlink:href="#test-file-stub"
-              />
-            </svg>
-            <span>
-              ecogesture.doing
+              <svg
+                aria-hidden="true"
+                class="status-icon styles__icon___23x3R"
+                height="40"
+                width="40"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              <span>
+                ecogesture.doing
+              </span>
             </span>
-          </span>
-        </button>
+          </button>
+        </div>
       </div>
     </div>
   </mock-content>
diff --git a/src/components/Ecogesture/singleEcogestureView.scss b/src/components/Ecogesture/singleEcogestureView.scss
index 6eb19b4f1d16fda689603dc88d9304aed75d10ce..3f8904c15209e0b1c490c757e85e28ed4c637dae 100644
--- a/src/components/Ecogesture/singleEcogestureView.scss
+++ b/src/components/Ecogesture/singleEcogestureView.scss
@@ -1,110 +1,117 @@
 @import 'src/styles/base/color';
 
-.single-ecogesture {
-  color: $grey-bright;
+.content-wrapper {
   display: flex;
-  flex-direction: column;
   align-items: center;
   justify-content: center;
-  padding: 1rem 1.2rem;
-  .icon-container {
-    margin: auto;
-    max-width: 180px;
-    width: 100%;
+  flex-direction: column;
+  height: 100%;
+  .single-ecogesture {
+    color: $grey-bright;
     display: flex;
-    .icon-big {
-      margin: auto;
-    }
-  }
-  .details {
     flex-direction: column;
-    display: flex;
     align-items: center;
-    gap: 0.5rem;
-    .title {
-      color: $soft-grey;
+    justify-content: center;
+    padding: 1rem 1.2rem;
+    .icon-container {
+      margin: auto;
+      max-width: 180px;
+      width: 100%;
+      display: flex;
+      .icon-big {
+        margin: auto;
+      }
     }
-    .efficiency {
+    .details {
+      flex-direction: column;
       display: flex;
+      align-items: center;
       gap: 0.5rem;
-    }
-  }
-  .styled-container {
-    line-height: 150%;
-    padding: 1rem;
-    margin: 1.5rem 0 1rem;
-    max-width: 500px;
-    display: flex;
-    flex-direction: column;
-    .long-name {
-      text-align: center;
-      color: white;
-    }
-
-    .showMore {
-      margin: auto;
-      text-align: center;
-      text-decoration: underline;
-      margin-top: 1.5rem;
-      span {
-        text-transform: none;
+      .title {
+        color: $soft-grey;
       }
-    }
-    .longDescription {
-      margin: 1em 0.5rem;
-      text-align: left;
-    }
-  }
-  .buttons-selection {
-    width: 100%;
-    display: flex;
-    gap: 0.5rem;
-    justify-content: center;
-    button {
-      &.btnSecondary {
-        height: 45px;
-        max-width: 160px;
-        width: 100%;
-        border-radius: 4px;
+      .efficiency {
+        display: flex;
+        gap: 0.5rem;
       }
     }
-    .objective-btn {
-      span {
-        color: $grey-bright;
+    .styled-container {
+      line-height: 150%;
+      padding: 1rem;
+      margin: 1.5rem 0 1rem;
+      max-width: 500px;
+      display: flex;
+      flex-direction: column;
+      .long-name {
+        text-align: center;
+        color: white;
       }
-      &.active {
-        background: radial-gradient(
-            105.25% 64.58% at 49.68% 70.83%,
-            rgba(12, 44, 91, 0.5) 0%,
-            rgba(255, 255, 255, 0) 100%
-          ),
-          #4470b3;
-        border-color: transparent;
+
+      .showMore {
+        margin: auto;
+        text-align: center;
+        text-decoration: underline;
+        margin-top: 1.5rem;
         span {
-          color: white;
+          text-transform: none;
         }
       }
+      .longDescription {
+        margin: 1em 0.5rem;
+        text-align: left;
+      }
     }
-    .doing-btn {
-      span {
-        color: $grey-bright;
+    .buttons-selection {
+      width: 100%;
+      display: flex;
+      gap: 0.5rem;
+      justify-content: center;
+      button {
+        &.btnSecondary {
+          height: 45px;
+          max-width: 160px;
+          width: 100%;
+          border-radius: 4px;
+        }
       }
-      &.active {
-        background: radial-gradient(
-            105.25% 64.58% at 49.68% 70.83%,
-            rgba(41, 87, 33, 0.5) 0%,
-            rgba(255, 255, 255, 0) 100%
-          ),
-          #21a90b;
-        border-color: transparent;
+      .objective-btn {
         span {
-          color: white;
+          color: $grey-bright;
+        }
+        &.active {
+          background: radial-gradient(
+              105.25% 64.58% at 49.68% 70.83%,
+              rgba(12, 44, 91, 0.5) 0%,
+              rgba(255, 255, 255, 0) 100%
+            ),
+            #4470b3;
+          border-color: transparent;
+          span {
+            color: white;
+          }
         }
       }
-    }
-    .MuiIconButton-label {
-      justify-content: flex-start;
-      color: white;
+      .doing-btn {
+        span {
+          color: $grey-bright;
+        }
+        &.active {
+          background: radial-gradient(
+              105.25% 64.58% at 49.68% 70.83%,
+              rgba(41, 87, 33, 0.5) 0%,
+              rgba(255, 255, 255, 0) 100%
+            ),
+            #21a90b;
+          border-color: transparent;
+          span {
+            color: white;
+          }
+        }
+      }
+      .MuiIconButton-label {
+        justify-content: flex-start;
+        color: white;
+      }
     }
   }
 }
diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx
index 2ad4b9d739e95b24815f3f3201351459419d3683..5c3111db45fee5fe8e898f9f7b8d4847276226f1 100644
--- a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx
+++ b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.spec.tsx
@@ -10,7 +10,7 @@ jest.mock('../EquipmentIcon/EquipmentIcon', () => 'mock-equipment-icon')
 
 describe('EcogestureFormEquipment component', () => {
   const store = createMockEcolyoStore()
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <EcogestureFormEquipment
@@ -34,14 +34,13 @@ describe('EcogestureFormEquipment component', () => {
       </Provider>
     )
     await waitFor(() => null, { container })
-    const equipments = screen.getAllByRole('button', {
-      name: 'ecogesture_profile.equipments.accessible_label',
-    })
+    const equipments = screen.getAllByRole('listitem')
+    console.log(equipments.length)
     expect(equipments[0]).not.toBeDisabled()
     expect(equipments.length).toBe(Object.keys(EquipmentType).length)
   })
 
-  it('should click on disabled back button', async () => {
+  it('should click on disabled back button', () => {
     const { container } = render(
       <Provider store={store}>
         <EcogestureFormEquipment
diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx
index 4852439abc3a8be68c3a3f3a5ac3afb51c3a4008..c494a3d6a6232813d3a0565477a6193cb32eff6a 100644
--- a/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx
+++ b/src/components/EcogestureForm/EcogestureFormEquipment/EcogestureFormEquipment.tsx
@@ -1,7 +1,7 @@
 import { IconButton } from '@material-ui/core'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { EcogestureStepForm, EquipmentType } from 'enums'
 import { ProfileEcogesture, ProfileType } from 'models'
 import React, { useCallback, useState } from 'react'
@@ -34,10 +34,6 @@ const EcogestureFormEquipment = ({
     isProfileEcogestureCompleted ? previousEquipments : []
   )
 
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
-
   const handleNext = useCallback(() => {
     if (setNextStepProfileForm && currentProfileType) {
       setNextStepProfileForm({
@@ -90,14 +86,21 @@ const EcogestureFormEquipment = ({
               ].toLowerCase()}.hint`
             )}
           </div>
-          <div className="icons-container">
+          <div
+            role="list"
+            aria-label={t('ecogesture_profile.equipments.accessible_label')}
+            className="icons-container"
+          >
             {Object.values(EquipmentType).map(equipment => (
               <IconButton
                 key={equipment}
                 style={{ borderRadius: '5px' }}
                 onClick={() => handleChange(equipment)}
                 className="checkbox-equipment"
-                aria-label={t('ecogesture_profile.equipments.accessible_label')}
+                role="listitem"
+                aria-label={`${t(
+                  `ecogesture_profile.equipments.${equipment.toLocaleLowerCase()}`
+                )}`}
               >
                 <EquipmentIcon
                   equipment={equipment}
@@ -109,7 +112,7 @@ const EcogestureFormEquipment = ({
         </div>
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disableNextButton={answer.length == 0}
         isLastStep={true}
diff --git a/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap b/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap
index 69febe91b1c98633b4b08d40e9cecfc9c52df63f..dec8909eb736b2c2810de3dc59dcccb8a9afefe7 100644
--- a/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap
+++ b/src/components/EcogestureForm/EcogestureFormEquipment/__snapshots__/EcogestureFormEquipment.spec.tsx.snap
@@ -19,11 +19,14 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
         ecogesture_profile.equipments.hint
       </div>
       <div
+        aria-label="ecogesture_profile.equipments.accessible_label"
         class="icons-container"
+        role="list"
       >
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.air_conditioning"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -41,8 +44,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.computer"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -60,8 +64,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.microwave"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -79,8 +84,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.washing_machine"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -98,8 +104,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.dishwasher"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -117,8 +124,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.cooking_plates"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -136,8 +144,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.dryer"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -155,8 +164,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.refregirator"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -174,8 +184,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.fan"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -193,8 +204,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.curtain"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -212,8 +224,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.internet_box"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -231,8 +244,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.ventilation"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -250,8 +264,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.freezer"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -269,8 +284,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.boiler"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -288,8 +304,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.hydraulic_heating"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
@@ -307,8 +324,9 @@ exports[`EcogestureFormEquipment component should be rendered correctly 1`] = `
           />
         </button>
         <button
-          aria-label="ecogesture_profile.equipments.accessible_label"
+          aria-label="ecogesture_profile.equipments.outside"
           class="MuiButtonBase-root MuiIconButton-root checkbox-equipment"
+          role="listitem"
           style="border-radius: 5px;"
           tabindex="0"
           type="button"
diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx
index ae223e032303b4dcde387af005696795ed5240cd..a60db8c120a72cd988cd862249a154a3137b604d 100644
--- a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx
+++ b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.spec.tsx
@@ -10,8 +10,8 @@ import { createMockEcolyoStore } from 'tests/__mocks__/store'
 import EcogestureFormSingleChoice from './EcogestureFormSingleChoice'
 
 jest.mock(
-  'components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal',
-  () => 'mock-ecogesturelaunchmodal'
+  'components/Ecogesture/EcogestureInitModal/EcogestureInitModal',
+  () => 'mock-ecogestureinitmodal'
 )
 
 const mockHandleNextStep = jest.fn()
@@ -19,7 +19,7 @@ const mockHandlePreviousStep = jest.fn()
 describe('EcogestureFormSingleChoice component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <EcogestureFormSingleChoice
@@ -76,7 +76,7 @@ describe('EcogestureFormSingleChoice component', () => {
     })
     expect(mockHandlePreviousStep).toHaveBeenCalledTimes(1)
   })
-  it('should keep previous answer', async () => {
+  it('should keep previous answer', () => {
     render(
       <Provider store={store}>
         <EcogestureFormSingleChoice
diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx
index 21401195fa52659828157655c6669b9c9e41c349..b1db42feb0ea402b60d3b8eb5f319d385464fb32 100644
--- a/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx
+++ b/src/components/EcogestureForm/EcogestureFormSingleChoice/EcogestureFormSingleChoice.tsx
@@ -1,7 +1,7 @@
 import classNames from 'classnames'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { EcogestureStepForm } from 'enums'
 import {
   ProfileEcogesture,
@@ -38,10 +38,6 @@ const EcogestureFormSingleChoice = ({
       : null
   )
 
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
-
   const handleNext = useCallback(() => {
     setNextStep({ ...currentProfileEcogesture, [answerType.attribute]: answer })
   }, [currentProfileEcogesture, setNextStep, answer, answerType.attribute])
@@ -54,10 +50,11 @@ const EcogestureFormSingleChoice = ({
             `ecogesture_form.${EcogestureStepForm[step].toLowerCase()}.question`
           )}
         </div>
-        {answerType.choices.map(value => {
+        {answerType.choices.map((value, index) => {
           if (value === null) return null
           return (
             <label
+              htmlFor={`answer-${index}`}
               key={value.toString()}
               className={classNames({
                 ['radio_short']: answerType.choices.length < 5,
@@ -66,9 +63,9 @@ const EcogestureFormSingleChoice = ({
               })}
             >
               <input
+                id={`answer-${index}`}
                 type="radio"
                 value={value}
-                name={value.toString()}
                 onChange={() => setAnswer(value)}
                 checked={answer === value}
                 className={answer === value ? 'checked-input' : ''}
@@ -83,7 +80,7 @@ const EcogestureFormSingleChoice = ({
         })}
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disablePrevButton={step === EcogestureStepForm.HEATING_TYPE}
         disableNextButton={answer === null}
diff --git a/src/components/EcogestureForm/EcogestureFormSingleChoice/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap b/src/components/EcogestureForm/EcogestureFormSingleChoice/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap
index cc1a100279b74d343909aae9111fc9fb8203cc6b..ec3bc7d2a14a67a8cf17ce3f3d48449d466b2b6d 100644
--- a/src/components/EcogestureForm/EcogestureFormSingleChoice/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap
+++ b/src/components/EcogestureForm/EcogestureFormSingleChoice/__snapshots__/EcogestureFormSingleChoice.spec.tsx.snap
@@ -15,11 +15,12 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] =
       </div>
       <label
         class="radio_short answer-checked"
+        for="answer-0"
       >
         <input
           checked=""
           class="checked-input"
-          name="individual"
+          id="answer-0"
           type="radio"
           value="individual"
         />
@@ -27,10 +28,11 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] =
       </label>
       <label
         class="radio_short"
+        for="answer-1"
       >
         <input
           class=""
-          name="collective"
+          id="answer-1"
           type="radio"
           value="collective"
         />
diff --git a/src/components/EcogestureForm/EcogestureFormView.spec.tsx b/src/components/EcogestureForm/EcogestureFormView.spec.tsx
index d3aac9ddd9e08290b52c0a27f5dc03d1ec67bb5f..82ec1fe642adf423f7ab5b75fac72f5635dbd77e 100644
--- a/src/components/EcogestureForm/EcogestureFormView.spec.tsx
+++ b/src/components/EcogestureForm/EcogestureFormView.spec.tsx
@@ -4,15 +4,15 @@ import React from 'react'
 import { Provider } from 'react-redux'
 import * as storeHooks from 'store/hooks'
 import { mockProfileEcogesture } from 'tests/__mocks__/profileEcogesture.mock'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockProfileState } from 'tests/__mocks__/store'
 import EcogestureFormView from './EcogestureFormView'
 
 jest.mock('components/Header/CozyBar', () => 'mock-cozybar')
 jest.mock('components/Header/Header', () => 'mock-header')
 jest.mock('components/Content/Content', () => 'mock-content')
 jest.mock(
-  'components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal',
-  () => 'mock-ecogesturelaunchmodal'
+  'components/Ecogesture/EcogestureInitModal/EcogestureInitModal',
+  () => 'mock-ecogestureinitmodal'
 )
 
 const mockAppDispatch = jest.spyOn(storeHooks, 'useAppDispatch')
@@ -31,7 +31,7 @@ describe('EcogestureFormView component', () => {
     jest.clearAllMocks()
   })
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <EcogestureFormView />
@@ -39,7 +39,7 @@ describe('EcogestureFormView component', () => {
     )
     expect(container).toMatchSnapshot()
   })
-  it('should render singleChoice', async () => {
+  it('should render singleChoice', () => {
     const { container } = render(
       <Provider store={store}>
         <EcogestureFormView />
@@ -49,9 +49,9 @@ describe('EcogestureFormView component', () => {
       container.getElementsByClassName('ecogesture-form-single').length
     ).toBeTruthy()
   })
-  it('should render profiletype form step because profiletype is completed', async () => {
+  it('should render profiletype form step because profiletype is completed', () => {
     const store = createMockEcolyoStore({
-      profile: { isProfileTypeCompleted: true },
+      profile: { ...mockProfileState, isProfileTypeCompleted: true },
       profileEcogesture: mockProfileEcogesture,
     })
     const { container } = render(
@@ -80,7 +80,7 @@ describe('EcogestureFormView component', () => {
     ).toBeTruthy()
   })
 
-  it('should handle form end', async () => {
+  it('should handle form end', () => {
     mockAppDispatch.mockReturnValue(jest.fn())
     jest
       .spyOn(React, 'useState')
diff --git a/src/components/EcogestureForm/EcogestureFormView.tsx b/src/components/EcogestureForm/EcogestureFormView.tsx
index 337592ae8141bb394a64e3f577b6c5ee1c384244..8f7a8303c242ae1b3c943bd219367f8f77ad4135 100644
--- a/src/components/EcogestureForm/EcogestureFormView.tsx
+++ b/src/components/EcogestureForm/EcogestureFormView.tsx
@@ -11,10 +11,13 @@ import ProfileEcogestureFormService from 'services/profileEcogestureForm.service
 import { useAppDispatch, useAppSelector } from 'store/hooks'
 import { updateProfile } from 'store/profile/profile.slice'
 import { newProfileEcogestureEntry } from 'store/profileEcogesture/profileEcogesture.slice'
+import EcogestureInitModal from '../Ecogesture/EcogestureInitModal/EcogestureInitModal'
 import EcogestureFormEquipment from './EcogestureFormEquipment/EcogestureFormEquipment'
 import EcogestureFormSingleChoice from './EcogestureFormSingleChoice/EcogestureFormSingleChoice'
-import EcogestureLaunchFormModal from './EcogestureLaunchFormModal/EcogestureLaunchFormModal'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/ecogesture-form
+ */
 const EcogestureFormView = () => {
   const navigate = useNavigate()
   const dispatch = useAppDispatch()
@@ -92,6 +95,14 @@ const EcogestureFormView = () => {
     return <ProfileTypeView />
   }
 
+  const handleCloseInitModal = (redirect: boolean) => {
+    setOpenLaunchModal(false)
+    dispatch(updateProfile({ haveSeenEcogestureModal: true }))
+    if (redirect) {
+      navigate('/ecogestures')
+    }
+  }
+
   return (
     <>
       <CozyBar titleKey="common.title_ecogestures" />
@@ -124,9 +135,10 @@ const EcogestureFormView = () => {
           </>
         )}
       </Content>
-      <EcogestureLaunchFormModal
+      <EcogestureInitModal
         open={openLaunchModal}
-        handleCloseClick={() => setOpenLaunchModal(false)}
+        onClose={() => handleCloseInitModal(true)}
+        onAccept={() => handleCloseInitModal(false)}
       />
     </>
   )
diff --git a/src/components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal.spec.tsx b/src/components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal.spec.tsx
deleted file mode 100644
index 23c3651722ed024a9587a7de8950a35c3174c697..0000000000000000000000000000000000000000
--- a/src/components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal.spec.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import { act, render, screen } from '@testing-library/react'
-import { userEvent } from '@testing-library/user-event'
-import React from 'react'
-import EcogestureLaunchFormModal from './EcogestureLaunchFormModal'
-
-const mockHandleClose = jest.fn()
-describe('EcogestureLaunchFormModal component', () => {
-  it('should be rendered correctly', () => {
-    const { baseElement } = render(
-      <EcogestureLaunchFormModal
-        open={true}
-        handleCloseClick={mockHandleClose}
-      />
-    )
-    expect(baseElement).toMatchSnapshot()
-  })
-  it('should close modal', async () => {
-    render(
-      <EcogestureLaunchFormModal
-        open={true}
-        handleCloseClick={mockHandleClose}
-      />
-    )
-    await act(async () => {
-      await userEvent.click(screen.getByText('ecogesture.initModal.btn2'))
-    })
-    expect(mockHandleClose).toHaveBeenCalledTimes(1)
-  })
-})
diff --git a/src/components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal.tsx b/src/components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal.tsx
deleted file mode 100644
index d7254529856ff6b6a18f6e67ee9ed18d0efe9f09..0000000000000000000000000000000000000000
--- a/src/components/EcogestureForm/EcogestureLaunchFormModal/EcogestureLaunchFormModal.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { Button, IconButton } from '@material-ui/core'
-import Dialog from '@material-ui/core/Dialog'
-import CloseIcon from 'assets/icons/ico/close.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
-import React from 'react'
-import './ecogestureLaunchFormModal.scss'
-
-interface EcogestureLaunchFormModalProps {
-  open: boolean
-  handleCloseClick: () => void
-}
-const EcogestureLaunchFormModal = ({
-  open,
-  handleCloseClick,
-}: EcogestureLaunchFormModalProps) => {
-  const { t } = useI18n()
-  return (
-    <Dialog
-      open={open}
-      onClose={handleCloseClick}
-      aria-labelledby="accessibility-title"
-      classes={{
-        root: 'modal-root',
-        paper: 'modal-paper',
-      }}
-    >
-      <div id="accessibility-title">
-        {t('feedback.accessibility.window_title')}
-      </div>
-      <IconButton
-        aria-label={t('feedback.accessibility.button_close')}
-        className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
-      <div className="eg-init-modal">
-        <div className="title text-20-bold">
-          {t('ecogesture.initModal.title')}
-        </div>
-        <div className="text-16-normal text">
-          {t('ecogesture.initModal.text3')}
-        </div>
-        <Button
-          aria-label={t('ecogesture.initModal.btn2')}
-          onClick={handleCloseClick}
-          className="btnPrimary"
-        >
-          {t('ecogesture.initModal.btn2')}
-        </Button>
-      </div>
-    </Dialog>
-  )
-}
-
-export default EcogestureLaunchFormModal
diff --git a/src/components/EcogestureForm/EcogestureLaunchFormModal/__snapshots__/EcogestureLaunchFormModal.spec.tsx.snap b/src/components/EcogestureForm/EcogestureLaunchFormModal/__snapshots__/EcogestureLaunchFormModal.spec.tsx.snap
deleted file mode 100644
index 2516ca2ce6b53497a0feee3ebf63e36e4f00bcda..0000000000000000000000000000000000000000
--- a/src/components/EcogestureForm/EcogestureLaunchFormModal/__snapshots__/EcogestureLaunchFormModal.spec.tsx.snap
+++ /dev/null
@@ -1,100 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`EcogestureLaunchFormModal component should be rendered correctly 1`] = `
-<body
-  style="padding-right: 0px; overflow: hidden;"
->
-  <div
-    aria-hidden="true"
-  />
-  <div
-    class="MuiDialog-root modal-root"
-    role="presentation"
-    style="position: fixed; z-index: 1300; right: 0px; bottom: 0px; top: 0px; left: 0px;"
-  >
-    <div
-      aria-hidden="true"
-      class="MuiBackdrop-root"
-      style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"
-    />
-    <div
-      data-test="sentinelStart"
-      tabindex="0"
-    />
-    <div
-      class="MuiDialog-container MuiDialog-scrollPaper"
-      role="none presentation"
-      style="opacity: 1; webkit-transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms; transition: opacity 225ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;"
-      tabindex="-1"
-    >
-      <div
-        aria-labelledby="accessibility-title"
-        class="MuiPaper-root MuiDialog-paper modal-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthSm MuiPaper-elevation24 MuiPaper-rounded"
-        role="dialog"
-      >
-        <div
-          id="accessibility-title"
-        >
-          feedback.accessibility.window_title
-        </div>
-        <button
-          aria-label="feedback.accessibility.button_close"
-          class="MuiButtonBase-root MuiIconButton-root modal-paper-close-button"
-          tabindex="0"
-          type="button"
-        >
-          <span
-            class="MuiIconButton-label"
-          >
-            <svg
-              class="styles__icon___23x3R"
-              height="16"
-              width="16"
-            >
-              <use
-                xlink:href="#test-file-stub"
-              />
-            </svg>
-          </span>
-          <span
-            class="MuiTouchRipple-root"
-          />
-        </button>
-        <div
-          class="eg-init-modal"
-        >
-          <div
-            class="title text-20-bold"
-          >
-            ecogesture.initModal.title
-          </div>
-          <div
-            class="text-16-normal text"
-          >
-            ecogesture.initModal.text3
-          </div>
-          <button
-            aria-label="ecogesture.initModal.btn2"
-            class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
-            tabindex="0"
-            type="button"
-          >
-            <span
-              class="MuiButton-label"
-            >
-              ecogesture.initModal.btn2
-            </span>
-            <span
-              class="MuiTouchRipple-root"
-            />
-          </button>
-        </div>
-      </div>
-    </div>
-    <div
-      data-test="sentinelEnd"
-      tabindex="0"
-    />
-  </div>
-</body>
-`;
diff --git a/src/components/EcogestureForm/EcogestureLaunchFormModal/ecogestureLaunchFormModal.scss b/src/components/EcogestureForm/EcogestureLaunchFormModal/ecogestureLaunchFormModal.scss
deleted file mode 100644
index cbbceeafb01e65e85a602d82ab98b821e1589047..0000000000000000000000000000000000000000
--- a/src/components/EcogestureForm/EcogestureLaunchFormModal/ecogestureLaunchFormModal.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-@import 'src/styles/base/color';
-
-.eg-init-modal {
-  display: flex;
-  flex-direction: column;
-  gap: 1rem;
-  .title {
-    text-align: center;
-    color: $gold-shadow;
-  }
-}
diff --git a/src/components/EcogestureForm/EquipmentIcon/EquipmentIcon.tsx b/src/components/EcogestureForm/EquipmentIcon/EquipmentIcon.tsx
index 56dc1a35b33e229c35992cc3bb8ea8f627265a9e..722454c44b281f8ce36f9de575199d22fe31ff59 100644
--- a/src/components/EcogestureForm/EquipmentIcon/EquipmentIcon.tsx
+++ b/src/components/EcogestureForm/EquipmentIcon/EquipmentIcon.tsx
@@ -1,6 +1,6 @@
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useEffect, useState } from 'react'
 import { importIconById } from 'utils/utils'
 
@@ -16,11 +16,11 @@ const EquipmentIcon = ({ equipment, isChecked }: EquipmentIconProps) => {
     let subscribed = true
     async function getIcon() {
       const svg = await importIconById(equipment, 'equipments')
-      if (subscribed && svg) {
+      if (svg) {
         setIcon(svg)
       }
     }
-    getIcon()
+    subscribed && getIcon()
     return () => {
       subscribed = false
     }
@@ -29,7 +29,7 @@ const EquipmentIcon = ({ equipment, isChecked }: EquipmentIconProps) => {
   return (
     <>
       <div className={`equipment-icon-container ${isChecked ? 'checked' : ''}`}>
-        <Icon icon={icon} size={40} className="equipmentIcon " />
+        <StyledIcon icon={icon} size={40} className="equipmentIcon " />
       </div>
       <div className="text text-14-normal">
         {t(`ecogesture_profile.equipments.${equipment.toLocaleLowerCase()}`)}
diff --git a/src/components/EcogestureForm/EquipmentIcon/__snapshots__/EquipmentIcon.spec.tsx.snap b/src/components/EcogestureForm/EquipmentIcon/__snapshots__/EquipmentIcon.spec.tsx.snap
index 342bc0c025ce91c3e8d85b98639d66b4aea0bde0..e38e50f3629f8aaa3a02280600add623fefc133a 100644
--- a/src/components/EcogestureForm/EquipmentIcon/__snapshots__/EquipmentIcon.spec.tsx.snap
+++ b/src/components/EcogestureForm/EquipmentIcon/__snapshots__/EquipmentIcon.spec.tsx.snap
@@ -6,6 +6,7 @@ exports[`EcogestureFormSingleChoice component should be rendered correctly 1`] =
     class="equipment-icon-container "
   >
     <svg
+      aria-hidden="true"
       class="equipmentIcon  styles__icon___23x3R"
       height="40"
       width="40"
diff --git a/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap b/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap
index 843e5be16fa4073f91f44198153361d2f5bec129..6cdf7d888e238978521d8866bff70a2f6883e4bf 100644
--- a/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap
+++ b/src/components/EcogestureForm/__snapshots__/EcogestureFormView.spec.tsx.snap
@@ -22,10 +22,11 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = `
         </div>
         <label
           class="radio_short"
+          for="answer-0"
         >
           <input
             class=""
-            name="individual"
+            id="answer-0"
             type="radio"
             value="individual"
           />
@@ -33,10 +34,11 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = `
         </label>
         <label
           class="radio_short"
+          for="answer-1"
         >
           <input
             class=""
-            name="collective"
+            id="answer-1"
             type="radio"
             value="collective"
           />
@@ -75,7 +77,7 @@ exports[`EcogestureFormView component should be rendered correctly 1`] = `
       </div>
     </div>
   </mock-content>
-  <mock-ecogesturelaunchmodal
+  <mock-ecogestureinitmodal
     open="true"
   />
 </div>
diff --git a/src/components/EcogestureSelection/EcogestureSelectionDetail/EcogestureSelectionDetail.tsx b/src/components/EcogestureSelection/EcogestureSelectionDetail/EcogestureSelectionDetail.tsx
index 6d53bb111c2198f3055ae2e954179ac2bae1ab6e..345d29eb709137a771d1e5b8d5054cd8d37f7d15 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionDetail/EcogestureSelectionDetail.tsx
+++ b/src/components/EcogestureSelection/EcogestureSelectionDetail/EcogestureSelectionDetail.tsx
@@ -3,8 +3,9 @@ import doingIcon from 'assets/icons/ico/doing-enabled.svg'
 import objectiveIcon from 'assets/icons/ico/objective-enabled.svg'
 import skipIcon from 'assets/icons/ico/skip-enabled.svg'
 import defaultIcon from 'assets/icons/visu/ecogesture/default.svg'
+import classNames from 'classnames'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { Ecogesture } from 'models'
 import React, { useEffect, useState } from 'react'
 import { importIconById } from 'utils/utils'
@@ -29,11 +30,9 @@ const EcogestureSelectionDetail = ({
     let subscribed = true
     async function getIcon() {
       const icon = await importIconById(ecogesture.id, 'ecogesture')
-      if (subscribed) {
-        setEcogestureIcon(icon || defaultIcon)
-      }
+      setEcogestureIcon(icon || defaultIcon)
     }
-    getIcon()
+    subscribed && getIcon()
     setShowDetails(false)
     return () => {
       subscribed = false
@@ -59,15 +58,18 @@ const EcogestureSelectionDetail = ({
           {t(`ecogesture_modal.show_${showDetails ? 'less' : 'more'}`)}
         </Button>
 
-        <Collapse in={showDetails} exit={false}>
-          <div className="longDescription text-16-normal-150">
+        <Collapse in={showDetails} exit={false} timeout={300}>
+          <div
+            className={classNames('longDescription text-16-normal-150', {
+              expanded: showDetails,
+            })}
+          >
             {ecogesture.longDescription}
           </div>
         </Collapse>
       </div>
       <div className="buttons">
         <Button
-          aria-label={t('ecogesture_selection.button_objective')}
           classes={{
             root: 'btnSecondary',
             label: 'text-14-bold',
@@ -78,7 +80,6 @@ const EcogestureSelectionDetail = ({
           {t('ecogesture_selection.button_objective')}
         </Button>
         <Button
-          aria-label={t('ecogesture_selection.button_doing')}
           classes={{
             root: 'btnSecondary',
             label: 'text-14-bold',
@@ -89,7 +90,6 @@ const EcogestureSelectionDetail = ({
           {t('ecogesture_selection.button_doing')}
         </Button>
         <Button
-          aria-label={t('ecogesture_selection.button_skip')}
           classes={{
             root: 'btnSecondary',
             label: 'text-14-bold',
diff --git a/src/components/EcogestureSelection/EcogestureSelectionDetail/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap b/src/components/EcogestureSelection/EcogestureSelectionDetail/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap
index bbd6adbd92d72288c227dec29d4990211f4e943e..8cf01231bcc3e1356f09dfd7252a97ad5d3fe0ab 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionDetail/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap
+++ b/src/components/EcogestureSelection/EcogestureSelectionDetail/__snapshots__/EcogestureSelectionDetail.spec.tsx.snap
@@ -69,7 +69,6 @@ exports[`EcogestureSelectionDetail component should be rendered correctly 1`] =
       class="buttons"
     >
       <button
-        aria-label="ecogesture_selection.button_objective"
         class="MuiButtonBase-root MuiButton-root btnSecondary MuiButton-text"
         tabindex="0"
         type="button"
@@ -94,7 +93,6 @@ exports[`EcogestureSelectionDetail component should be rendered correctly 1`] =
         />
       </button>
       <button
-        aria-label="ecogesture_selection.button_doing"
         class="MuiButtonBase-root MuiButton-root btnSecondary MuiButton-text"
         tabindex="0"
         type="button"
@@ -119,7 +117,6 @@ exports[`EcogestureSelectionDetail component should be rendered correctly 1`] =
         />
       </button>
       <button
-        aria-label="ecogesture_selection.button_skip"
         class="MuiButtonBase-root MuiButton-root btnSecondary MuiButton-text"
         tabindex="0"
         type="button"
diff --git a/src/components/EcogestureSelection/EcogestureSelectionDetail/ecogestureSelectionDetail.scss b/src/components/EcogestureSelection/EcogestureSelectionDetail/ecogestureSelectionDetail.scss
index 62a291ea844fbf09393241af8d7bb196163a8f39..3f01eb6b2a5d8e56f896fe40db0c594eadaea908 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionDetail/ecogestureSelectionDetail.scss
+++ b/src/components/EcogestureSelection/EcogestureSelectionDetail/ecogestureSelectionDetail.scss
@@ -4,20 +4,25 @@
 .eg-selection-detail-container {
   display: flex;
   flex-direction: column;
+  justify-content: space-between;
   text-align: center;
   color: $grey-bright;
-  padding: 0 1.5rem;
-  flex: 1;
-  max-height: calc(100vh - 60px - 72px - 0px);
+  padding: 0 1rem;
+  height: 100vh;
+  max-height: calc(100vh - 0px - 72px - 72px - 14px);
+  overflow-y: auto;
+
+  @media #{$tablet} {
+    max-height: calc(100vh - 60px - 72px - 72px - 14px);
+  }
+  @media #{$large-phone} {
+    max-height: calc(100vh - 60px - 72px - 0px - 14px);
+  }
 
   .content {
     display: flex;
-    gap: 0.5rem;
     flex-direction: column;
-    flex: 1;
-    justify-content: flex-start;
-    align-items: center;
-    overflow-y: auto;
+    gap: 0.5rem;
 
     .title {
       color: $soft-grey;
@@ -33,20 +38,28 @@
       text-decoration: underline;
       margin-top: 1rem;
       cursor: pointer;
+      flex-shrink: 0;
     }
 
     .longDescription {
       margin: 1rem 0.5rem;
       text-align: left;
+      display: none;
+      transition: height 0.3s ease-in-out;
+      &.expanded {
+        display: block;
+      }
     }
   }
+
   .buttons {
-    margin: 1rem 0;
+    padding: 1rem 0;
     display: flex;
     gap: 0.5rem;
-    flex-direction: row;
     justify-content: center;
     width: 100%;
+    background-color: $default-background;
+
     button.btnSecondary {
       padding: 0.75rem 0.25rem;
       height: 7.375rem;
@@ -56,5 +69,10 @@
         flex-direction: column;
       }
     }
+
+    @media (min-height: $height-small-phone) {
+      position: sticky;
+      bottom: 0;
+    }
   }
 }
diff --git a/src/components/EcogestureSelection/EcogestureSelectionEnd/EcogestureSelectionEnd.tsx b/src/components/EcogestureSelection/EcogestureSelectionEnd/EcogestureSelectionEnd.tsx
index 4c34e154dc4436f60394c156f4f71b1d8396fbb6..fb563b48597e377a92c8228325dadcffec9b8a80 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionEnd/EcogestureSelectionEnd.tsx
+++ b/src/components/EcogestureSelection/EcogestureSelectionEnd/EcogestureSelectionEnd.tsx
@@ -1,7 +1,7 @@
 import { Button } from '@material-ui/core'
 import icon from 'assets/icons/visu/profileType/finish.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './ecogestureSelectionEnd.scss'
diff --git a/src/components/EcogestureSelection/EcogestureSelectionModal/EcogestureSelectionModal.tsx b/src/components/EcogestureSelection/EcogestureSelectionModal/EcogestureSelectionModal.tsx
index b33c75ebb9b84f275d896bf0fd5cdaa407a47c08..8f647210a3e6255d94e970dd05f9521de05545a7 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionModal/EcogestureSelectionModal.tsx
+++ b/src/components/EcogestureSelection/EcogestureSelectionModal/EcogestureSelectionModal.tsx
@@ -1,8 +1,8 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './ecogestureSelectionModal.scss'
 
@@ -30,13 +30,12 @@ const EcogestureSelectionModal = ({
       <div id="accessibility-title">
         {t('ecogesture_selection.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('ecogesture_selection.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="eg-selection-modal">
         <div className="title text-20-bold">
           {t('ecogesture_selection.selectionModal.title')}
@@ -44,11 +43,7 @@ const EcogestureSelectionModal = ({
         <div className="text text-16-normal">
           {t('ecogesture_selection.selectionModal.text')}
         </div>
-        <Button
-          aria-label={t('ecogesture_selection.selectionModal.button_close')}
-          onClick={handleCloseClick}
-          className="btnPrimary"
-        >
+        <Button onClick={handleCloseClick} className="btnPrimary">
           {t('ecogesture_selection.selectionModal.button_close')}
         </Button>
       </div>
diff --git a/src/components/EcogestureSelection/EcogestureSelectionModal/__snapshots__/EcogestureSelectionModal.spec.tsx.snap b/src/components/EcogestureSelection/EcogestureSelectionModal/__snapshots__/EcogestureSelectionModal.spec.tsx.snap
index e51d81a0ecf1718cd6adf3bb6b96b7305fde85aa..d73e5d4fceded904e3ef5f6070dd589f7a199a51 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionModal/__snapshots__/EcogestureSelectionModal.spec.tsx.snap
+++ b/src/components/EcogestureSelection/EcogestureSelectionModal/__snapshots__/EcogestureSelectionModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`EcogestureInitModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -74,7 +75,6 @@ exports[`EcogestureInitModal component should be rendered correctly 1`] = `
             ecogesture_selection.selectionModal.text
           </div>
           <button
-            aria-label="ecogesture_selection.selectionModal.button_close"
             class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
             tabindex="0"
             type="button"
diff --git a/src/components/EcogestureSelection/EcogestureSelectionRestart/EcogestureSelectionRestart.tsx b/src/components/EcogestureSelection/EcogestureSelectionRestart/EcogestureSelectionRestart.tsx
index 45dbe9188676dce804ff0975923172fa9f159390..dce735deb7beb4037fd971f0ff31148973fa6210 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionRestart/EcogestureSelectionRestart.tsx
+++ b/src/components/EcogestureSelection/EcogestureSelectionRestart/EcogestureSelectionRestart.tsx
@@ -1,7 +1,7 @@
 import { Button } from '@material-ui/core'
 import icon from 'assets/icons/visu/ecogesture/ECOGESTURE0001.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './ecogestureSelectionRestart.scss'
diff --git a/src/components/EcogestureSelection/EcogestureSelectionView.tsx b/src/components/EcogestureSelection/EcogestureSelectionView.tsx
index 2231b9fad5dcebfd100e3cde624a67a7de318066..ed0ac295609916e361235b770bff6a781f8cd334 100644
--- a/src/components/EcogestureSelection/EcogestureSelectionView.tsx
+++ b/src/components/EcogestureSelection/EcogestureSelectionView.tsx
@@ -3,7 +3,7 @@ import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { Ecogesture } from 'models'
 import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
@@ -15,6 +15,9 @@ import EcogestureSelectionModal from './EcogestureSelectionModal/EcogestureSelec
 import EcogestureSelectionRestart from './EcogestureSelectionRestart/EcogestureSelectionRestart'
 import './ecogestureSelectionView.scss'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/ecogesture-selection
+ */
 const EcogestureSelectionView = () => {
   const { t } = useI18n()
   const client = useClient()
@@ -29,8 +32,7 @@ const EcogestureSelectionView = () => {
   const [ecogestureList, setEcogestureList] = useState<Ecogesture[]>([])
   const [totalViewed, setTotalViewed] = useState<number>(0)
   const [totalAvailable, setTotalAvailable] = useState<number>(0)
-  const [openEcogestureSelectionModal, setOpenEcogestureSelectionModal] =
-    useState(false)
+  const [openEcSelectionModal, setOpenEcSelectionModal] = useState(false)
 
   const ecogestureService = useMemo(
     () => new EcogestureService(client),
@@ -95,22 +97,21 @@ const EcogestureSelectionView = () => {
         ecogesture => ecogesture.viewedInSelection === false
       )
       const slicedFilteredList = filteredList.slice(0, 10)
-      if (subscribed) {
-        if (
-          availableList.length === slicedFilteredList.length &&
-          slicedFilteredList.length > 0
-        ) {
-          setOpenEcogestureSelectionModal(true)
-        }
-        setTotalAvailable(availableList.length)
-        setTotalViewed(availableList.length - filteredList.length)
-        setEcogestureList(slicedFilteredList)
-        setIndexEcogesture(0)
-        setIsLoading(false)
+
+      if (
+        availableList.length === slicedFilteredList.length &&
+        slicedFilteredList.length > 0
+      ) {
+        setOpenEcSelectionModal(true)
       }
+      setTotalAvailable(availableList.length)
+      setTotalViewed(availableList.length - filteredList.length)
+      setEcogestureList(slicedFilteredList)
+      setIndexEcogesture(0)
+      setIsLoading(false)
     }
 
-    getFilteredList()
+    subscribed && getFilteredList()
     return () => {
       subscribed = false
     }
@@ -168,10 +169,10 @@ const EcogestureSelectionView = () => {
         {!isLoading && (
           <>
             {renderEcogestureSelection()}
-            {openEcogestureSelectionModal && (
+            {openEcSelectionModal && (
               <EcogestureSelectionModal
-                open={openEcogestureSelectionModal}
-                handleCloseClick={() => setOpenEcogestureSelectionModal(false)}
+                open={openEcSelectionModal}
+                handleCloseClick={() => setOpenEcSelectionModal(false)}
               />
             )}
           </>
diff --git a/src/components/Exploration/ExplorationError.tsx b/src/components/Exploration/ExplorationError.tsx
index 4c75d0da78d8f1ffc524c2032fa7e6062e9b4607..04fb85ea6354871c9ee2938c2d1296ea42a8fa74 100644
--- a/src/components/Exploration/ExplorationError.tsx
+++ b/src/components/Exploration/ExplorationError.tsx
@@ -1,5 +1,5 @@
 import Button from '@material-ui/core/Button'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
 import './explorationError.scss'
diff --git a/src/components/Exploration/ExplorationFinished.tsx b/src/components/Exploration/ExplorationFinished.tsx
index 3bcce5d7650c1262d28dfa7a5f41277588c4c2e3..146e99d16bcb52180f77dfe86e788c73c25d5161 100644
--- a/src/components/Exploration/ExplorationFinished.tsx
+++ b/src/components/Exploration/ExplorationFinished.tsx
@@ -2,7 +2,7 @@ import Button from '@material-ui/core/Button'
 import starResult from 'assets/icons/visu/quiz/starResult.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag, UserExplorationState } from 'enums'
 import { UserChallenge } from 'models'
 import React, { useCallback } from 'react'
diff --git a/src/components/Exploration/ExplorationOngoing.tsx b/src/components/Exploration/ExplorationOngoing.tsx
index 347081ae2935b8ac21e527414341c2829c2d3059..ec408df24b094ec7591a5881a80fed33842fa0e0 100644
--- a/src/components/Exploration/ExplorationOngoing.tsx
+++ b/src/components/Exploration/ExplorationOngoing.tsx
@@ -3,7 +3,7 @@ import explorationIcon from 'assets/icons/visu/exploration/shield.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import StarsContainer from 'components/CommonKit/StarsContainer/StarsContainer'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import {
   UserChallengeUpdateFlag,
   UserExplorationState,
@@ -61,7 +61,7 @@ const ExplorationOngoing = ({ userChallenge }: ExplorationOngoingProps) => {
               {t('exploration.button_already_done')}
             </Button>
             <Button
-              aria-label={t('exploration.accessibility.button_already_done')}
+              aria-label={t('exploration.accessibility.button_come_back')}
               onClick={() => navigate(-1)}
               className="btnSecondary"
             >
@@ -85,26 +85,24 @@ const ExplorationOngoing = ({ userChallenge }: ExplorationOngoingProps) => {
   }
 
   return (
-    <>
-      <div className="exploration-container">
-        <div className="exploration-begin-container">
-          <StyledIcon
-            className="exploration-icon"
-            icon={explorationIcon}
-            size={180}
-          />
-          <StarsContainer
-            result={userChallenge.progress.explorationProgress}
-            isQuizBegin={true}
-          />
-          <div className="exploration-explanation text-18-bold">
-            <div>{userChallenge.exploration.description}</div>
-            <div>{userChallenge.exploration.complementary_description}</div>
-          </div>
-          {renderButton()}
+    <div className="exploration-container">
+      <div className="exploration-begin-container">
+        <StyledIcon
+          className="exploration-icon"
+          icon={explorationIcon}
+          size={180}
+        />
+        <StarsContainer
+          result={userChallenge.progress.explorationProgress}
+          isQuizBegin={true}
+        />
+        <div className="exploration-explanation text-18-bold">
+          <div>{userChallenge.exploration.description}</div>
+          <div>{userChallenge.exploration.complementary_description}</div>
         </div>
+        {renderButton()}
       </div>
-    </>
+    </div>
   )
 }
 
diff --git a/src/components/Exploration/ExplorationView.tsx b/src/components/Exploration/ExplorationView.tsx
index ccde8fdb71798e3b0d362c581504a822cdfee278..73e74e0c88baf985d9358ce3d122f0d235bd00cc 100644
--- a/src/components/Exploration/ExplorationView.tsx
+++ b/src/components/Exploration/ExplorationView.tsx
@@ -9,6 +9,9 @@ import ExplorationError from './ExplorationError'
 import ExplorationFinished from './ExplorationFinished'
 import ExplorationOngoing from './ExplorationOngoing'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/challenges/exploration
+ */
 const ExplorationView = () => {
   const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
 
diff --git a/src/components/Feedback/FeedbackModal.spec.tsx b/src/components/Feedback/FeedbackModal.spec.tsx
index d4b8e53a77fbdfcd0a68e8f904621914dbaef3c8..2444ef63d92c6c1c0a76635f7474c207172fc39e 100644
--- a/src/components/Feedback/FeedbackModal.spec.tsx
+++ b/src/components/Feedback/FeedbackModal.spec.tsx
@@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'
 import FeedbackModal from 'components/Feedback/FeedbackModal'
 import React from 'react'
 import { Provider } from 'react-redux'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockModalState } from 'tests/__mocks__/store'
 
 // Value coming from jest.config
 declare let __SAU_LINK__: string
@@ -17,7 +17,9 @@ jest.mock('services/environment.service', () => {
 jest.mock('components/Hooks/useExploration', () => () => ['', jest.fn()])
 
 describe('FeedbackModal component', () => {
-  const store = createMockEcolyoStore({ modal: { isFeedbacksOpen: true } })
+  const store = createMockEcolyoStore({
+    modal: { ...mockModalState, isFeedbacksOpen: true },
+  })
   beforeEach(() => {
     jest.clearAllMocks()
   })
diff --git a/src/components/Feedback/FeedbackModal.tsx b/src/components/Feedback/FeedbackModal.tsx
index c849c35f03e5894b5b33276b2374a18b97b603a9..5f2cf3d0292689daf354d2d7758ffeadcd7de6a7 100644
--- a/src/components/Feedback/FeedbackModal.tsx
+++ b/src/components/Feedback/FeedbackModal.tsx
@@ -1,13 +1,12 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import IconButton from '@material-ui/core/IconButton'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import ecolyoIcon from 'assets/icons/ico/ecolyo.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import useExploration from 'components/Hooks/useExploration'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserExplorationID } from 'enums'
 import React from 'react'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
@@ -35,7 +34,7 @@ const FeedbackModal = () => {
   return (
     <Dialog
       open={isFeedbacksOpen}
-      onClose={() => closeModal()}
+      onClose={closeModal}
       aria-labelledby="accessibility-title"
       classes={{
         root: 'modal-root',
@@ -45,31 +44,22 @@ const FeedbackModal = () => {
       <div id="accessibility-title">
         {t('feedback.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={closeModal}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={closeModal}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="fb-root">
         <StyledIcon icon={ecolyoIcon} size={80} />
         <p className="title">{t('feedback.title')}</p>
         <p className="text">{t('feedback.text1')}</p>
         <p className="text">{t('feedback.text2')}</p>
         <div className="actions">
-          <Button
-            aria-label={t('feedback.later')}
-            onClick={closeModal}
-            className="btnSecondary"
-          >
+          <Button onClick={closeModal} className="btnSecondary">
             {t('feedback.later')}
           </Button>
-          <Button
-            aria-label={t('feedback.lets_go')}
-            onClick={goToSAU}
-            className="btnPrimary"
-          >
+          <Button onClick={goToSAU} className="btnPrimary">
             {t('feedback.lets_go')}
           </Button>
         </div>
diff --git a/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap b/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap
index 9a26cb883362f15852a5aa683b0a4dab56d83bb9..905bfadd3e8f5df8cac1745a9f6b23aa10b459e3 100644
--- a/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap
+++ b/src/components/Feedback/__snapshots__/FeedbackModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`FeedbackModal component should render the component 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -92,7 +93,6 @@ exports[`FeedbackModal component should render the component 1`] = `
             class="actions"
           >
             <button
-              aria-label="feedback.later"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
               tabindex="0"
               type="button"
@@ -107,7 +107,6 @@ exports[`FeedbackModal component should render the component 1`] = `
               />
             </button>
             <button
-              aria-label="feedback.lets_go"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
               tabindex="0"
               type="button"
diff --git a/src/components/FluidChart/FluidChart.tsx b/src/components/FluidChart/FluidChart.tsx
index c03ea3ad25e1174fc717a7193223ccb7a4289fc5..50da25f22e63e16d1815f4aa8ce3d8d3040abca1 100644
--- a/src/components/FluidChart/FluidChart.tsx
+++ b/src/components/FluidChart/FluidChart.tsx
@@ -5,7 +5,7 @@ import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch'
 import useExploration from 'components/Hooks/useExploration'
 import { useMoveToLatestDate } from 'components/Hooks/useMoveToDate'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep, UserExplorationID } from 'enums'
 import { DateTime } from 'luxon'
 import React, { useCallback, useEffect, useState } from 'react'
@@ -42,7 +42,7 @@ const FluidChart = ({ fluidType }: { fluidType: FluidType }) => {
   const lowercaseTimeStep = TimeStep[currentTimeStep].toLowerCase()
   const lowercaseFluidType = getFluidName(fluidType)
 
-  const handleChangeSwitch = async () => {
+  const handleChangeSwitch = () => {
     dispatch(setShowCompare(!showCompare))
   }
 
@@ -112,6 +112,8 @@ const FluidChart = ({ fluidType }: { fluidType: FluidType }) => {
       case FluidType.WATER:
         dispatch(setShowOfflineData(false))
         break
+      default:
+        throw new Error('Unexpected fluid type')
     }
   }
 
diff --git a/src/components/FluidChart/FluidChartSlide.tsx b/src/components/FluidChart/FluidChartSlide.tsx
index 9a66f31ed68559e22efadc6a80a795e3a7ef0fc0..3a20b9dc600c7176077f1e12eaf9c606dd8c8bc3 100644
--- a/src/components/FluidChart/FluidChartSlide.tsx
+++ b/src/components/FluidChart/FluidChartSlide.tsx
@@ -34,6 +34,9 @@ const FluidChartSlide = ({
     global: { fluidStatus, fluidTypes },
   } = useAppSelector(state => state.ecolyo)
 
+  /** Determines if child elements should be focusable */
+  const focusable = currentIndex === index
+
   const [chartData, setChartData] = useState<Datachart>({
     actualData: [],
     comparisonData: null,
@@ -44,7 +47,7 @@ const FluidChartSlide = ({
   useEffect(() => {
     let subscribed = true
     async function loadData() {
-      if (currentTimeStep != timeStep && subscribed) {
+      if (currentTimeStep != timeStep) {
         setIsDataLoaded(false)
         setTimeStep(currentTimeStep)
       }
@@ -71,22 +74,22 @@ const FluidChartSlide = ({
         ])
         const consumptionService = new ConsumptionService(client)
         const isMulti = fluidType === FluidType.MULTIFLUID
-        const fluidTypeArray: FluidType[] = isMulti ? fluidTypes : [fluidType]
-        const graphData = await consumptionService.getGraphData(
+        const fluidTypeArray = isMulti ? fluidTypes : [fluidType]
+        const graphData = await consumptionService.getGraphData({
           timePeriod,
-          currentTimeStep,
-          fluidTypeArray,
+          timeStep: currentTimeStep,
+          fluidTypes: fluidTypeArray,
           fluidStatus,
           compareTimePeriod,
-          isMulti
-        )
-        if (subscribed && graphData && graphData?.actualData.length > 0) {
+          isHome: isMulti,
+        })
+        if (graphData && graphData?.actualData.length > 0) {
           setChartData(graphData)
           setIsDataLoaded(true)
         }
       }
     }
-    loadData()
+    subscribed && loadData()
     return () => {
       subscribed = false
     }
@@ -117,7 +120,7 @@ const FluidChartSlide = ({
         </div>
       ) : (
         <>
-          <ConsumptionVisualizer fluidType={fluidType} />
+          <ConsumptionVisualizer fluidType={fluidType} focusable={focusable} />
           <BarChart
             chartData={chartData}
             fluidType={fluidType}
@@ -126,6 +129,7 @@ const FluidChartSlide = ({
             height={height}
             width={width}
             isSwitching={isSwitching}
+            focusable={focusable}
           />
         </>
       )}
diff --git a/src/components/FluidChart/FluidChartSwipe.tsx b/src/components/FluidChart/FluidChartSwipe.tsx
index 934e86468f5da625b27ff521a5ef50921edffb37..ecd686e22e8bd8352c6c3235601ded2626ee1a55 100644
--- a/src/components/FluidChart/FluidChartSwipe.tsx
+++ b/src/components/FluidChart/FluidChartSwipe.tsx
@@ -1,7 +1,6 @@
 import FluidChartSlide from 'components/FluidChart/FluidChartSlide'
 import { useChartResize } from 'components/Hooks/useChartResize'
 import { FluidType } from 'enums'
-import { DateTime } from 'luxon'
 import React, { useEffect, useRef, useState } from 'react'
 import SwipeableViews from 'react-swipeable-views'
 import { virtualize } from 'react-swipeable-views-utils'
@@ -36,12 +35,12 @@ const FluidChartSwipe = ({ fluidType }: { fluidType: FluidType }) => {
         currentIndex
       )
     }
-    const updatedDate: DateTime = dateChartService.incrementDate(
+    const updatedDate = dateChartService.incrementDate(
       currentTimeStep,
       selectedDate,
       increment
     )
-    const updatedIndex: number = dateChartService.defineDateIndex(
+    const updatedIndex = dateChartService.defineDateIndex(
       currentTimeStep,
       updatedDate
     )
@@ -54,7 +53,7 @@ const FluidChartSwipe = ({ fluidType }: { fluidType: FluidType }) => {
   useEffect(() => {
     function initIndex() {
       const dateChartService = new DateChartService()
-      const updatedIndex: number = dateChartService.defineDateIndex(
+      const updatedIndex = dateChartService.defineDateIndex(
         currentTimeStep,
         selectedDate
       )
@@ -84,9 +83,7 @@ const FluidChartSwipe = ({ fluidType }: { fluidType: FluidType }) => {
         slideRenderer={({ key, index }) => slideRenderer(key, index)}
         enableMouseEvents
         onSwitching={!isSwitching ? () => setIsSwitching(true) : null}
-        onTransitionEnd={() => {
-          setIsSwitching(false)
-        }}
+        onTransitionEnd={() => setIsSwitching(false)}
         axis="x-reverse"
       />
     </div>
diff --git a/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx b/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx
index 116c1929971e8942dd38f039343bd255218df7fd..25c1724abac3eff88ae3c0b2f49efd46935314b7 100644
--- a/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx
+++ b/src/components/FluidChart/HalfHourNoDataFailure/HalfHourNoDataFailure.tsx
@@ -1,6 +1,6 @@
 import failureIcon from 'assets/icons/visu/duelResult/CHALLENGE0001-0.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import '../HalfHourUpcoming/HalfHourUpcoming.scss'
 
@@ -9,7 +9,7 @@ const HalfHourNoDataFailure = () => {
 
   return (
     <div className="halfHour">
-      <Icon className="imgResult" icon={failureIcon} size={180} />
+      <StyledIcon className="imgResult" icon={failureIcon} size={180} />
       <h2 className="text-20-bold halfHourFailure">
         {t('timestep.half_an_hour.gather_data_failure')}
       </h2>
diff --git a/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap b/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap
index aeeb024a2da8612aa4ee029c46c778c387c4e867..255aa924dc177a4b338b5bc95a320b7e7882dbf7 100644
--- a/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap
+++ b/src/components/FluidChart/HalfHourNoDataFailure/__snapshots__/HalfHourNoDataFailure.spec.tsx.snap
@@ -6,6 +6,7 @@ exports[`HalfHourNoDataFailure component should render correctly HalfHourNoDataF
     class="halfHour"
   >
     <svg
+      aria-hidden="true"
       class="imgResult styles__icon___23x3R"
       height="180"
       width="180"
diff --git a/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx
index e0e8b853ee5a34c3c3ec134670daddba92c05b10..6673b2aefbbe4da14ea2f1f2a70d31c10b4ef21a 100644
--- a/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx
+++ b/src/components/FluidChart/HalfHourUpcoming/HalfHourUpcoming.tsx
@@ -1,4 +1,4 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './HalfHourUpcoming.scss'
 
diff --git a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx
index 91673e4f66235d9212d9dced10cabb021fbb674f..ab25fa0ef054088f668adbf8f7ec414cc5e77381 100644
--- a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx
+++ b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.spec.tsx
@@ -6,7 +6,7 @@ import { DateTime } from 'luxon'
 import React from 'react'
 import { Provider } from 'react-redux'
 import * as chartActions from 'store/chart/chart.slice'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockChartState } from 'tests/__mocks__/store'
 
 const setCurrentTimeStepSpy = jest.spyOn(chartActions, 'setCurrentTimeStep')
 const setCurrentIndexSpy = jest.spyOn(chartActions, 'setCurrentIndex')
@@ -17,9 +17,10 @@ describe('TimeStepSelector component', () => {
     jest.clearAllMocks()
   })
 
-  it('should render component properly with 4 timesteps', async () => {
+  it('should render component properly with 4 timesteps', () => {
     const store = createMockEcolyoStore({
       chart: {
+        ...mockChartState,
         currentTimeStep: TimeStep.DAY,
         selectedDate: DateTime.local().setZone('utc', {
           keepLocalTime: true,
@@ -38,6 +39,7 @@ describe('TimeStepSelector component', () => {
   it('should render component properly with 5 timesteps', () => {
     const store = createMockEcolyoStore({
       chart: {
+        ...mockChartState,
         currentTimeStep: TimeStep.DAY,
         selectedDate: DateTime.local().setZone('utc', {
           keepLocalTime: true,
@@ -55,6 +57,7 @@ describe('TimeStepSelector component', () => {
   it('should define next TimeStep and dispatch it', async () => {
     const store = createMockEcolyoStore({
       chart: {
+        ...mockChartState,
         currentTimeStep: TimeStep.YEAR,
         selectedDate: DateTime.local().setZone('utc', {
           keepLocalTime: true,
@@ -76,6 +79,7 @@ describe('TimeStepSelector component', () => {
   it('should go to todays day with timestep week', async () => {
     const store = createMockEcolyoStore({
       chart: {
+        ...mockChartState,
         currentTimeStep: TimeStep.YEAR,
         selectedDate: DateTime.local().setZone('utc', {
           keepLocalTime: true,
diff --git a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx
index d05db4af3cd184efe03f575eb577e96ecbe7a532..2d9a103d64c2a416d3ee4fcc3b31828d587ba69d 100644
--- a/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx
+++ b/src/components/FluidChart/TimeStepSelector/TimeStepSelector.tsx
@@ -1,5 +1,7 @@
+/* eslint-disable jsx-a11y/no-noninteractive-tabindex */
+/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
 import { Button } from '@material-ui/core'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import React from 'react'
@@ -41,10 +43,7 @@ const TimeStepSelector = ({ fluidType }: { fluidType: FluidType }) => {
     dispatch(setCurrentTimeStep(TimeStep.WEEK))
   }
   const handleChangeTimeStep = (targetTimestep: TimeStep) => {
-    const index: number = dateChartService.defineDateIndex(
-      targetTimestep,
-      selectedDate
-    )
+    const index = dateChartService.defineDateIndex(targetTimestep, selectedDate)
     dispatch(setCurrentTimeStep(targetTimestep))
     dispatch(setCurrentIndex(index))
   }
diff --git a/src/components/FluidChart/TimeStepSelector/timeStepSelector.scss b/src/components/FluidChart/TimeStepSelector/timeStepSelector.scss
index e08a8da858902eaeb82b81b194d8580d8c73820e..d41cb3344de86a7ee77a8a2f924ef34bc70ecffb 100644
--- a/src/components/FluidChart/TimeStepSelector/timeStepSelector.scss
+++ b/src/components/FluidChart/TimeStepSelector/timeStepSelector.scss
@@ -48,6 +48,10 @@
         left: -14px;
         top: -15px;
       }
+      &:focus-visible {
+        outline: 2px solid $blue-accessibility;
+        outline-offset: 2px;
+      }
     }
     .text {
       position: relative;
diff --git a/src/components/Header/CozyBar.spec.tsx b/src/components/Header/CozyBar.spec.tsx
index 960d681051bc836eac1b1681b6c5615d73a58b05..f8ecdef730022fd348c818dd48754893f69c73cc 100644
--- a/src/components/Header/CozyBar.spec.tsx
+++ b/src/components/Header/CozyBar.spec.tsx
@@ -5,7 +5,7 @@ import { ScreenType } from 'enums'
 import React from 'react'
 import { Provider } from 'react-redux'
 import * as ModalAction from 'store/modal/modal.slice'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
 
 interface BarProps {
   children: React.ReactNode
@@ -86,7 +86,7 @@ describe('CozyBar component', () => {
 
   it('should not be rendered with screen type different from mobile', () => {
     const store = createMockEcolyoStore({
-      global: { screenType: ScreenType.DESKTOP },
+      global: { ...mockGlobalState, screenType: ScreenType.DESKTOP },
     })
     const { container } = render(
       <Provider store={store}>
diff --git a/src/components/Header/CozyBar.tsx b/src/components/Header/CozyBar.tsx
index d0cccb6005d43438fc1fc1541e68236440318cb5..355d295ff57681cfa466458077e4776f9755a266 100644
--- a/src/components/Header/CozyBar.tsx
+++ b/src/components/Header/CozyBar.tsx
@@ -1,7 +1,7 @@
 import BackArrowIcon from 'assets/icons/ico/back-arrow.svg'
 import FeedbackIcon from 'assets/icons/ico/feedback.svg'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ScreenType } from 'enums'
 import React, { useCallback } from 'react'
 import { useNavigate } from 'react-router-dom'
@@ -68,9 +68,8 @@ const CozyBar = ({
         </BarRight>
       </>
     )
-  } else {
-    return null
   }
+  return null
 }
 
 export default CozyBar
diff --git a/src/components/Header/Header.spec.tsx b/src/components/Header/Header.spec.tsx
index 0e527784ddfeb7dc0be86ec364b97319f86e6830..5d50f14bff0361e403092469c586778eaa1489b0 100644
--- a/src/components/Header/Header.spec.tsx
+++ b/src/components/Header/Header.spec.tsx
@@ -1,10 +1,11 @@
 import { act, render, screen } from '@testing-library/react'
 import userEvent from '@testing-library/user-event'
 import Header from 'components/Header/Header'
+import { ScreenType } from 'enums'
 import React from 'react'
 import { Provider } from 'react-redux'
 import * as ModalAction from 'store/modal/modal.slice'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
 
 const mockedNavigate = jest.fn()
 jest.mock('react-router-dom', () => ({
@@ -13,10 +14,28 @@ jest.mock('react-router-dom', () => ({
 }))
 
 describe('Header component', () => {
-  const store = createMockEcolyoStore()
-  it('should be rendered correctly', () => {
+  const mobileStore = createMockEcolyoStore()
+  const desktopStore = createMockEcolyoStore({
+    global: { ...mockGlobalState, screenType: ScreenType.DESKTOP },
+  })
+
+  beforeEach(() => {
+    jest.clearAllMocks()
+  })
+
+  it('should be rendered correctly on mobile', () => {
+    const { container } = render(
+      <Provider store={mobileStore}>
+        <Header desktopTitleKey="mockKey" />
+      </Provider>
+    )
+    expect(container).toMatchSnapshot()
+    expect(container.getElementsByTagName('header')[0]).toBeInTheDocument()
+  })
+
+  it('should be rendered correctly on desktop', () => {
     const { container } = render(
-      <Provider store={store}>
+      <Provider store={desktopStore}>
         <Header desktopTitleKey="mockKey" />
       </Provider>
     )
@@ -24,10 +43,29 @@ describe('Header component', () => {
     expect(container.getElementsByTagName('header')[0]).toBeInTheDocument()
   })
 
+  it('should display desktop title text when desktopTitleKey provided', () => {
+    const titleKey = 'Test Title'
+    render(
+      <Provider store={desktopStore}>
+        <Header desktopTitleKey={titleKey} />
+      </Provider>
+    )
+    expect(screen.getByText(titleKey)).toBeInTheDocument()
+  })
+
+  it('should not display desktop title text when desktopTitleKey not provided', () => {
+    const { queryByText } = render(
+      <Provider store={desktopStore}>
+        <Header desktopTitleKey="" />
+      </Provider>
+    )
+    expect(queryByText(/.+/)).not.toBeInTheDocument()
+  })
+
   it('should display title and back button when desktopTitle key provided and displayBackArrow is true', () => {
     const key = 'titleKey'
     render(
-      <Provider store={store}>
+      <Provider store={desktopStore}>
         <Header desktopTitleKey={key} displayBackArrow={true} />
       </Provider>
     )
@@ -36,9 +74,10 @@ describe('Header component', () => {
       screen.getByLabelText('header.accessibility.button_back')
     ).toBeInTheDocument()
   })
-  it('should NOT display back button when displayBackArrow is false', async () => {
+
+  it('should NOT display back button when displayBackArrow is false', () => {
     render(
-      <Provider store={store}>
+      <Provider store={mobileStore}>
         <Header desktopTitleKey="test" displayBackArrow={false} />
       </Provider>
     )
@@ -52,7 +91,7 @@ describe('Header component', () => {
   describe('back functions', () => {
     it('should call navigate -1 when back button is clicked with NO back fn', async () => {
       render(
-        <Provider store={store}>
+        <Provider store={desktopStore}>
           <Header desktopTitleKey="KEY" displayBackArrow={true} />
         </Provider>
       )
@@ -63,10 +102,11 @@ describe('Header component', () => {
       })
       expect(mockedNavigate).toHaveBeenCalled()
     })
+
     it('should call custom back fn when back button is clicked', async () => {
       const mockBack = jest.fn()
       render(
-        <Provider store={store}>
+        <Provider store={desktopStore}>
           <Header
             desktopTitleKey="KEY"
             displayBackArrow={true}
@@ -85,7 +125,7 @@ describe('Header component', () => {
 
   it('should call handleClickFeedbacks when feedback button is clicked', async () => {
     render(
-      <Provider store={store}>
+      <Provider store={mobileStore}>
         <Header desktopTitleKey="mockKey" />
       </Provider>
     )
diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx
index b200f36a72621b30f136f0bc0c38706c9eb30129..83585f85c1fe55dff6a262230ca2e8801055e821 100644
--- a/src/components/Header/Header.tsx
+++ b/src/components/Header/Header.tsx
@@ -1,8 +1,7 @@
-import IconButton from '@material-ui/core/IconButton'
 import BackArrowIcon from 'assets/icons/ico/back-arrow.svg'
 import FeedbackIcon from 'assets/icons/ico/feedback.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ScreenType } from 'enums'
 import React, { useCallback, useEffect, useRef } from 'react'
 import { useNavigate } from 'react-router-dom'
@@ -20,7 +19,6 @@ interface HeaderProps {
   backFunction?: () => void
 }
 
-/** Header for desktop view */
 const Header = ({
   desktopTitleKey,
   displayBackArrow,
@@ -31,7 +29,9 @@ const Header = ({
   const navigate = useNavigate()
   const header = useRef<HTMLDivElement>(null)
   const dispatch = useAppDispatch()
-  const { screenType } = useAppSelector(state => state.ecolyo.global)
+  const { screenType, headerHeight } = useAppSelector(
+    state => state.ecolyo.global
+  )
   const cozyBarHeight = 48
 
   const handleClickBack = useCallback(() => {
@@ -47,53 +47,49 @@ const Header = ({
   }
 
   useEffect(() => {
-    const headerHeight = header.current?.clientHeight || 0
+    const refHeight = header.current?.clientHeight || 0
     const adjustment = screenType === ScreenType.MOBILE ? cozyBarHeight : 0
-    dispatch(setHeaderHeight(headerHeight - adjustment))
-  }, [screenType, children, dispatch])
+    const targetHeight = refHeight - adjustment
+    if (targetHeight !== headerHeight) {
+      dispatch(setHeaderHeight(targetHeight))
+    }
+  }, [screenType, children, dispatch, headerHeight])
 
   return (
     <header ref={header}>
       <div className="header-top">
         <div className="header-content">
-          <div
-            className={
-              !desktopTitleKey
-                ? 'header-content-top header-content-top-right'
-                : 'header-content-top'
-            }
-          >
+          <div className="header-content-top">
+            {screenType !== ScreenType.MOBILE && displayBackArrow && (
+              <StyledIconButton
+                icon={BackArrowIcon}
+                onClick={handleClickBack}
+                aria-label={t('header.accessibility.button_back')}
+                className="header-back-button"
+              />
+            )}
             {desktopTitleKey && (
               <div
-                className={`header-text-desktop ${
+                className={`${
+                  displayBackArrow && desktopTitleKey
+                    ? 'header-text-selection'
+                    : 'header-text-desktop'
+                } ${
                   screenType === ScreenType.MOBILE
                     ? 'text-14-normal-uppercase'
                     : 'text-22-bold'
                 }`}
               >
-                {displayBackArrow && (
-                  <IconButton
-                    aria-label={t('header.accessibility.button_back')}
-                    className="header-back-button"
-                    onClick={handleClickBack}
-                  >
-                    <Icon icon={BackArrowIcon} size={16} />
-                  </IconButton>
-                )}
                 <span>{t(desktopTitleKey)}</span>
               </div>
             )}
-            <IconButton
-              aria-label={t('header.accessibility.button_open_feedbacks')}
-              className={
-                !desktopTitleKey
-                  ? 'header-feedbacks-button right'
-                  : 'header-feedbacks-button'
-              }
+            <StyledIconButton
+              icon={FeedbackIcon}
+              sized={40}
               onClick={handleClickFeedbacks}
-            >
-              <Icon icon={FeedbackIcon} size={40} />
-            </IconButton>
+              aria-label={t('header.accessibility.button_open_feedbacks')}
+              className="header-feedbacks-button"
+            />
           </div>
           {children}
         </div>
diff --git a/src/components/Header/__snapshots__/CozyBar.spec.tsx.snap b/src/components/Header/__snapshots__/CozyBar.spec.tsx.snap
index 62521bfb18e6bd75e9438a5e7a5c2d1dce331a96..f793b20f4f782c61c5e36f580d7238526fdbed1c 100644
--- a/src/components/Header/__snapshots__/CozyBar.spec.tsx.snap
+++ b/src/components/Header/__snapshots__/CozyBar.spec.tsx.snap
@@ -13,7 +13,7 @@ exports[`CozyBar component should be rendered correctly without without left arr
   </div>
   <button
     aria-label="header.accessibility.button_open_feedbacks"
-    class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-1 cv-button"
+    class="MuiButtonBase-root MuiIconButton-root cv-button"
     tabindex="0"
     type="button"
   >
@@ -42,7 +42,7 @@ exports[`CozyBar component should test displayBackArrow should call backFunction
 <div>
   <button
     aria-label="header.accessibility.button_back"
-    class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-3 cv-button"
+    class="MuiButtonBase-root MuiIconButton-root cv-button"
     tabindex="0"
     type="button"
   >
@@ -75,7 +75,7 @@ exports[`CozyBar component should test displayBackArrow should call backFunction
   </div>
   <button
     aria-label="header.accessibility.button_open_feedbacks"
-    class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-3 cv-button"
+    class="MuiButtonBase-root MuiIconButton-root cv-button"
     tabindex="0"
     type="button"
   >
@@ -104,7 +104,7 @@ exports[`CozyBar component should test displayBackArrow should call navigate(-1)
 <div>
   <button
     aria-label="header.accessibility.button_back"
-    class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-2 cv-button"
+    class="MuiButtonBase-root MuiIconButton-root cv-button"
     tabindex="0"
     type="button"
   >
@@ -137,7 +137,7 @@ exports[`CozyBar component should test displayBackArrow should call navigate(-1)
   </div>
   <button
     aria-label="header.accessibility.button_open_feedbacks"
-    class="MuiButtonBase-root MuiIconButton-root WithStyles(ForwardRef(IconButton))-root-2 cv-button"
+    class="MuiButtonBase-root MuiIconButton-root cv-button"
     tabindex="0"
     type="button"
   >
diff --git a/src/components/Header/__snapshots__/Header.spec.tsx.snap b/src/components/Header/__snapshots__/Header.spec.tsx.snap
index 3bd7905849ab67ceeb3159018c8bfc69fbecec99..2b060bac40e27596a9dae81d405bc37b8b3cf350 100644
--- a/src/components/Header/__snapshots__/Header.spec.tsx.snap
+++ b/src/components/Header/__snapshots__/Header.spec.tsx.snap
@@ -1,6 +1,59 @@
 // Jest Snapshot v1, https://goo.gl/fbAQLP
 
-exports[`Header component should be rendered correctly 1`] = `
+exports[`Header component should be rendered correctly on desktop 1`] = `
+<div>
+  <header>
+    <div
+      class="header-top"
+    >
+      <div
+        class="header-content"
+      >
+        <div
+          class="header-content-top"
+        >
+          <div
+            class="header-text-desktop text-22-bold"
+          >
+            <span>
+              mockKey
+            </span>
+          </div>
+          <button
+            aria-label="header.accessibility.button_open_feedbacks"
+            class="MuiButtonBase-root MuiIconButton-root header-feedbacks-button"
+            tabindex="0"
+            type="button"
+          >
+            <span
+              class="MuiIconButton-label"
+            >
+              <svg
+                aria-hidden="true"
+                class="styles__icon___23x3R"
+                height="40"
+                width="40"
+              >
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+            </span>
+            <span
+              class="MuiTouchRipple-root"
+            />
+          </button>
+        </div>
+      </div>
+    </div>
+    <div
+      class="header-bar"
+    />
+  </header>
+</div>
+`;
+
+exports[`Header component should be rendered correctly on mobile 1`] = `
 <div>
   <header>
     <div
@@ -29,6 +82,7 @@ exports[`Header component should be rendered correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="40"
                 width="40"
diff --git a/src/components/Header/header.scss b/src/components/Header/header.scss
index 2817543e8f42e3858b513f7c97993c650d0304b1..5f794557b9db2b73101de6d789e45c004c7840dc 100644
--- a/src/components/Header/header.scss
+++ b/src/components/Header/header.scss
@@ -43,27 +43,40 @@ header {
     .header-content-top {
       display: flex;
       flex-direction: row;
-      &.header-content-top-right {
-        justify-content: flex-end;
-      }
+      justify-content: space-between;
+      align-items: center;
       .header-text {
-        padding: 2rem 1rem;
         flex: 1;
+        padding: 0 1rem 1rem 1rem;
+        color: $grey-bright;
+        text-align: center;
       }
       .header-text-desktop {
         display: flex;
         flex: 1;
         padding: 2rem 1.25rem;
         color: $grey-bright;
+        justify-content: center;
+        text-align: center;
+        margin-left: 64px;
+      }
+      .header-text-selection {
+        display: flex;
+        flex: 1;
+        padding: 2rem 1.25rem;
+        color: $grey-bright;
+        justify-content: center;
+        text-align: center;
+        margin-left: 24px;
+        @media #{$large-phone} {
+          display: none;
+        }
       }
-      .header-back-button {
+      .header-back-button,
+      .header-feedbacks-button {
         padding: 0 0.75rem;
       }
       @media #{$large-phone} {
-        .header-text {
-          padding: 0 1rem 1rem 1rem;
-          color: $grey-bright;
-        }
         .header-text-desktop {
           display: none;
         }
diff --git a/src/components/Hooks/useExploration.spec.tsx b/src/components/Hooks/useExploration.spec.tsx
index 7b3184ff05f90ab1c147809c4d2f4970683bd762..f1fe70cfd4628161b9efed68e2546866ee40bf8d 100644
--- a/src/components/Hooks/useExploration.spec.tsx
+++ b/src/components/Hooks/useExploration.spec.tsx
@@ -2,14 +2,20 @@ import { act, renderHook } from '@testing-library/react'
 import { UserExplorationID } from 'enums'
 import React from 'react'
 import { Provider } from 'react-redux'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockChallengeState,
+} from 'tests/__mocks__/store'
 import { userChallengeExplo1OnGoing } from 'tests/__mocks__/userChallengeData.mock'
 import useExploration from './useExploration'
 
 describe('useExploration Hooks', () => {
   it('should return "EXPLORATION001"', () => {
     const store = createMockEcolyoStore({
-      challenge: { currentChallenge: userChallengeExplo1OnGoing },
+      challenge: {
+        ...mockChallengeState,
+        currentChallenge: userChallengeExplo1OnGoing,
+      },
     })
 
     const wrapper = ({ children }: { children: JSX.Element }) => (
diff --git a/src/components/Hooks/useExploration.tsx b/src/components/Hooks/useExploration.tsx
index 36e9be442f8063e69ed96c2197606b11e3d87ad4..73eef4e582a5c55bfa35ddc126c0ad730fc1b095 100644
--- a/src/components/Hooks/useExploration.tsx
+++ b/src/components/Hooks/useExploration.tsx
@@ -1,6 +1,5 @@
 import { useClient } from 'cozy-client'
 import { UserExplorationState } from 'enums'
-import { UserExploration } from 'models'
 import { Dispatch, SetStateAction, useEffect, useState } from 'react'
 import ExplorationService from 'services/exploration.service'
 import { updateUserChallengeList } from 'store/challenge/challenge.slice'
@@ -11,11 +10,9 @@ const useExploration = (): [string, Dispatch<SetStateAction<string>>] => {
   const client = useClient()
   const dispatch = useAppDispatch()
   const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
-  const exploration: UserExploration | null = currentChallenge
-    ? currentChallenge.exploration
-    : null
+  const exploration = currentChallenge ? currentChallenge.exploration : null
 
-  const ecogestureId: string = exploration ? exploration.ecogesture_id : ''
+  const ecogestureId = exploration ? exploration.ecogesture_id : ''
 
   const [explorationID, setExplorationID] = useState<string>('')
 
@@ -26,7 +23,7 @@ const useExploration = (): [string, Dispatch<SetStateAction<string>>] => {
       currentChallenge?.exploration.id === explorationID &&
       currentChallenge?.exploration.state === UserExplorationState.ONGOING
     ) {
-      const checkExplo = async () => {
+      const checkExplo = () => {
         const explorationService = new ExplorationService(client)
         explorationService
           .checkExploration(currentChallenge, explorationID)
diff --git a/src/components/Hooks/useKonnectorAuth.tsx b/src/components/Hooks/useKonnectorAuth.tsx
index 77348935820f289bccd2b9d4fc87a30c9b31ac71..6755f9ed4dcffe90ac611bfbe61df92ba11bbe7c 100644
--- a/src/components/Hooks/useKonnectorAuth.tsx
+++ b/src/components/Hooks/useKonnectorAuth.tsx
@@ -1,6 +1,6 @@
 import * as Sentry from '@sentry/react'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import {
   AccountEGLData,
@@ -84,7 +84,6 @@ const useKonnectorAuth = (
         grdfAuthData: options.grdfAuthData,
         sgeAuthData: options.sgeAuthData,
       })
-      logApp('info', `accountAuthData ${JSON.stringify(accountAuthData)}`)
 
       const { account, trigger } = await connectionService.connectNewUser(
         konnectorSlug,
@@ -122,7 +121,6 @@ const useKonnectorAuth = (
           grdfAuthData: options.grdfAuthData,
           sgeAuthData: options.sgeAuthData,
         })
-        logApp('info', `accountAuthData ${JSON.stringify(accountAuthData)}`)
 
         const newAccount = structuredClone(
           currentFluidStatus.connection.account
diff --git a/src/components/Hooks/usePageTitle.spec.tsx b/src/components/Hooks/usePageTitle.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..b184016e3f1ba43e381e57e3b67542c5b18c16c7
--- /dev/null
+++ b/src/components/Hooks/usePageTitle.spec.tsx
@@ -0,0 +1,59 @@
+import { act, render } from '@testing-library/react'
+import React from 'react'
+import { BrowserRouter as Router } from 'react-router-dom'
+import usePageTitle from './usePageTitle'
+
+const TestComponent = () => {
+  usePageTitle()
+  return null
+}
+
+const setLocation = (pathname: string) => {
+  render(
+    <Router>
+      <TestComponent />
+    </Router>
+  )
+  window.history.pushState({}, '', pathname)
+}
+
+describe('usePageTitle hook', () => {
+  beforeEach(() => {
+    document.title = ''
+  })
+
+  const cases = [
+    { pathname: '/consumption', expected: 'Conso | Ecolyo' },
+    {
+      pathname: '/ecogesture-selection',
+      expected: 'Sélection des astuces | Ecolyo',
+    },
+    { pathname: '/ecogesture-form', expected: 'Astuces | Ecolyo' },
+    { pathname: '/ecogestures', expected: 'Astuces | Ecolyo' },
+    { pathname: '/options', expected: 'Options | Ecolyo' },
+    { pathname: '/options/legalnotice', expected: 'Mentions Légales | Ecolyo' },
+    {
+      pathname: '/options/gcu',
+      expected: "Conditions Générales d'Utilisation | Ecolyo",
+    },
+    { pathname: '/analysis', expected: 'Analyse | Ecolyo' },
+    { pathname: '/profileType', expected: 'Ajuster mon profil | Ecolyo' },
+    { pathname: '/challenges', expected: 'Défis | Ecolyo' },
+    { pathname: '/challenges/duel', expected: 'Défis | Ecolyo' },
+    {
+      pathname: '/consumption/electricity',
+      expected: 'Conso électrique | Ecolyo',
+    },
+    { pathname: '/connect/electricity', expected: 'Conso électrique | Ecolyo' },
+    { pathname: '/consumption/water', expected: "Conso d'eau | Ecolyo" },
+    { pathname: '/consumption/gas', expected: 'Conso de gaz | Ecolyo' },
+    { pathname: '/connect/gas', expected: 'Conso de gaz | Ecolyo' },
+  ]
+
+  test.each(cases)('sets the title for $pathname', ({ pathname, expected }) => {
+    act(() => {
+      setLocation(pathname)
+    })
+    expect(document.title).toBe(expected)
+  })
+})
diff --git a/src/components/Hooks/usePageTitle.tsx b/src/components/Hooks/usePageTitle.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..6fd87d8a6d3dd51e2818035f6ebe48d92f404e57
--- /dev/null
+++ b/src/components/Hooks/usePageTitle.tsx
@@ -0,0 +1,45 @@
+import { useEffect } from 'react'
+import { useLocation } from 'react-router-dom'
+
+/**
+ * Update the page title based on the current location
+ */
+const usePageTitle = () => {
+  const { pathname } = useLocation()
+
+  useEffect(() => {
+    const baseTitle = 'Ecolyo'
+
+    const titleMap: { [route: string]: string } = {
+      '/electricity': 'Conso électrique',
+      '/water': "Conso d'eau",
+      '/gas': 'Conso de gaz',
+      '/consumption': 'Conso',
+      '/ecogesture-selection': 'Sélection des astuces',
+      '/options/legalnotice': 'Mentions Légales',
+      '/options/gcu': "Conditions Générales d'Utilisation",
+      '/options': 'Options',
+      '/analysis': 'Analyse',
+      '/profileType': 'Ajuster mon profil',
+      '/challenges': 'Défis',
+      '/ecogesture': 'Astuces',
+    }
+
+    let title = ''
+
+    for (const [key, value] of Object.entries(titleMap)) {
+      if (pathname.includes(key)) {
+        title = value
+        break
+      }
+    }
+
+    if (title) {
+      document.title = `${title} | ${baseTitle}`
+    } else {
+      document.title = baseTitle
+    }
+  }, [pathname])
+}
+
+export default usePageTitle
diff --git a/src/components/Hooks/useUserInstanceSettings.tsx b/src/components/Hooks/useUserInstanceSettings.tsx
index 8868e24e1312dbf1de8c01807568eb030cdd23fa..5fe6bfdc2973de63ba118edfe9952021c1f80525 100644
--- a/src/components/Hooks/useUserInstanceSettings.tsx
+++ b/src/components/Hooks/useUserInstanceSettings.tsx
@@ -1,15 +1,30 @@
+import * as Sentry from '@sentry/react'
 import { useClient } from 'cozy-client'
 import get from 'lodash/get'
-import { UserInstanceSettings, UserInstanceSettingsAttributes } from 'models'
 import { useEffect, useState } from 'react'
 
-const useUserInstanceSettings = (): UserInstanceSettings => {
+interface UserInstanceSettingsAttributes {
+  auth_mode?: string
+  auto_update?: boolean
+  context?: string
+  email?: string
+  locale?: string
+  oidc_id?: string
+  onboarding_finished?: boolean
+  public_name: string
+  tos?: string
+  tos_latest?: string
+  uuid?: string
+}
+
+const useUserInstanceSettings = (): {
+  instanceSettings: UserInstanceSettingsAttributes
+} => {
   const client = useClient()
   const [settings, setSettings] = useState<UserInstanceSettingsAttributes>({
     // eslint-disable-next-line camelcase
     public_name: '',
   })
-  const [fetchStatus, setFetchStatus] = useState<string>('idle')
 
   useEffect(() => {
     const fetchData = async () => {
@@ -18,17 +33,16 @@ const useUserInstanceSettings = (): UserInstanceSettings => {
           .getStackClient()
           .fetchJSON('GET', '/settings/instance')
         setSettings(get(response, 'data.attributes'))
-        setFetchStatus('loaded')
       } catch (error) {
-        setFetchStatus('failed')
+        console.error(error)
+        Sentry.captureException(error)
       }
     }
     fetchData()
   }, [client])
 
   return {
-    data: settings,
-    fetchStatus,
+    instanceSettings: settings,
   }
 }
 
diff --git a/src/components/Konnector/ConnectionNotFound/ConnectionNotFound.tsx b/src/components/Konnector/ConnectionNotFound/ConnectionNotFound.tsx
index 705650d96257952fbe9bdc17083621fc2bd41aed..8325e445f66f993bd800ca3ccf35e2b7d5b13565 100644
--- a/src/components/Konnector/ConnectionNotFound/ConnectionNotFound.tsx
+++ b/src/components/Konnector/ConnectionNotFound/ConnectionNotFound.tsx
@@ -1,5 +1,5 @@
 import Button from '@material-ui/core/Button'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './connectionNotFound.scss'
 
diff --git a/src/components/Konnector/ConnectionResult/ConnectionResult.tsx b/src/components/Konnector/ConnectionResult/ConnectionResult.tsx
index 232a418355a9ac57925d69043d25d7e8d4358818..03db452ffbe8995d3f6954df16efebd6e72468e9 100644
--- a/src/components/Konnector/ConnectionResult/ConnectionResult.tsx
+++ b/src/components/Konnector/ConnectionResult/ConnectionResult.tsx
@@ -3,10 +3,10 @@ import warningDark from 'assets/icons/ico/warning-dark.svg'
 import warningWhite from 'assets/icons/ico/warning-white.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, KonnectorUpdate } from 'enums'
 import { DateTime } from 'luxon'
-import { AccountSgeData, FluidConnection, FluidStatus } from 'models'
+import { FluidConnection, FluidStatus } from 'models'
 import React, { useCallback, useEffect, useState } from 'react'
 import AccountService from 'services/account.service'
 import DateChartService from 'services/dateChart.service'
@@ -14,7 +14,6 @@ import TriggerService from 'services/triggers.service'
 import {
   setShouldRefreshConsent,
   updateFluidConnection,
-  updateSgeStore,
 } from 'store/global/global.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
 import { getKonnectorUpdateError } from 'utils/utils'
@@ -44,7 +43,7 @@ const ConnectionResult = ({
   const [status, setStatus] = useState<string>('')
   const [outDatedDataDays, setOutDatedDataDays] = useState<number | null>(null)
 
-  const updateKonnector = async () => {
+  const updateKonnector = () => {
     setStatus('')
     setLastExecutionDate('-')
     setKonnectorError('')
@@ -108,33 +107,11 @@ const ConnectionResult = ({
 
   const handleRefreshConsent = useCallback(() => {
     if (fluidType == FluidType.ELECTRICITY) {
-      const accountData = currentFluidStatus.connection.account
-        ?.auth as AccountSgeData
-      // store the previous account data since the onDelete will remove account from DB
-      dispatch(
-        updateSgeStore({
-          currentStep: 0,
-          firstName: accountData.firstname,
-          lastName: accountData.lastname,
-          pdl: parseInt(accountData.pointId),
-          address: accountData.address,
-          zipCode: parseInt(accountData.postalCode),
-          city: accountData.city,
-          dataConsent: true,
-          pdlConfirm: true,
-          shouldLaunchAccount: true,
-        })
-      )
       dispatch(setShouldRefreshConsent(true))
     } else {
       deleteAccountsAndTriggers()
     }
-  }, [
-    fluidType,
-    currentFluidStatus.connection.account?.auth,
-    dispatch,
-    deleteAccountsAndTriggers,
-  ])
+  }, [fluidType, dispatch, deleteAccountsAndTriggers])
 
   useEffect(() => {
     if (currentFluidStatus.connection.triggerState?.last_success) {
@@ -320,18 +297,16 @@ const DisplayDataOutdated = ({
   return (
     <div className="connection-caption text-16-normal">
       <div className="text-16-normal">
-        <>
-          {hasUpdatedToday ? (
-            // If user has already ran an update today, display a message about energy provider issue
-            <DisplayAlreadyUpdatedToday
-              fluidStatus={fluidStatus}
-              fluidType={fluidType}
-              lastExecutionDate={lastExecutionDate.toLocaleString()}
-            />
-          ) : (
-            <DisplayManualUpdate />
-          )}
-        </>
+        {hasUpdatedToday ? (
+          // If user has already ran an update today, display a message about energy provider issue
+          <DisplayAlreadyUpdatedToday
+            fluidStatus={fluidStatus}
+            fluidType={fluidType}
+            lastExecutionDate={lastExecutionDate.toLocaleString()}
+          />
+        ) : (
+          <DisplayManualUpdate />
+        )}
       </div>
     </div>
   )
diff --git a/src/components/Konnector/KonnectorModal.spec.tsx b/src/components/Konnector/KonnectorModal.spec.tsx
index bd2f5cacac53519318ffdbdbc6cc4952b35729b3..32d0a9b8bad35cfaba93c98984b7e483e1d38bbc 100644
--- a/src/components/Konnector/KonnectorModal.spec.tsx
+++ b/src/components/Konnector/KonnectorModal.spec.tsx
@@ -69,7 +69,7 @@ describe('KonnectorModal component', () => {
     })
     expect(mockHandleCloseClick).toHaveBeenCalled()
   })
-  it('should render login error', async () => {
+  it('should render login error', () => {
     const { baseElement } = render(
       <Provider store={store}>
         <KonnectorModal
@@ -88,7 +88,7 @@ describe('KonnectorModal component', () => {
       baseElement.getElementsByClassName('headerError')[0]
     ).toBeInTheDocument()
   })
-  it('should render unknown error', async () => {
+  it('should render unknown error', () => {
     render(
       <Provider store={store}>
         <KonnectorModal
@@ -105,7 +105,7 @@ describe('KonnectorModal component', () => {
     )
     expect(screen.getByText('konnector_modal.error_data_2')).toBeInTheDocument()
   })
-  it('should render update error', async () => {
+  it('should render update error', () => {
     const { baseElement } = render(
       <Provider store={store}>
         <KonnectorModal
diff --git a/src/components/Konnector/KonnectorModal.tsx b/src/components/Konnector/KonnectorModal.tsx
index df53e6c64396724c7d187e5ee6500f9280165246..b11873d3d6f9eb5c94fe3574f3f39089f1c8b6ce 100644
--- a/src/components/Konnector/KonnectorModal.tsx
+++ b/src/components/Konnector/KonnectorModal.tsx
@@ -4,6 +4,7 @@ import EnedisIcon from 'assets/icons/ico/consent-outdated-enedis.svg'
 import errorIcon from 'assets/icons/visu/data-nok.svg'
 import successIcon from 'assets/icons/visu/data-ok.svg'
 import classNames from 'classnames'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import Loader from 'components/Loader/Loader'
 import connectionWaitingText from 'constants/connectionWaitingText.json'
 import firstConnectionWaitingText from 'constants/firstConnectionWaitingText.json'
@@ -11,8 +12,7 @@ import {
   ERROR_EVENT,
   SUCCESS_EVENT,
 } from 'cozy-harvest-lib/dist/models/flowEvents'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, KonnectorError } from 'enums'
 import { shuffle } from 'lodash'
 import { Account } from 'models'
@@ -106,7 +106,7 @@ const KonnectorModal = ({
   /** Returns connection success contents, depending on the fluid and update status */
   const connectionSuccessContent = () => (
     <div className="konnector-config">
-      <Icon icon={successIcon} size={48} />
+      <StyledIcon icon={successIcon} size={48} />
       <div className="headerSuccess text-20-bold">
         {t(`konnector_modal.success_${isUpdating ? 'update_' : ''}txt`)}
       </div>
@@ -189,7 +189,7 @@ const KonnectorModal = ({
                   {error === KonnectorError.LOGIN_FAILED && (
                     // LOGIN FAILED FOR ENEDIS AND EGL
                     <div className="konnector-config">
-                      <Icon icon={errorIcon} size={48} />
+                      <StyledIcon icon={errorIcon} size={48} />
                       <div className="headerError text-20-bold">
                         {t('konnector_modal.error_txt')}
                       </div>
@@ -208,27 +208,26 @@ const KonnectorModal = ({
                         </div>
                       )}
                       {/* Show common errors for enedis */}
-                      {fluidType === FluidType.ELECTRICITY && (
-                        <>
-                          {!showCommonErrors ? (
-                            <Button
-                              className="btnText"
-                              onClick={() => setShowCommonErrors(true)}
-                            >
-                              {t('konnector_modal.show_common_error')}
-                            </Button>
-                          ) : (
-                            <div
-                              className="commonErrorsList"
-                              dangerouslySetInnerHTML={{
-                                __html: t(
-                                  'konnector_modal.show_common_error_list'
-                                ),
-                              }}
-                            />
-                          )}
-                        </>
-                      )}
+                      {fluidType === FluidType.ELECTRICITY &&
+                        showCommonErrors && (
+                          <div
+                            className="commonErrorsList"
+                            dangerouslySetInnerHTML={{
+                              __html: t(
+                                'konnector_modal.show_common_error_list'
+                              ),
+                            }}
+                          />
+                        )}
+                      {fluidType === FluidType.ELECTRICITY &&
+                        !showCommonErrors && (
+                          <Button
+                            className="btnText"
+                            onClick={() => setShowCommonErrors(true)}
+                          >
+                            {t('konnector_modal.show_common_error')}
+                          </Button>
+                        )}
                     </div>
                   )}
                   {error === KonnectorError.TERMS_VERSION_MISMATCH &&
@@ -236,7 +235,7 @@ const KonnectorModal = ({
                     fluidType === FluidType.ELECTRICITY && (
                       // MISMATCH UPDATE ERROR ENEDIS
                       <div className="headerError konnector-config mismatch">
-                        <Icon icon={EnedisIcon} width={120} height={80} />
+                        <StyledIcon icon={EnedisIcon} width={120} height={80} />
                         <div className="title text-20-bold">
                           {t('konnector_modal.mismatch.title')}
                         </div>
@@ -255,7 +254,7 @@ const KonnectorModal = ({
                     KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED &&
                     fluidType === FluidType.GAS && (
                       <div className="konnector-config">
-                        <Icon icon={errorIcon} size={48} />
+                        <StyledIcon icon={errorIcon} size={48} />
                         <div className="headerError text-20-bold">
                           {t('konnector_modal.error_txt')}
                         </div>
@@ -274,7 +273,7 @@ const KonnectorModal = ({
                       KonnectorError.USER_ACTION_NEEDED_ACCOUNT_REMOVED && (
                       // DEFAULT CASE
                       <div className="konnector-config">
-                        <Icon icon={errorIcon} size={48} />
+                        <StyledIcon icon={errorIcon} size={48} />
                         <div className="headerError text-20-bold">
                           {t('konnector_modal.error_txt')}
                         </div>
diff --git a/src/components/Konnector/KonnectorModalFooter.tsx b/src/components/Konnector/KonnectorModalFooter.tsx
index 2023ed972c3f722676cdf813c66c8fdfe081bb36..8bc1b3be0050e4456009648007053d6670a0536d 100644
--- a/src/components/Konnector/KonnectorModalFooter.tsx
+++ b/src/components/Konnector/KonnectorModalFooter.tsx
@@ -1,7 +1,7 @@
 import Button from '@material-ui/core/Button'
 import { useClient } from 'cozy-client'
 import { SUCCESS_EVENT } from 'cozy-harvest-lib/dist/models/flowEvents'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { KonnectorError } from 'enums'
 import { Account } from 'models'
 import React, { useCallback } from 'react'
@@ -32,10 +32,10 @@ const KonnectorModalFooter = ({
   const client = useClient()
   const navigate = useNavigate()
 
-  const handleSGELoginRetry = useCallback(() => {
+  const handleSGELoginRetry = () => {
     handleCloseClick(state === SUCCESS_EVENT)
     navigate('/connect/electricity')
-  }, [handleCloseClick, navigate, state])
+  }
 
   const handleResetSGEAccount = useCallback(async () => {
     if (account) {
@@ -68,16 +68,6 @@ const KonnectorModalFooter = ({
         <div>{t('konnector_modal.button_try_again')}</div>
       </Button>
     )
-  } else if (error === KonnectorError.CHALLENGE_ASKED) {
-    return (
-      <Button
-        aria-label={t('konnector_modal.accessibility.button_close')}
-        onClick={() => handleCloseClick(state === SUCCESS_EVENT)}
-        className="btnPrimary"
-      >
-        <div>{t('konnector_modal.button_come_back_later')}</div>
-      </Button>
-    )
   } else if (error === KonnectorError.TERMS_VERSION_MISMATCH) {
     return (
       <div className="buttons">
diff --git a/src/components/Konnector/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx
index 91096b619b35cdc7b282dcaa19b014b05f7f02f1..24b0578d9cf4bb622e2b6949c51147243ae83c76 100644
--- a/src/components/Konnector/KonnectorViewerCard.tsx
+++ b/src/components/Konnector/KonnectorViewerCard.tsx
@@ -22,8 +22,7 @@ import {
   LOGIN_SUCCESS_EVENT,
   SUCCESS_EVENT,
 } from 'cozy-harvest-lib/dist/models/flowEvents'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import {
   FluidSlugType,
   FluidState,
@@ -140,7 +139,7 @@ const KonnectorViewerCard = ({
         })
       )
       // Check is duel is done and display notification
-      const { isDone } = await challengeService.isChallengeDone(
+      const { isDone } = challengeService.isChallengeDone(
         updatedUserChallenge,
         dataloads
       )
@@ -183,11 +182,17 @@ const KonnectorViewerCard = ({
       const isEnedisCodeInseeError =
         !isUpdating && fluidType === FluidType.ELECTRICITY
 
+      const isGRDFError =
+        fluidType === FluidType.GAS &&
+        (konnectorErrorDescription === KonnectorError.MAINTENANCE ||
+          konnectorErrorDescription === KonnectorError.VENDOR_DOWN ||
+          konnectorErrorDescription ===
+            KonnectorError.USER_ACTION_NEEDED_CGU_FORM)
+
       const shouldDeleteAccount =
         account &&
         !isSuccess &&
-        account &&
-        (isGlobalLoginFailed || isEnedisCodeInseeError)
+        (isGlobalLoginFailed || isEnedisCodeInseeError || isGRDFError)
 
       if (shouldDeleteAccount) {
         logApp('info', `shouldDeleteAccount`)
@@ -342,7 +347,7 @@ const KonnectorViewerCard = ({
 
     return (
       <div className="konnector-icon">
-        <Icon
+        <StyledIcon
           icon={currentFluidStatus.connection.account ? iconType : OfflinePicto}
           size={49}
         />
@@ -481,7 +486,7 @@ const KonnectorViewerCard = ({
               `konnector_options.accessibility.button_toggle_detail_${currentFluidName}`
             )}
             expandIcon={
-              <Icon icon={chevronDown} size={16} className="accordion-icon" />
+              <StyledIcon icon={chevronDown} className="accordion-icon" />
             }
             classes={{
               root: 'expansion-panel-summary',
diff --git a/src/components/Konnector/KonnectorViewerList.spec.tsx b/src/components/Konnector/KonnectorViewerList.spec.tsx
index d1b3e7928c956e147b4925c503bd2f3710306cce..ec1693348682457abc3d37507be0785984157e98 100644
--- a/src/components/Konnector/KonnectorViewerList.spec.tsx
+++ b/src/components/Konnector/KonnectorViewerList.spec.tsx
@@ -14,7 +14,7 @@ jest.mock('react-router-dom', () => ({
 describe('KonnectorViewerList component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <KonnectorViewerList />
diff --git a/src/components/Konnector/KonnectorViewerList.tsx b/src/components/Konnector/KonnectorViewerList.tsx
index 152481df0a1011c53ff7b0a76440d155a106fb02..5b5f1ec0cfe855b4e7fcca86cc00a0b8eff1ab09 100644
--- a/src/components/Konnector/KonnectorViewerList.tsx
+++ b/src/components/Konnector/KonnectorViewerList.tsx
@@ -1,6 +1,6 @@
 import StyledCard from 'components/CommonKit/Card/StyledCard'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import { useNavigate } from 'react-router-dom'
@@ -20,15 +20,19 @@ const KonnectorViewerList = () => {
 
   return (
     <div className="konnector-section-root">
-      <div className="konnectorsList">
+      <div role="list" className="konnectorsList">
         {fluidStatus.map(fluidStatusItem => (
           <StyledCard
+            role="listitem"
             key={fluidStatusItem.fluidType}
             className="connection-card"
             onClick={() => goToFluid(fluidStatusItem.fluidType)}
             fluidType={fluidStatusItem.fluidType}
           >
-            <Icon icon={getAddPicto(fluidStatusItem.fluidType)} size={36} />
+            <StyledIcon
+              icon={getAddPicto(fluidStatusItem.fluidType)}
+              size={36}
+            />
             <div
               className={`konnector-title text-18-bold ${getFluidName(
                 fluidStatusItem.fluidType
diff --git a/src/components/Konnector/__snapshots__/KonnectorViewerList.spec.tsx.snap b/src/components/Konnector/__snapshots__/KonnectorViewerList.spec.tsx.snap
index 102a761bc6b23ce140012667112e749b927d0bd5..f8732ace78b8109259f46a185eaaed3394d62730 100644
--- a/src/components/Konnector/__snapshots__/KonnectorViewerList.spec.tsx.snap
+++ b/src/components/Konnector/__snapshots__/KonnectorViewerList.spec.tsx.snap
@@ -7,9 +7,11 @@ exports[`KonnectorViewerList component should be rendered correctly 1`] = `
   >
     <div
       class="konnectorsList"
+      role="list"
     >
       <button
         class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 connection-card electricity"
+        role="listitem"
         tabindex="0"
         type="button"
       >
@@ -17,6 +19,7 @@ exports[`KonnectorViewerList component should be rendered correctly 1`] = `
           class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="36"
             width="36"
@@ -40,6 +43,7 @@ exports[`KonnectorViewerList component should be rendered correctly 1`] = `
       </button>
       <button
         class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 connection-card water"
+        role="listitem"
         tabindex="0"
         type="button"
       >
@@ -47,6 +51,7 @@ exports[`KonnectorViewerList component should be rendered correctly 1`] = `
           class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="36"
             width="36"
@@ -70,6 +75,7 @@ exports[`KonnectorViewerList component should be rendered correctly 1`] = `
       </button>
       <button
         class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 connection-card gas"
+        role="listitem"
         tabindex="0"
         type="button"
       >
@@ -77,6 +83,7 @@ exports[`KonnectorViewerList component should be rendered correctly 1`] = `
           class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
         >
           <svg
+            aria-hidden="true"
             class="styles__icon___23x3R"
             height="36"
             width="36"
diff --git a/src/components/Loader/Loader.tsx b/src/components/Loader/Loader.tsx
index 2567549f2907564269e56c5070d7eb8b843f4f1f..b39445ec6c3fd1bfa706a883d776e3b2fb7cf396 100644
--- a/src/components/Loader/Loader.tsx
+++ b/src/components/Loader/Loader.tsx
@@ -1,4 +1,4 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
 import './Loader.scss'
@@ -18,16 +18,21 @@ const Loader = ({ color = 'gold', fluidType, text }: LoaderProps) => {
   const { t } = useI18n()
   let variant = color
 
-  switch (fluidType) {
-    case FluidType.ELECTRICITY:
-      variant = 'elec'
-      break
-    case FluidType.GAS:
-      variant = 'gaz'
-      break
-    case FluidType.WATER:
-      variant = 'water'
-      break
+  if (fluidType !== undefined) {
+    switch (fluidType) {
+      case FluidType.ELECTRICITY:
+        variant = 'elec'
+        break
+      case FluidType.GAS:
+        variant = 'gaz'
+        break
+      case FluidType.WATER:
+        variant = 'water'
+        break
+      case FluidType.MULTIFLUID:
+        variant = 'gold'
+        break
+    }
   }
 
   return (
diff --git a/src/components/Navbar/Navbar.spec.tsx b/src/components/Navbar/Navbar.spec.tsx
index d4d426391e22f6d6d75e9790458e9434831546e5..c41d4d1fad4ed060aa52baa7adc048a9ebab774e 100644
--- a/src/components/Navbar/Navbar.spec.tsx
+++ b/src/components/Navbar/Navbar.spec.tsx
@@ -3,7 +3,7 @@ import Navbar from 'components/Navbar/Navbar'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { BrowserRouter } from 'react-router-dom'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockGlobalState } from 'tests/__mocks__/store'
 
 describe('Navbar component', () => {
   it('should be rendered correctly with 5 navlink', () => {
@@ -21,6 +21,7 @@ describe('Navbar component', () => {
   it('should be rendered correctly with notifications', () => {
     const store = createMockEcolyoStore({
       global: {
+        ...mockGlobalState,
         challengeExplorationNotification: true,
         challengeActionNotification: false,
         challengeDuelNotification: false,
@@ -41,6 +42,7 @@ describe('Navbar component', () => {
   it('should be rendered correctly without notifications', () => {
     const store = createMockEcolyoStore({
       global: {
+        ...mockGlobalState,
         challengeExplorationNotification: false,
         challengeActionNotification: false,
         challengeDuelNotification: false,
diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx
index 581cbba1c52a86544306ae6db1d7dfb49ee43f54..ec88250afa73c81b6f9c0e6ccc543031e8e9a8c0 100644
--- a/src/components/Navbar/Navbar.tsx
+++ b/src/components/Navbar/Navbar.tsx
@@ -11,7 +11,7 @@ import ParameterIconOff from 'assets/icons/tabbar/parametre/parametre-off.svg'
 import ParameterIconOn from 'assets/icons/tabbar/parametre/parametre-on.svg'
 import logos from 'assets/png/logos_partenaires.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { NavLink, useLocation } from 'react-router-dom'
 import { useAppSelector } from 'store/hooks'
@@ -98,10 +98,7 @@ const Navbar = () => {
         </ul>
       </nav>
       <div role="contentinfo" className="logos-container">
-        <img
-          src={logos}
-          alt="Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
-        />
+        <img src={logos} alt={t(`common.funders_logo`)} />
       </div>
     </aside>
   )
diff --git a/src/components/Navbar/navBar.scss b/src/components/Navbar/navBar.scss
index c65e38f0b3b078de768942f2148aa9ff90a78013..e5343a7902d1f20a21d2c8379a836067ca183180 100644
--- a/src/components/Navbar/navBar.scss
+++ b/src/components/Navbar/navBar.scss
@@ -5,7 +5,9 @@
 .o-sidebar {
   width: 15%;
   background-color: $bottom-bar-grey;
-  box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.2), 0px 3px 14px rgba(0, 0, 0, 0.12),
+  box-shadow:
+    0px 5px 5px rgba(0, 0, 0, 0.2),
+    0px 3px 14px rgba(0, 0, 0, 0.12),
     0px 8px 10px rgba(0, 0, 0, 0.14);
   border-top: unset;
   border-right: unset;
@@ -53,7 +55,9 @@
 }
 
 .c-nav-item {
+  color: $white-light;
   &:hover {
+    background: rgba(0, 0, 0, 0.1);
     a,
     svg {
       color: $white !important;
@@ -72,7 +76,8 @@
     .c-nav-icon {
       width: 60px;
       height: 36px;
-      fill: none;
+      fill: $soft-grey;
+      color: $soft-grey;
     }
     .on {
       display: none;
@@ -90,7 +95,9 @@
         color: $gold !important;
       }
       &:focus-visible {
-        box-shadow: inset 0 0 0 1px $grey-bright, inset 0.25rem 0 0 0 $gold;
+        box-shadow:
+          inset 0 0 0 1px $grey-bright,
+          inset 0.25rem 0 0 0 $gold;
       }
       .on {
         display: block;
@@ -107,6 +114,11 @@
     height: 56px;
   }
 
+  .c-nav {
+    margin-top: 4px;
+    margin-bottom: 0;
+  }
+
   .c-nav-item {
     height: 54px;
     margin: -0.3rem 0 0 0;
diff --git a/src/components/Options/Accessibility/Accessibility.tsx b/src/components/Options/Accessibility/Accessibility.tsx
deleted file mode 100644
index 383cef8c7284986b2bfd8c61c37da2c0ee69257e..0000000000000000000000000000000000000000
--- a/src/components/Options/Accessibility/Accessibility.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import Link from '@material-ui/core/Link'
-import AccessibilityIcon from 'assets/icons/ico/accessibility.svg'
-import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import React from 'react'
-import '../GCU/gcuLink.scss'
-
-const Accessibility = () => {
-  const { t } = useI18n()
-  return (
-    <div className="gcu-link-root">
-      <div className="gcu-link-content">
-        <Link
-          className="gcu-link-card-link"
-          href="https://ecolyo.com/accessibilite.html"
-          target="_blank"
-        >
-          <div className="card">
-            <div className="gcu-link-card">
-              <div className="gcu-link-card-content">
-                <StyledIcon
-                  className="gcu-link-card-content-icon"
-                  icon={AccessibilityIcon}
-                  size={42}
-                />
-                <div className="gcu-link-card-content-title">
-                  {t('common.title_accessibility')}
-                </div>
-              </div>
-            </div>
-          </div>
-        </Link>
-      </div>
-    </div>
-  )
-}
-
-export default Accessibility
diff --git a/src/components/Options/AccessibilityLink/AccessibilityLink.tsx b/src/components/Options/AccessibilityLink/AccessibilityLink.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..aa81fc3926c016f34c5b6ea7f80603fa8110a848
--- /dev/null
+++ b/src/components/Options/AccessibilityLink/AccessibilityLink.tsx
@@ -0,0 +1,27 @@
+import AccessibilityIcon from 'assets/icons/ico/accessibility.svg'
+import StyledCard from 'components/CommonKit/Card/StyledCard'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import React from 'react'
+import '../OptionsView.scss'
+
+const AccessibilityLink = () => {
+  const { t } = useI18n()
+
+  const goToAccessibility = () => {
+    window.open('https://ecolyo.com/accessibilite.html')
+  }
+
+  return (
+    <div className="styled-card-root">
+      <div className="styled-card-content">
+        <StyledCard onClick={goToAccessibility}>
+          <StyledIcon icon={AccessibilityIcon} size={38} />
+          {t('common.title_accessibility')}
+        </StyledCard>
+      </div>
+    </div>
+  )
+}
+
+export default AccessibilityLink
diff --git a/src/components/Options/ExportData/ExportData.tsx b/src/components/Options/ExportData/ExportData.tsx
index 5127480c547af8ada1f7bc66b8f6b3e3ce970038..4a282b461713d2a063998d3f4fc6fca9f4a0fe95 100644
--- a/src/components/Options/ExportData/ExportData.tsx
+++ b/src/components/Options/ExportData/ExportData.tsx
@@ -3,12 +3,13 @@ import {
   AccordionDetails,
   AccordionSummary,
   Button,
+  Checkbox,
 } from '@material-ui/core'
 import chevronDown from 'assets/icons/ico/chevron-down.svg'
 import exportIcon from 'assets/icons/ico/export.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType, TimeStep } from 'enums'
 import { remove } from 'lodash'
 import React, { useEffect, useMemo, useState } from 'react'
@@ -26,19 +27,13 @@ const ExportData = () => {
     [client]
   )
 
-  const [isExportStartModal, setIsExportStartModal] = useState<boolean>(false)
-  const [isExportLoadingModal, setIsExportLoadingModal] =
-    useState<boolean>(false)
-  const [isExportDoneModal, setIsExportDoneModal] = useState<boolean>(false)
-  const [hasError, setHasError] = useState<boolean>(false)
+  const [showExportModal, setShowExportModal] = useState<
+    'start' | 'loading' | 'done' | null
+  >(null)
+  const [hasError, setHasError] = useState(false)
   const [exportableFluids, setExportableFluids] = useState<FluidType[]>([])
   const [answer, setAnswer] = useState<FluidType[]>([])
-
-  const [active, setActive] = useState<boolean>(false)
-
-  const toggleAccordion = () => {
-    setActive(prev => !prev)
-  }
+  const [isExpanded, setIsExpanded] = useState(false)
 
   const handleChange = (value: FluidType) => {
     const tempAnswer = [...answer]
@@ -62,35 +57,18 @@ const ExportData = () => {
       subscribed = false
     }
 
-    if (subscribed) {
-      getExportableFluids()
-    }
+    subscribed && getExportableFluids()
+
     return () => {
       subscribed = false
     }
   }, [consumptionService])
 
-  const fluidCheckbox = () =>
-    exportableFluids.map(fluidType => (
-      <label key={fluidType}>
-        <input
-          type="checkbox"
-          className="inputCheckbox"
-          value={fluidType}
-          name={t(`FLUID.${FluidType[fluidType]}.LABEL`)}
-          onChange={() => handleChange(fluidType)}
-          checked={answer.includes(fluidType)}
-        />
-        {t(`FLUID.${FluidType[fluidType]}.LABEL`)}
-      </label>
-    ))
-
   const handleDone = (e?: unknown) => {
     if (e) {
       setHasError(true)
     }
-    setIsExportDoneModal(true)
-    setIsExportLoadingModal(false)
+    setShowExportModal('done')
   }
 
   return (
@@ -98,8 +76,8 @@ const ExportData = () => {
       <div className="export-option-root">
         <div className="export-option-content">
           <Accordion
-            expanded={active}
-            onChange={toggleAccordion}
+            expanded={isExpanded}
+            onChange={() => setIsExpanded(prev => !prev)}
             classes={{
               root: 'expansion-panel-root',
             }}
@@ -107,14 +85,14 @@ const ExportData = () => {
             <AccordionSummary
               aria-label={t('profile_type.accessibility.button_toggle_export')}
               expandIcon={
-                <Icon icon={chevronDown} size={16} className="accordion-icon" />
+                <StyledIcon icon={chevronDown} className="accordion-icon" />
               }
               classes={{
                 root: 'expansion-panel-summary',
                 content: 'expansion-panel-content',
               }}
             >
-              <Icon className="export-icon" icon={exportIcon} size={42} />
+              <StyledIcon className="export-icon" icon={exportIcon} size={42} />
               <div className="text-16-normal accordion-title">
                 {t('export.title_export')}
               </div>
@@ -131,10 +109,22 @@ const ExportData = () => {
                 <div className="text-15-normal grey">{t('export.no_data')}</div>
               ) : (
                 <>
-                  {fluidCheckbox()}
+                  {exportableFluids.map(fluidType => (
+                    <label htmlFor={`export-${fluidType}`} key={fluidType}>
+                      <Checkbox
+                        id={`export-${fluidType}`}
+                        value={fluidType}
+                        onChange={() => handleChange(fluidType)}
+                        checked={answer.includes(fluidType)}
+                      />
+                      {t(`FLUID.${FluidType[fluidType]}.LABEL`)}
+                    </label>
+                  ))}
                   <Button
-                    aria-label={t('unsubscribe.button_accessibility')}
-                    onClick={() => setIsExportStartModal(true)}
+                    aria-label={t(
+                      'profile_type.accessibility.button_export_data'
+                    )}
+                    onClick={() => setShowExportModal('start')}
                     className="btnSecondary"
                     disabled={answer.length === 0}
                   >
@@ -147,25 +137,20 @@ const ExportData = () => {
         </div>
       </div>
       <ExportStartModal
-        open={isExportStartModal}
-        handleCloseClick={() => setIsExportStartModal(false)}
-        handleDownloadClick={() => {
-          setIsExportStartModal(false)
-          setIsExportLoadingModal(true)
-        }}
+        open={showExportModal === 'start'}
+        handleCloseClick={() => setShowExportModal(null)}
+        handleDownloadClick={() => setShowExportModal('loading')}
       />
       <ExportLoadingModal
-        open={isExportLoadingModal}
-        handleCloseClick={() => {
-          setIsExportLoadingModal(false)
-        }}
+        open={showExportModal === 'loading'}
+        handleCloseClick={() => setShowExportModal(null)}
         handleDone={e => handleDone(e)}
         selectedFluids={answer}
       />
       <ExportDoneModal
-        open={isExportDoneModal}
+        open={showExportModal === 'done'}
         error={hasError}
-        handleCloseClick={() => setIsExportDoneModal(false)}
+        handleCloseClick={() => setShowExportModal(null)}
       />
     </>
   )
diff --git a/src/components/Options/ExportData/Modals/__snapshots__/exportDoneModal.spec.tsx.snap b/src/components/Options/ExportData/Modals/__snapshots__/exportDoneModal.spec.tsx.snap
index 565c7d0f4a4835d135788e7179a1b10afe7fb157..a057c53700ae6c9688e271366dff865bc41a1c19 100644
--- a/src/components/Options/ExportData/Modals/__snapshots__/exportDoneModal.spec.tsx.snap
+++ b/src/components/Options/ExportData/Modals/__snapshots__/exportDoneModal.spec.tsx.snap
@@ -50,6 +50,7 @@ exports[`exportDoneModal component should be rendered correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="18"
                 width="18"
@@ -70,6 +71,7 @@ exports[`exportDoneModal component should be rendered correctly 1`] = `
               class="icon-main"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="44"
                 width="44"
@@ -164,6 +166,7 @@ exports[`exportDoneModal component should display error message 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="18"
                 width="18"
@@ -184,6 +187,7 @@ exports[`exportDoneModal component should display error message 1`] = `
               class="icon-main"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="44"
                 width="44"
diff --git a/src/components/Options/ExportData/Modals/__snapshots__/exportLoadingModal.spec.tsx.snap b/src/components/Options/ExportData/Modals/__snapshots__/exportLoadingModal.spec.tsx.snap
index 523b4daa57c80aebfcdcdcc360170ee7023689a5..2f9b5cf5f52b622b1d3d4146ad32e41db92d629d 100644
--- a/src/components/Options/ExportData/Modals/__snapshots__/exportLoadingModal.spec.tsx.snap
+++ b/src/components/Options/ExportData/Modals/__snapshots__/exportLoadingModal.spec.tsx.snap
@@ -50,6 +50,7 @@ exports[`ExportLoadingModal component should be rendered correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="18"
                 width="18"
@@ -100,7 +101,6 @@ exports[`ExportLoadingModal component should be rendered correctly 1`] = `
               export.modal_loading.text2
             </div>
             <button
-              aria-label="export.modal_loading.button_cancel"
               class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
               tabindex="0"
               type="button"
diff --git a/src/components/Options/ExportData/Modals/__snapshots__/exportStartModal.spec.tsx.snap b/src/components/Options/ExportData/Modals/__snapshots__/exportStartModal.spec.tsx.snap
index dcd482806bf0e6bf6615d974fcdbbef16d16b656..8d325403f6d63a376930aec11d62eff44078efae 100644
--- a/src/components/Options/ExportData/Modals/__snapshots__/exportStartModal.spec.tsx.snap
+++ b/src/components/Options/ExportData/Modals/__snapshots__/exportStartModal.spec.tsx.snap
@@ -50,6 +50,7 @@ exports[`exportStartModal component should be rendered correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="18"
                 width="18"
@@ -70,6 +71,7 @@ exports[`exportStartModal component should be rendered correctly 1`] = `
               class="icon-main"
             >
               <svg
+                aria-hidden="true"
                 class="styles__icon___23x3R"
                 height="48"
                 width="48"
@@ -93,7 +95,6 @@ exports[`exportStartModal component should be rendered correctly 1`] = `
               class="buttons"
             >
               <button
-                aria-label="export.modal_start.button_cancel"
                 class="MuiButtonBase-root MuiButton-root MuiButton-text btnSecondary"
                 tabindex="0"
                 type="button"
@@ -108,7 +109,6 @@ exports[`exportStartModal component should be rendered correctly 1`] = `
                 />
               </button>
               <button
-                aria-label="export.button_download"
                 class="MuiButtonBase-root MuiButton-root MuiButton-text btnPrimary"
                 tabindex="0"
                 type="button"
diff --git a/src/components/Options/ExportData/Modals/exportDoneModal.tsx b/src/components/Options/ExportData/Modals/exportDoneModal.tsx
index 79d7a24dbe5881b54bc0fe3c14e7bc7a375fb9dc..602241786edd399e174531e1db68c0182d661a8b 100644
--- a/src/components/Options/ExportData/Modals/exportDoneModal.tsx
+++ b/src/components/Options/ExportData/Modals/exportDoneModal.tsx
@@ -1,10 +1,11 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import exportDone from 'assets/icons/ico/exportDone.svg'
 import warnCross from 'assets/icons/ico/warn-cross.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './exportDoneModal.scss'
 
@@ -36,17 +37,17 @@ const ExportDoneModal = ({
       </div>
 
       <div className="modal-done-root">
-        <IconButton
+        <StyledIconButton
+          icon={CloseIcon}
+          sized={18}
+          onClick={handleCloseClick}
           aria-label={t('export.button_close')}
           className="modal-paper-close-button"
-          onClick={handleCloseClick}
-        >
-          <Icon icon={CloseIcon} size={18} />
-        </IconButton>
+        />
 
         <div className="content">
           <div className="icon-main">
-            <Icon icon={error ? warnCross : exportDone} size={44} />
+            <StyledIcon icon={error ? warnCross : exportDone} size={44} />
           </div>
           {!error && (
             <>
diff --git a/src/components/Options/ExportData/Modals/exportLoadingModal.tsx b/src/components/Options/ExportData/Modals/exportLoadingModal.tsx
index f25b2e28cd389aa8e53eca6aa830f70f4979bf73..1f0f560992bb6d6d792ed8f8b2249627942ee36c 100644
--- a/src/components/Options/ExportData/Modals/exportLoadingModal.tsx
+++ b/src/components/Options/ExportData/Modals/exportLoadingModal.tsx
@@ -1,222 +1,218 @@
-import { Button, IconButton } from '@material-ui/core'
-import Dialog from '@material-ui/core/Dialog'
-import * as Sentry from '@sentry/react'
-import CloseIcon from 'assets/icons/ico/close.svg'
-import Loader from 'components/Loader/Loader'
-import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
-import { FluidType, TimeStep } from 'enums'
-import FileSaver from 'file-saver'
-import { Datachart, Dataload, TimePeriod } from 'models'
-import React, { useCallback, useEffect } from 'react'
-import ConsumptionDataManager from 'services/consumption.service'
-import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service'
-import { formatTwoDigits, getFluidName } from 'utils/utils'
-import * as XLSX from 'xlsx'
-import './exportLoadingModal.scss'
-
-interface ExportDataRow {
-  [key: string]: string | number
-}
-
-interface ExportDataSheet {
-  fluidName: string
-  data: ExportDataRow[]
-}
-
-interface ExportLoadingModalProps {
-  open: boolean
-  handleCloseClick: () => void
-  handleDone: (e?: unknown) => void
-  selectedFluids: FluidType[]
-}
-
-const ExportLoadingModal = ({
-  open,
-  handleCloseClick,
-  handleDone,
-  selectedFluids,
-}: ExportLoadingModalProps) => {
-  const { t } = useI18n()
-  const client = useClient()
-
-  const fileType =
-    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'
-  const fileExtension = '.xlsx'
-
-  const exportToXlsx = (
-    exportDataSheets: ExportDataSheet[],
-    fileName: string
-  ) => {
-    const wb = XLSX.utils.book_new()
-    for (const dataSheet of exportDataSheets) {
-      const ws = XLSX.utils.json_to_sheet(dataSheet.data)
-      XLSX.utils.book_append_sheet(wb, ws, dataSheet.fluidName)
-    }
-    const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
-    const data = new Blob([excelBuffer], { type: fileType })
-    FileSaver.saveAs(data, fileName + fileExtension)
-  }
-
-  const buildDataRow = useCallback(
-    async (
-      dataload: Dataload,
-      fluidType: FluidType
-    ): Promise<ExportDataRow> => {
-      const dataRow: ExportDataRow = {}
-      const fluidName = getFluidName(fluidType)
-      dataRow[t('export.month')] = formatTwoDigits(dataload.date.month)
-      dataRow[t('export.year')] = dataload.date.year
-      dataRow[
-        `${t('export.consumption')} (${t('FLUID.' + fluidName + '.UNIT')})`
-      ] = dataload.value
-      if (fluidType === FluidType.ELECTRICITY) {
-        const emas = new EnedisMonthlyAnalysisDataService(client)
-        const maxPowerEntities = await emas.getMaxPowerByDate(
-          dataload.date.year,
-          dataload.date.month
-        )
-        if (maxPowerEntities) {
-          const maxLoad = maxPowerEntities.reduce((max, entity) => {
-            if (entity.load > max) {
-              return entity.load
-            }
-            return max
-          }, 0)
-          dataRow[t('export.maxpower')] = maxLoad
-        }
-      }
-      return dataRow
-    },
-    [client, t]
-  )
-
-  const getExportDataSheet = useCallback(
-    async (fluidType: FluidType): Promise<ExportDataSheet | null> => {
-      const consumptionService = new ConsumptionDataManager(client)
-      const firstDataDate = await consumptionService.fetchAllFirstDateData(
-        [fluidType],
-        TimeStep.MONTH
-      )
-      const lastDataDate = await consumptionService.fetchAllLastDateData(
-        [fluidType],
-        TimeStep.MONTH
-      )
-      if (!firstDataDate[0] || !lastDataDate[0]) return null
-
-      const timePeriod: TimePeriod = {
-        startDate: firstDataDate[0],
-        endDate: lastDataDate[0],
-      }
-
-      const dataLoad: Datachart | null = await consumptionService.getGraphData(
-        timePeriod,
-        TimeStep.MONTH,
-        [fluidType],
-        undefined,
-        undefined,
-        false,
-        true
-      )
-
-      if (!dataLoad?.actualData) return null
-
-      const exportDataSheet: ExportDataSheet = {
-        fluidName: t(`FLUID.${FluidType[fluidType]}.LABEL`),
-        data: [],
-      }
-
-      for (const data of dataLoad.actualData) {
-        if (data.value === -1) continue
-        const dataRow = await buildDataRow(data, fluidType)
-        exportDataSheet.data.push(dataRow)
-      }
-      return exportDataSheet
-    },
-    [buildDataRow, client, t]
-  )
-
-  useEffect(() => {
-    let subscribed = true
-    const date = new Date()
-
-    const exportData = async (): Promise<void> => {
-      try {
-        const exportDataSheets: ExportDataSheet[] = []
-        for (const fluidType of selectedFluids) {
-          const exportDataFluid = await getExportDataSheet(fluidType)
-          if (exportDataFluid) {
-            exportDataSheets.push(exportDataFluid)
-          }
-        }
-        await new Promise(r => setTimeout(r, 2000))
-        if (subscribed) {
-          exportToXlsx(
-            exportDataSheets,
-            'ecolyo_data_' + date.toLocaleDateString()
-          )
-          handleDone()
-        }
-      } catch (e) {
-        Sentry.captureException(e)
-        handleDone(e)
-      }
-    }
-
-    if (subscribed && open) {
-      exportData()
-    }
-    return () => {
-      subscribed = false
-    }
-  }, [getExportDataSheet, handleDone, open, selectedFluids])
-
-  return (
-    <Dialog
-      open={open}
-      onClose={(_event, reason) => {
-        if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') {
-          handleCloseClick()
-        }
-      }}
-      aria-labelledby="accessibility-title"
-      classes={{
-        root: 'modal-root',
-        paper: 'modal-paper',
-      }}
-    >
-      <div id="accessibility-title">
-        {t('export.modal_loading.accessibility_title')}
-      </div>
-
-      <div className="modal-loading-root">
-        <IconButton
-          aria-label={t('export.button_close')}
-          className="modal-paper-close-button"
-          onClick={handleCloseClick}
-        >
-          <Icon icon={CloseIcon} size={18} />
-        </IconButton>
-        <div className="content">
-          <div className="icon-main">
-            <Loader color="gold" />
-          </div>
-          <div className="text-16-bold subtitle">
-            {t('export.modal_loading.text1')}
-          </div>
-          <div>{t('export.modal_loading.text2')}</div>
-          <Button
-            aria-label={t('export.modal_loading.button_cancel')}
-            onClick={handleCloseClick}
-            className="btnSecondary"
-          >
-            {t('export.modal_loading.button_cancel')}
-          </Button>
-        </div>
-      </div>
-    </Dialog>
-  )
-}
-
-export default ExportLoadingModal
+import { Button } from '@material-ui/core'
+import Dialog from '@material-ui/core/Dialog'
+import * as Sentry from '@sentry/react'
+import CloseIcon from 'assets/icons/ico/close.svg'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import Loader from 'components/Loader/Loader'
+import { useClient } from 'cozy-client'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import { FluidType, TimeStep } from 'enums'
+import FileSaver from 'file-saver'
+import { Dataload, TimePeriod } from 'models'
+import React, { useCallback, useEffect } from 'react'
+import ConsumptionDataManager from 'services/consumption.service'
+import EnedisMonthlyAnalysisDataService from 'services/enedisMonthlyAnalysisData.service'
+import { formatTwoDigits, getFluidName } from 'utils/utils'
+import * as XLSX from 'xlsx'
+import './exportLoadingModal.scss'
+
+interface ExportDataRow {
+  [key: string]: string | number
+}
+
+interface ExportDataSheet {
+  fluidName: string
+  data: ExportDataRow[]
+}
+
+interface ExportLoadingModalProps {
+  open: boolean
+  handleCloseClick: () => void
+  handleDone: (e?: unknown) => void
+  selectedFluids: FluidType[]
+}
+
+const ExportLoadingModal = ({
+  open,
+  handleCloseClick,
+  handleDone,
+  selectedFluids,
+}: ExportLoadingModalProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+
+  const fileType =
+    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8'
+  const fileExtension = '.xlsx'
+
+  const exportToXlsx = (
+    exportDataSheets: ExportDataSheet[],
+    fileName: string
+  ) => {
+    const wb = XLSX.utils.book_new()
+    for (const dataSheet of exportDataSheets) {
+      const ws = XLSX.utils.json_to_sheet(dataSheet.data)
+      XLSX.utils.book_append_sheet(wb, ws, dataSheet.fluidName)
+    }
+    const excelBuffer = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
+    const data = new Blob([excelBuffer], { type: fileType })
+    FileSaver.saveAs(data, fileName + fileExtension)
+  }
+
+  const buildDataRow = useCallback(
+    async (
+      dataload: Dataload,
+      fluidType: FluidType
+    ): Promise<ExportDataRow> => {
+      const dataRow: ExportDataRow = {}
+      const FLUIDNAME = getFluidName(fluidType).toUpperCase()
+      dataRow[t('export.month')] = formatTwoDigits(dataload.date.month)
+      dataRow[t('export.year')] = dataload.date.year
+      dataRow[
+        `${t('export.consumption')} (${t('FLUID.' + FLUIDNAME + '.UNIT')})`
+      ] = dataload.value
+      if (fluidType === FluidType.ELECTRICITY) {
+        const emas = new EnedisMonthlyAnalysisDataService(client)
+        const maxPowerEntities = await emas.getMaxPowerByDate(
+          dataload.date.year,
+          dataload.date.month
+        )
+        if (maxPowerEntities) {
+          const maxLoad = maxPowerEntities.reduce((max, entity) => {
+            if (entity.load > max) {
+              return entity.load
+            }
+            return max
+          }, 0)
+          dataRow[t('export.maxpower')] = maxLoad
+        }
+      }
+      return dataRow
+    },
+    [client, t]
+  )
+
+  const getExportDataSheet = useCallback(
+    async (fluidType: FluidType): Promise<ExportDataSheet | null> => {
+      const consumptionService = new ConsumptionDataManager(client)
+      const [firstDataDates, lastDataDates] = await Promise.all([
+        consumptionService.fetchAllFirstDateData([fluidType], TimeStep.MONTH),
+        consumptionService.fetchAllLastDateData([fluidType], TimeStep.MONTH),
+      ])
+      const firstDataDate = firstDataDates[0]
+      const lastDataDate = lastDataDates[0]
+
+      if (!firstDataDate || !lastDataDate) return null
+
+      const timePeriod: TimePeriod = {
+        startDate: firstDataDate,
+        endDate: lastDataDate,
+      }
+
+      const dataLoad = await consumptionService.getGraphData({
+        timePeriod,
+        timeStep: TimeStep.MONTH,
+        fluidTypes: [fluidType],
+        isHome: false,
+        isExport: true,
+      })
+
+      if (!dataLoad?.actualData) return null
+
+      const exportDataSheet: ExportDataSheet = {
+        fluidName: t(`FLUID.${FluidType[fluidType]}.LABEL`),
+        data: [],
+      }
+
+      for (const data of dataLoad.actualData) {
+        if (data.value === -1) continue
+        const dataRow = await buildDataRow(data, fluidType)
+        exportDataSheet.data.push(dataRow)
+      }
+      return exportDataSheet
+    },
+    [buildDataRow, client, t]
+  )
+
+  useEffect(() => {
+    let subscribed = true
+    const date = new Date()
+    let timeout: ReturnType<typeof setTimeout>
+
+    const exportData = async (): Promise<void> => {
+      try {
+        const exportDataSheets: ExportDataSheet[] = []
+        for (const fluidType of selectedFluids) {
+          const exportDataFluid = await getExportDataSheet(fluidType)
+          if (exportDataFluid) {
+            exportDataSheets.push(exportDataFluid)
+          }
+        }
+        timeout = setTimeout(() => {
+          if (subscribed) {
+            exportToXlsx(
+              exportDataSheets,
+              'ecolyo_data_' + date.toLocaleDateString()
+            )
+            handleDone()
+          }
+        }, 2000)
+      } catch (e) {
+        Sentry.captureException(e)
+        handleDone(e)
+      }
+    }
+
+    if (subscribed && open) {
+      exportData()
+    }
+    return () => {
+      subscribed = false
+      clearTimeout(timeout)
+    }
+  }, [getExportDataSheet, handleDone, open, selectedFluids])
+
+  return (
+    <Dialog
+      open={open}
+      onClose={(_event, reason) => {
+        if (reason !== 'backdropClick' && reason !== 'escapeKeyDown') {
+          handleCloseClick()
+        }
+      }}
+      aria-labelledby="accessibility-title"
+      classes={{
+        root: 'modal-root',
+        paper: 'modal-paper',
+      }}
+    >
+      <div id="accessibility-title">
+        {t('export.modal_loading.accessibility_title')}
+      </div>
+
+      <div className="modal-loading-root">
+        <StyledIconButton
+          icon={CloseIcon}
+          sized={18}
+          onClick={handleCloseClick}
+          aria-label={t('export.button_close')}
+          className="modal-paper-close-button"
+        />
+        <div className="content">
+          <div className="icon-main">
+            <Loader color="gold" />
+          </div>
+          <div className="text-16-bold subtitle">
+            {t('export.modal_loading.text1')}
+          </div>
+          <div>{t('export.modal_loading.text2')}</div>
+          <Button onClick={handleCloseClick} className="btnSecondary">
+            {t('export.modal_loading.button_cancel')}
+          </Button>
+        </div>
+      </div>
+    </Dialog>
+  )
+}
+
+export default ExportLoadingModal
diff --git a/src/components/Options/ExportData/Modals/exportStartModal.tsx b/src/components/Options/ExportData/Modals/exportStartModal.tsx
index 42c9e48666cd4c446aaded19923adb9ee63b50af..f06f8fdfc68761b37d16b75fc1c95cb4ae85edac 100644
--- a/src/components/Options/ExportData/Modals/exportStartModal.tsx
+++ b/src/components/Options/ExportData/Modals/exportStartModal.tsx
@@ -1,9 +1,10 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import download from 'assets/icons/ico/download.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './exportStartModal.scss'
 
@@ -34,16 +35,16 @@ const ExportStartModal = ({
         {t('export.modal_start.accessibility_title')}
       </div>
       <div className="modal-start-root">
-        <IconButton
+        <StyledIconButton
+          icon={CloseIcon}
+          sized={18}
+          onClick={handleCloseClick}
           aria-label={t('export.button_close')}
           className="modal-paper-close-button"
-          onClick={handleCloseClick}
-        >
-          <Icon icon={CloseIcon} size={18} />
-        </IconButton>
+        />
         <div className="content">
           <div className="icon-main">
-            <Icon icon={download} size={48} />
+            <StyledIcon icon={download} size={48} />
           </div>
           <div className="text-16-bold subtitle">
             {t('export.modal_start.text1')}
@@ -54,18 +55,10 @@ const ExportStartModal = ({
             {t('export.modal_start.text3')}
           </div>
           <div className="buttons">
-            <Button
-              aria-label={t('export.modal_start.button_cancel')}
-              onClick={handleCloseClick}
-              className="btnSecondary"
-            >
+            <Button onClick={handleCloseClick} className="btnSecondary">
               {t('export.modal_start.button_cancel')}
             </Button>
-            <Button
-              aria-label={t('export.button_download')}
-              onClick={handleDownloadClick}
-              className="btnPrimary"
-            >
+            <Button onClick={handleDownloadClick} className="btnPrimary">
               {t('export.button_download')}
             </Button>
           </div>
diff --git a/src/components/Options/ExportData/__snapshots__/ExportData.spec.tsx.snap b/src/components/Options/ExportData/__snapshots__/ExportData.spec.tsx.snap
index 7bfb4b7882eb8397b07bade0bbd7b63505a5b3ec..186567d961030f0246af7dfe06dd4119c165b1bb 100644
--- a/src/components/Options/ExportData/__snapshots__/ExportData.spec.tsx.snap
+++ b/src/components/Options/ExportData/__snapshots__/ExportData.spec.tsx.snap
@@ -23,6 +23,7 @@ exports[`exportOptions component should be rendered correctly 1`] = `
             class="MuiAccordionSummary-content expansion-panel-content"
           >
             <svg
+              aria-hidden="true"
               class="export-icon styles__icon___23x3R"
               height="42"
               width="42"
@@ -46,6 +47,7 @@ exports[`exportOptions component should be rendered correctly 1`] = `
               class="MuiIconButton-label"
             >
               <svg
+                aria-hidden="true"
                 class="accordion-icon styles__icon___23x3R"
                 height="16"
                 width="16"
diff --git a/src/components/Options/ExportData/exportData.scss b/src/components/Options/ExportData/exportData.scss
index 38965f5bda1dfdb3df48e6da1c58ed4bc7f6c841..416f123b3caa3f5cd74e5e426f6f30e46629fa50 100644
--- a/src/components/Options/ExportData/exportData.scss
+++ b/src/components/Options/ExportData/exportData.scss
@@ -10,7 +10,6 @@ div.expansion-panel-root.Mui-expanded:last-child {
   flex-direction: column;
   align-items: center;
   justify-content: center;
-  margin-top: 0.5rem;
   padding: 0 1.5rem;
 
   .export-option-content {
diff --git a/src/components/Options/GCU/GCUContent.tsx b/src/components/Options/GCU/GCUContent.tsx
index e15457d091369bf4469a944c6b44d819f04422e1..d28c1813b5b6330e9bf58379bda337d192c878f6 100644
--- a/src/components/Options/GCU/GCUContent.tsx
+++ b/src/components/Options/GCU/GCUContent.tsx
@@ -1,4 +1,4 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './gcuContent.scss'
 
@@ -33,7 +33,6 @@ const GCUContent = (): JSX.Element => {
         <p className="text-14-normal">{t('gcu.content.part3_1')}</p>
         <p className="text-14-normal">{t('gcu.content.part3_2')}</p>
         <p className="text-14-normal">{t('gcu.content.part3_3')}</p>
-        <p className="text-14-normal">{t('gcu.content.part3_4')}</p>
         <div className="gcu-content-part-title text-15-normal">
           {t('gcu.content.title4')}
         </div>
diff --git a/src/components/Options/GCU/GCULink.tsx b/src/components/Options/GCU/GCULink.tsx
index bb43da2363560215ab6f66536e1f85d1f51394bf..3f7018685b8d0ddc8b0beba0d31984c710dc299e 100644
--- a/src/components/Options/GCU/GCULink.tsx
+++ b/src/components/Options/GCU/GCULink.tsx
@@ -1,36 +1,26 @@
-import Link from '@material-ui/core/Link'
 import GCUIcon from 'assets/icons/ico/gcu.svg'
+import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
-import { Link as RouterLink } from 'react-router-dom'
-import './gcuLink.scss'
+import { useNavigate } from 'react-router-dom'
+import '../OptionsView.scss'
 
 const GCULink = () => {
   const { t } = useI18n()
+  const navigate = useNavigate()
+
+  const goToGCU = () => {
+    navigate(`/options/gcu`)
+  }
+
   return (
-    <div className="gcu-link-root">
-      <div className="gcu-link-content">
-        <Link
-          className="gcu-link-card-link"
-          component={RouterLink}
-          to="/options/gcu"
-        >
-          <div className="card">
-            <div className="gcu-link-card">
-              <div className="gcu-link-card-content">
-                <StyledIcon
-                  className="gcu-link-card-content-icon"
-                  icon={GCUIcon}
-                  size={42}
-                />
-                <div className="gcu-link-card-content-title">
-                  {t('common.title_gcu')}
-                </div>
-              </div>
-            </div>
-          </div>
-        </Link>
+    <div className="styled-card-root">
+      <div className="styled-card-content">
+        <StyledCard onClick={goToGCU}>
+          <StyledIcon icon={GCUIcon} size={38} />
+          {t('common.title_gcu')}
+        </StyledCard>
       </div>
     </div>
   )
diff --git a/src/components/Options/GCU/GCUView.tsx b/src/components/Options/GCU/GCUView.tsx
index 9f4e06c97017ace8a703e8db29d4229e106b950a..9dd174eba76e8d3e33f3277c6270838135515e5f 100644
--- a/src/components/Options/GCU/GCUView.tsx
+++ b/src/components/Options/GCU/GCUView.tsx
@@ -4,6 +4,9 @@ import Header from 'components/Header/Header'
 import GCUContent from 'components/Options/GCU/GCUContent'
 import React from 'react'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/options/gcu
+ */
 const GCUView = () => {
   return (
     <>
diff --git a/src/components/Options/GCU/__snapshots__/GCUContent.spec.tsx.snap b/src/components/Options/GCU/__snapshots__/GCUContent.spec.tsx.snap
index dfdcf4910c46f89db3fa3bebeeada71b8e3fc2e6..aae53698025d3288e876649d6e5c290f9511ecfa 100644
--- a/src/components/Options/GCU/__snapshots__/GCUContent.spec.tsx.snap
+++ b/src/components/Options/GCU/__snapshots__/GCUContent.spec.tsx.snap
@@ -91,11 +91,6 @@ exports[`GCUContent component should be rendered correctly 1`] = `
       >
         gcu.content.part3_3
       </p>
-      <p
-        class="text-14-normal"
-      >
-        gcu.content.part3_4
-      </p>
       <div
         class="gcu-content-part-title text-15-normal"
       >
diff --git a/src/components/Options/GCU/__snapshots__/GCULink.spec.tsx.snap b/src/components/Options/GCU/__snapshots__/GCULink.spec.tsx.snap
index 915df297b184ee301fcd67fe248cc8bafd0441bd..a2e75eca8fe83baac4e4c7a6b7f7d25d4c0e4cde 100644
--- a/src/components/Options/GCU/__snapshots__/GCULink.spec.tsx.snap
+++ b/src/components/Options/GCU/__snapshots__/GCULink.spec.tsx.snap
@@ -3,48 +3,43 @@
 exports[`LegalNoticeLink component should be rendered correctly 1`] = `
 <div>
   <div
-    class="legal-notice-root"
+    class="styled-card-root"
   >
     <div
-      class="legal-notice-content"
+      class="styled-card-content"
     >
       <div
-        class="legal-notice-header text-16-normal-uppercase"
+        class="styled-card-header text-16-normal-uppercase"
       >
         legal.title_legal
       </div>
-      <a
-        class="MuiTypography-root MuiLink-root MuiLink-underlineHover legal-notice-card-link MuiTypography-colorPrimary"
-        href="/options/legalnotice"
+      <button
+        class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 undefined"
+        tabindex="0"
+        type="button"
       >
         <div
-          class="card"
+          class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
         >
-          <div
-            class="legal-notice-card"
+          <svg
+            aria-hidden="true"
+            class="styles__icon___23x3R"
+            height="38"
+            width="38"
           >
-            <div
-              class="legal-notice-card-content"
-            >
-              <svg
-                aria-hidden="true"
-                class="legal-notice-card-content-icon styles__icon___23x3R"
-                height="42"
-                width="42"
-              >
-                <use
-                  xlink:href="#test-file-stub"
-                />
-              </svg>
-              <div
-                class="legal-notice-card-content-title"
-              >
-                legal.read_legal
-              </div>
-            </div>
-          </div>
+            <use
+              xlink:href="#test-file-stub"
+            />
+          </svg>
+          legal.read_legal
         </div>
-      </a>
+        <span
+          class="MuiCardActionArea-focusHighlight"
+        />
+        <span
+          class="MuiTouchRipple-root"
+        />
+      </button>
     </div>
   </div>
 </div>
diff --git a/src/components/Options/GCU/__snapshots__/GCUView.spec.tsx.snap b/src/components/Options/GCU/__snapshots__/GCUView.spec.tsx.snap
index 918984408f738a1e931094280581679954ed37ce..ccef8cdf4a8f02fc4a960aa2982fd905e54f8ece 100644
--- a/src/components/Options/GCU/__snapshots__/GCUView.spec.tsx.snap
+++ b/src/components/Options/GCU/__snapshots__/GCUView.spec.tsx.snap
@@ -100,11 +100,6 @@ exports[`GCUView component should be rendered correctly 1`] = `
         >
           gcu.content.part3_3
         </p>
-        <p
-          class="text-14-normal"
-        >
-          gcu.content.part3_4
-        </p>
         <div
           class="gcu-content-part-title text-15-normal"
         >
diff --git a/src/components/Options/GCU/gcuLink.scss b/src/components/Options/GCU/gcuLink.scss
deleted file mode 100644
index 3a88a80d9508fa3a7c92a992ae35bcae66fdb6da..0000000000000000000000000000000000000000
--- a/src/components/Options/GCU/gcuLink.scss
+++ /dev/null
@@ -1,59 +0,0 @@
-@import 'src/styles/base/color';
-
-.gcu-link-root {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  color: $white;
-  padding: 0 1.5rem 0;
-  margin-top: 0.5rem;
-  .gcu-link-header {
-    margin-bottom: 1.25rem;
-  }
-  .gcu-link-content {
-    p {
-      color: $white;
-    }
-    a {
-      color: $white;
-      text-decoration: none;
-    }
-    li {
-      margin: 1rem 0;
-    }
-    h2 {
-      color: $white;
-    }
-    h3 {
-      color: $white;
-      margin: 2.5rem 0 1rem;
-    }
-    .ln-contact {
-      color: $multi-color;
-    }
-    max-width: 45.75rem;
-    width: 100%;
-  }
-}
-
-.gcu-link-card-link {
-  color: black;
-}
-.gcu-link-card {
-  display: flex;
-  flex-direction: row;
-  margin: -0.75rem 0;
-  width: 100%;
-  .gcu-link-card-content {
-    display: flex;
-    flex-direction: row;
-    .gcu-link-card-content-icon {
-      margin: 0.5rem 0;
-    }
-    .gcu-link-card-content-title {
-      margin: 0 1rem;
-      align-self: center;
-    }
-  }
-}
diff --git a/src/components/Options/HelpLink/HelpLink.scss b/src/components/Options/HelpLink/HelpLink.scss
deleted file mode 100644
index 453d742a2340d847f201ad000603aa2bc2ec0c34..0000000000000000000000000000000000000000
--- a/src/components/Options/HelpLink/HelpLink.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-@import 'src/styles/base/color';
-
-.help-root {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  padding: 0 1.5rem;
-  margin-top: 2rem;
-  .help-content {
-    max-width: 45.75rem;
-    width: 100%;
-    a {
-      color: $white;
-      text-decoration: none;
-    }
-
-    .help-header {
-      color: $grey-bright;
-      margin-bottom: 1rem;
-    }
-  }
-}
-
-.help-card-link {
-  color: $white;
-  cursor: pointer;
-}
-.help-card {
-  display: flex;
-  flex-direction: row;
-  margin: -0.75rem 0;
-  width: 100%;
-  .help-card-content {
-    display: flex;
-    flex-direction: row;
-    .help-card-content-icon {
-      margin: 0.5rem 0;
-      min-width: 42px;
-    }
-    .help-card-content-title {
-      margin: 0 1rem;
-      align-self: center;
-      text-decoration: none;
-    }
-  }
-}
diff --git a/src/components/Options/HelpLink/HelpLink.tsx b/src/components/Options/HelpLink/HelpLink.tsx
index a6e8362cc3a43b98e3fb17dcd762443bd0a01623..c8ab0a8756a5bb5b3a07d427f199ae72d416aa26 100644
--- a/src/components/Options/HelpLink/HelpLink.tsx
+++ b/src/components/Options/HelpLink/HelpLink.tsx
@@ -1,43 +1,26 @@
-import Link from '@material-ui/core/Link'
 import QuestionMarkIcon from 'assets/icons/ico/questionMark.svg'
+import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useAppDispatch } from 'store/hooks'
 import { openFeedbackModal } from 'store/modal/modal.slice'
-import './HelpLink.scss'
+import '../OptionsView.scss'
 
 const HelpLink = () => {
   const { t } = useI18n()
   const dispatch = useAppDispatch()
 
   return (
-    <div className="help-root">
-      <div className="help-content">
-        <div className="help-header text-16-normal-uppercase">
+    <div className="styled-card-root">
+      <div className="styled-card-content">
+        <div className="styled-card-header text-16-normal-uppercase">
           {t('help.title_help')}
         </div>
-        <Link
-          className="help-card-link"
-          onClick={() => dispatch(openFeedbackModal(true))}
-          onKeyDown={() => dispatch(openFeedbackModal(true))}
-          tabIndex={0}
-        >
-          <div className="card">
-            <div className="help-card">
-              <div className="help-card-content">
-                <StyledIcon
-                  className="help-card-content-icon"
-                  icon={QuestionMarkIcon}
-                  size={42}
-                />
-                <div className="help-card-content-title">
-                  {t('help.read_help')}
-                </div>
-              </div>
-            </div>
-          </div>
-        </Link>
+        <StyledCard onClick={() => dispatch(openFeedbackModal(true))}>
+          <StyledIcon icon={QuestionMarkIcon} size={38} />
+          {t('help.read_help')}
+        </StyledCard>
       </div>
     </div>
   )
diff --git a/src/components/Options/LegalNotice/LegalNoticeContent.tsx b/src/components/Options/LegalNotice/LegalNoticeContent.tsx
index 86b3c385fd6a79d691ba9f302801f2fcb8237514..c2c804f2ae8f39e918b8a63a3bdc7bd5edf8a846 100644
--- a/src/components/Options/LegalNotice/LegalNoticeContent.tsx
+++ b/src/components/Options/LegalNotice/LegalNoticeContent.tsx
@@ -1,120 +1,118 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './legalNoticeView.scss'
 
 const LegalNoticeContent = () => {
   const { t } = useI18n()
   return (
-    <>
-      <div className="legal-notice-root">
-        <div className="legal-notice-content">
-          <p className="version">{t('legal.version')}</p>
-          <p dangerouslySetInnerHTML={{ __html: t('legal.site') }} />
-          <p>{t('legal.adress')}</p>
-          <p>{t('legal.phone')}</p>
-          <p
-            className="ln-contact"
-            dangerouslySetInnerHTML={{ __html: t('legal.mail') }}
-          />
-          <div className="text-16-normal">
-            <div className="legal-notice-oneline">
-              <span className="text-14-normal">{t('legal.p1b')}</span>
-              {t('legal.p1')}
-            </div>
-            <div className="legal-notice-oneline">
-              <span className="text-14-normal">{t('legal.p2b')}</span>
-              {t('legal.p2')}
-            </div>
-            <div className="legal-notice-oneline">
-              <span className="text-14-normal">{t('legal.p3b')}</span>
-              {t('legal.p3')}
-            </div>
-            <div className="legal-notice-oneline">
-              <span className="text-14-normal">{t('legal.p4b')}</span>
-              {t('legal.p4')}
-            </div>
-            <div className="legal-notice-oneline">
-              <span className="text-14-normal">{t('legal.p5b')}</span>
-              {t('legal.p5')}
-            </div>
-            <div className="legal-notice-oneline">
-              <span className="text-14-normal">{t('legal.p6b')}</span>
-              {t('legal.p6')}
-            </div>
-            <div className="legal-notice-part">
-              <h3> {t('legal.title1')}</h3>
-              <p>{t('legal.part1')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title2')}</h3>
-              <p>{t('legal.part2')}</p>
-              <ul>
-                <li>{t('legal.part2-1')}</li>
-                <li>{t('legal.part2-2')}</li>
-                <li>
-                  {t('legal.part2-3')}
-                  <ul>
-                    <li>{t('legal.part2-3-1')}</li>
-                    <li>{t('legal.part2-3-2')}</li>
-                    <li>{t('legal.part2-3-3')}</li>
-                    <li>{t('legal.part2-3-4')}</li>
-                    <li
-                      dangerouslySetInnerHTML={{ __html: t('legal.part2-3-5') }}
-                    />
-                  </ul>
-                </li>
-                <li>{t('legal.part2-4')}</li>
-              </ul>
-              <p>{t('legal.part2-5')}</p>
-              <p>{t('legal.part2-6')}</p>
-              <ul>
-                <li>{t('legal.part2-6-1')}</li>
-                <li>{t('legal.part2-6-2')}</li>
-                <li>{t('legal.part2-6-3')}</li>
-              </ul>
-              <p dangerouslySetInnerHTML={{ __html: t('legal.part2-7') }} />
-              <p>{t('legal.part2-8')}</p>
-              <p>{t('legal.part2-9')}</p>
-              <p dangerouslySetInnerHTML={{ __html: t('legal.part2-10') }} />
-              <p>{t('legal.part2-11')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title3')}</h3>
-              <p>{t('legal.part3-1')}</p>
-              <p>{t('legal.part3-2')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title4')}</h3>
-              <p>{t('legal.part4-1')}</p>
-              <p>{t('legal.part4-2')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title5')}</h3>
-              <p>{t('legal.part5')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title6')}</h3>
-              <p>{t('legal.part6')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title7')}</h3>
-              <p>{t('legal.part7-1')}</p>
-              <p dangerouslySetInnerHTML={{ __html: t('legal.part7-2') }} />
-              <p>{t('legal.part7-3')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title8')}</h3>
-              <p>{t('legal.part8')}</p>
-            </div>
-            <div className="legal-notice-part">
-              <h3>{t('legal.title9')}</h3>
-              <p>{t('legal.part9-1')}</p>
-              <p>{t('legal.part9-2')}</p>
-            </div>
+    <div className="legal-notice-root">
+      <div className="legal-notice-content">
+        <p className="version">{t('legal.version')}</p>
+        <p dangerouslySetInnerHTML={{ __html: t('legal.site') }} />
+        <p>{t('legal.adress')}</p>
+        <p>{t('legal.phone')}</p>
+        <p
+          className="ln-contact"
+          dangerouslySetInnerHTML={{ __html: t('legal.mail') }}
+        />
+        <div className="text-16-normal">
+          <div className="legal-notice-oneline">
+            <span className="text-14-normal">{t('legal.p1b')}</span>
+            {t('legal.p1')}
+          </div>
+          <div className="legal-notice-oneline">
+            <span className="text-14-normal">{t('legal.p2b')}</span>
+            {t('legal.p2')}
+          </div>
+          <div className="legal-notice-oneline">
+            <span className="text-14-normal">{t('legal.p3b')}</span>
+            {t('legal.p3')}
+          </div>
+          <div className="legal-notice-oneline">
+            <span className="text-14-normal">{t('legal.p4b')}</span>
+            {t('legal.p4')}
+          </div>
+          <div className="legal-notice-oneline">
+            <span className="text-14-normal">{t('legal.p5b')}</span>
+            {t('legal.p5')}
+          </div>
+          <div className="legal-notice-oneline">
+            <span className="text-14-normal">{t('legal.p6b')}</span>
+            {t('legal.p6')}
+          </div>
+          <div className="legal-notice-part">
+            <h3> {t('legal.title1')}</h3>
+            <p>{t('legal.part1')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title2')}</h3>
+            <p>{t('legal.part2')}</p>
+            <ul>
+              <li>{t('legal.part2-1')}</li>
+              <li>{t('legal.part2-2')}</li>
+              <li>
+                {t('legal.part2-3')}
+                <ul>
+                  <li>{t('legal.part2-3-1')}</li>
+                  <li>{t('legal.part2-3-2')}</li>
+                  <li>{t('legal.part2-3-3')}</li>
+                  <li>{t('legal.part2-3-4')}</li>
+                  <li
+                    dangerouslySetInnerHTML={{ __html: t('legal.part2-3-5') }}
+                  />
+                </ul>
+              </li>
+              <li>{t('legal.part2-4')}</li>
+            </ul>
+            <p>{t('legal.part2-5')}</p>
+            <p>{t('legal.part2-6')}</p>
+            <ul>
+              <li>{t('legal.part2-6-1')}</li>
+              <li>{t('legal.part2-6-2')}</li>
+              <li>{t('legal.part2-6-3')}</li>
+            </ul>
+            <p dangerouslySetInnerHTML={{ __html: t('legal.part2-7') }} />
+            <p>{t('legal.part2-8')}</p>
+            <p>{t('legal.part2-9')}</p>
+            <p dangerouslySetInnerHTML={{ __html: t('legal.part2-10') }} />
+            <p>{t('legal.part2-11')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title3')}</h3>
+            <p>{t('legal.part3-1')}</p>
+            <p>{t('legal.part3-2')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title4')}</h3>
+            <p>{t('legal.part4-1')}</p>
+            <p>{t('legal.part4-2')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title5')}</h3>
+            <p>{t('legal.part5')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title6')}</h3>
+            <p>{t('legal.part6')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title7')}</h3>
+            <p>{t('legal.part7-1')}</p>
+            <p dangerouslySetInnerHTML={{ __html: t('legal.part7-2') }} />
+            <p>{t('legal.part7-3')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title8')}</h3>
+            <p>{t('legal.part8')}</p>
+          </div>
+          <div className="legal-notice-part">
+            <h3>{t('legal.title9')}</h3>
+            <p>{t('legal.part9-1')}</p>
+            <p>{t('legal.part9-2')}</p>
           </div>
         </div>
       </div>
-    </>
+    </div>
   )
 }
 
diff --git a/src/components/Options/LegalNotice/LegalNoticeLink.tsx b/src/components/Options/LegalNotice/LegalNoticeLink.tsx
index e158282f8124c1fa85b8f6c266666369297426fc..26d6dac220ff23c9676e31b3505118a509262dcf 100644
--- a/src/components/Options/LegalNotice/LegalNoticeLink.tsx
+++ b/src/components/Options/LegalNotice/LegalNoticeLink.tsx
@@ -1,40 +1,29 @@
-import Link from '@material-ui/core/Link'
 import LegalNoticeIcon from 'assets/icons/ico/legal-notice.svg'
+import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
-import { Link as RouterLink } from 'react-router-dom'
-import './legalNoticeLink.scss'
+import { useNavigate } from 'react-router-dom'
+import '../OptionsView.scss'
 
 const LegalNoticeLink = () => {
   const { t } = useI18n()
+  const navigate = useNavigate()
+
+  const goToLegalNotice = () => {
+    navigate(`/options/legalnotice`)
+  }
 
   return (
-    <div className="legal-notice-root">
-      <div className="legal-notice-content">
-        <div className="legal-notice-header text-16-normal-uppercase">
+    <div className="styled-card-root">
+      <div className="styled-card-content">
+        <div className="styled-card-header text-16-normal-uppercase">
           {t('legal.title_legal')}
         </div>
-        <Link
-          className="legal-notice-card-link"
-          component={RouterLink}
-          to="/options/legalnotice"
-        >
-          <div className="card">
-            <div className="legal-notice-card">
-              <div className="legal-notice-card-content">
-                <StyledIcon
-                  className="legal-notice-card-content-icon"
-                  icon={LegalNoticeIcon}
-                  size={42}
-                />
-                <div className="legal-notice-card-content-title">
-                  {t('legal.read_legal')}
-                </div>
-              </div>
-            </div>
-          </div>
-        </Link>
+        <StyledCard onClick={goToLegalNotice}>
+          <StyledIcon icon={LegalNoticeIcon} size={38} />
+          {t('legal.read_legal')}
+        </StyledCard>
       </div>
     </div>
   )
diff --git a/src/components/Options/LegalNotice/LegalNoticeView.tsx b/src/components/Options/LegalNotice/LegalNoticeView.tsx
index 660a1f14806934a8e5db9378dc5aed686b227709..4a2683fbc9f24823b591a77353b02aa57cd216a1 100644
--- a/src/components/Options/LegalNotice/LegalNoticeView.tsx
+++ b/src/components/Options/LegalNotice/LegalNoticeView.tsx
@@ -5,6 +5,9 @@ import React from 'react'
 import LegalNoticeContent from './LegalNoticeContent'
 import './legalNoticeView.scss'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/options/legalnotice
+ */
 const LegalNoticeView = () => {
   return (
     <>
diff --git a/src/components/Options/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap b/src/components/Options/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap
index f75c9392adbd35e4372187d1a121b5a9603f2216..026de87e117e51acdb9f2185eea03baf1a925bdb 100644
--- a/src/components/Options/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap
+++ b/src/components/Options/LegalNotice/__snapshots__/LegalNoticeLink.spec.tsx.snap
@@ -3,43 +3,38 @@
 exports[`GCULink component should be rendered correctly 1`] = `
 <div>
   <div
-    class="gcu-link-root"
+    class="styled-card-root"
   >
     <div
-      class="gcu-link-content"
+      class="styled-card-content"
     >
-      <a
-        class="MuiTypography-root MuiLink-root MuiLink-underlineHover gcu-link-card-link MuiTypography-colorPrimary"
-        href="/options/gcu"
+      <button
+        class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 undefined"
+        tabindex="0"
+        type="button"
       >
         <div
-          class="card"
+          class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
         >
-          <div
-            class="gcu-link-card"
+          <svg
+            aria-hidden="true"
+            class="styles__icon___23x3R"
+            height="38"
+            width="38"
           >
-            <div
-              class="gcu-link-card-content"
-            >
-              <svg
-                aria-hidden="true"
-                class="gcu-link-card-content-icon styles__icon___23x3R"
-                height="42"
-                width="42"
-              >
-                <use
-                  xlink:href="#test-file-stub"
-                />
-              </svg>
-              <div
-                class="gcu-link-card-content-title"
-              >
-                common.title_gcu
-              </div>
-            </div>
-          </div>
+            <use
+              xlink:href="#test-file-stub"
+            />
+          </svg>
+          common.title_gcu
         </div>
-      </a>
+        <span
+          class="MuiCardActionArea-focusHighlight"
+        />
+        <span
+          class="MuiTouchRipple-root"
+        />
+      </button>
     </div>
   </div>
 </div>
diff --git a/src/components/Options/LegalNotice/legalNoticeLink.scss b/src/components/Options/LegalNotice/legalNoticeLink.scss
deleted file mode 100644
index c6eb9a42feb3c3b3f235ebbbc247001e65395bf0..0000000000000000000000000000000000000000
--- a/src/components/Options/LegalNotice/legalNoticeLink.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-@import 'src/styles/base/breakpoint';
-@import 'src/styles/base/color';
-
-// LegalContainer
-.legal-notice-root {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  color: $white;
-  padding: 0 1.5rem;
-  margin-top: 2rem;
-  .legal-notice-header {
-    color: $grey-bright;
-    margin-bottom: 1rem;
-  }
-  .legal-notice-content {
-    max-width: 45.75rem;
-    width: 100%;
-    @media #{$large-phone} {
-      width: 100%;
-    }
-  }
-}
-.legal-notice-card-link {
-  color: black;
-}
-.legal-notice-card {
-  display: flex;
-  flex-direction: row;
-  margin: -0.75rem 0;
-  width: 100%;
-  @media #{$large-phone} {
-    width: 100%;
-  }
-  .legal-notice-card-content {
-    display: flex;
-    flex-direction: row;
-    .legal-notice-card-content-icon {
-      margin: 0.5rem 0;
-    }
-    .legal-notice-card-content-title {
-      margin: 0 1rem;
-      align-self: center;
-      color: white;
-    }
-  }
-}
diff --git a/src/components/Options/MatomoOptOut/MatomoOptOut.tsx b/src/components/Options/MatomoOptOut/MatomoOptOut.tsx
index 3589de6222a5a385bedd1af0332222aed9a5308b..c787a17476fde71ce606d87dda3bdb04e489dd9b 100644
--- a/src/components/Options/MatomoOptOut/MatomoOptOut.tsx
+++ b/src/components/Options/MatomoOptOut/MatomoOptOut.tsx
@@ -1,6 +1,6 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
-import './matomoOptOut.scss'
+import '../OptionsView.scss'
 
 declare let __PIWIK_TRACKER_URL__: string
 
@@ -9,14 +9,16 @@ const MatomoOptOut = () => {
   const baseUrl = __PIWIK_TRACKER_URL__
 
   return (
-    <div className="matomo-opt-out-container">
-      <div className="matomo-opt-out">
-        <div className="opt-out-header text-16-normal-uppercase">
+    <div className="styled-card-root">
+      <div className="styled-card-content">
+        <div className="styled-card-header text-16-normal-uppercase">
           {t('matomo.matomo_title')}
         </div>
         <iframe
+          sandbox="allow-popups allow-scripts"
           title="opt-out"
           style={{ height: '250px' }}
+          className="matomo-content"
           src={`${baseUrl}index.php?module=CoreAdminHome&action=optOut&language=fr&backgroundColor=121212&fontColor=e0e0e0&fontSize=&fontFamily=sans-serif`}
         />
       </div>
diff --git a/src/components/Options/MatomoOptOut/__snapshots__/MatomoOptOut.spec.tsx.snap b/src/components/Options/MatomoOptOut/__snapshots__/MatomoOptOut.spec.tsx.snap
index 4e821bbf7d2a9b766176578195e820bb88cf36a7..0c8a9df6b85b5593437e86d378b766fc46b093ca 100644
--- a/src/components/Options/MatomoOptOut/__snapshots__/MatomoOptOut.spec.tsx.snap
+++ b/src/components/Options/MatomoOptOut/__snapshots__/MatomoOptOut.spec.tsx.snap
@@ -3,17 +3,19 @@
 exports[`MatomoOptOut component should be rendered correctly 1`] = `
 <div>
   <div
-    class="matomo-opt-out-container"
+    class="styled-card-root"
   >
     <div
-      class="matomo-opt-out"
+      class="styled-card-content"
     >
       <div
-        class="opt-out-header text-16-normal-uppercase"
+        class="styled-card-header text-16-normal-uppercase"
       >
         matomo.matomo_title
       </div>
       <iframe
+        class="matomo-content"
+        sandbox="allow-popups allow-scripts"
         src="http://localhost:9800/index.php?module=CoreAdminHome&action=optOut&language=fr&backgroundColor=121212&fontColor=e0e0e0&fontSize=&fontFamily=sans-serif"
         style="height: 250px;"
         title="opt-out"
diff --git a/src/components/Options/MatomoOptOut/matomoOptOut.scss b/src/components/Options/MatomoOptOut/matomoOptOut.scss
deleted file mode 100644
index 0c4754fbe8456e6802f8c6232b27c586ee52ef17..0000000000000000000000000000000000000000
--- a/src/components/Options/MatomoOptOut/matomoOptOut.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-@import 'src/styles/base/color';
-@import 'src/styles/base/typo-variables';
-
-.matomo-opt-out-container {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  padding: 0 1.5rem;
-  margin: 2rem 0;
-
-  .matomo-opt-out {
-    margin: 0 auto;
-    max-width: 45.75rem;
-    width: 100%;
-    .opt-out-header {
-      color: $grey-bright;
-    }
-
-    * {
-      font-family: $text-font;
-    }
-  }
-}
diff --git a/src/components/Options/OptionsView.scss b/src/components/Options/OptionsView.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9cfe87eccb6cdfecd95fe126a3c45c8e9c6f3dc9
--- /dev/null
+++ b/src/components/Options/OptionsView.scss
@@ -0,0 +1,38 @@
+@import 'src/styles/base/color';
+@import 'src/styles/base/typo-variables';
+
+.options-root {
+  display: flex;
+  flex-direction: column;
+  gap: 2rem;
+}
+
+.info-links {
+  display: flex;
+  flex-direction: column;
+  gap: 1rem;
+}
+
+.styled-card-root {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 0 1.5rem;
+
+  .styled-card-content {
+    max-width: 45.75rem;
+    width: 100%;
+
+    .styled-card-header {
+      color: $grey-bright;
+      margin-bottom: 1rem;
+    }
+
+    .matomo-content {
+      * {
+        font-family: $text-font;
+      }
+    }
+  }
+}
diff --git a/src/components/Options/OptionsView.tsx b/src/components/Options/OptionsView.tsx
index 49f4bb50a5d522088338993dc4987d4f328c4474..0ea9e09848895ae99e634ab643a37eb090a8e718 100644
--- a/src/components/Options/OptionsView.tsx
+++ b/src/components/Options/OptionsView.tsx
@@ -2,36 +2,46 @@ import logos from 'assets/png/logos_partenaires.svg'
 import Content from 'components/Content/Content'
 import CozyBar from 'components/Header/CozyBar'
 import Header from 'components/Header/Header'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
-import Accessibility from './Accessibility/Accessibility'
+import AccessibilityLink from './AccessibilityLink/AccessibilityLink'
 import ExportData from './ExportData/ExportData'
 import GCULink from './GCU/GCULink'
 import HelpLink from './HelpLink/HelpLink'
 import LegalNoticeLink from './LegalNotice/LegalNoticeLink'
 import MatomoOptOut from './MatomoOptOut/MatomoOptOut'
+import './OptionsView.scss'
 import ProfileTypeOptions from './ProfileTypeOptions/ProfileTypeOptions'
 import ReportOptions from './ReportOptions/ReportOptions'
 import Version from './Version/Version'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/options
+ */
 const OptionsView = () => {
+  const { t } = useI18n()
+
   return (
     <>
       <CozyBar titleKey="common.title_options" />
       <Header desktopTitleKey="common.title_options" />
       <Content>
-        <ProfileTypeOptions />
-        <ExportData />
-        <ReportOptions />
-        <HelpLink />
-        <LegalNoticeLink />
-        <GCULink />
-        <Accessibility />
-        <MatomoOptOut />
+        <div className="options-root">
+          <div>
+            <ProfileTypeOptions />
+            <ExportData />
+          </div>
+          <ReportOptions />
+          <HelpLink />
+          <div className="info-links">
+            <LegalNoticeLink />
+            <GCULink />
+            <AccessibilityLink />
+          </div>
+          <MatomoOptOut />
+        </div>
         <div className="parameters-logos">
-          <img
-            src={logos}
-            alt="Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
-          />
+          <img src={logos} alt={t(`common.funders_logo`)} />
         </div>
         <Version />
       </Content>
diff --git a/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx b/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx
index d106bf4d1effb5d01f8104cd00bfbb6afd62cca8..7ab2149c886c8d15b7d1c28df58bdce0135680f2 100644
--- a/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx
+++ b/src/components/Options/ProfileTypeOptions/ProfileTypeOptions.tsx
@@ -9,8 +9,7 @@ import profileIcon from 'assets/icons/ico/profile.svg'
 import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import useExploration from 'components/Hooks/useExploration'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import {
   FluidType,
   HousingType,
@@ -29,13 +28,13 @@ const ProfileTypeOptions = () => {
   const { t } = useI18n()
   const navigate = useNavigate()
   const [, setValidExploration] = useExploration()
-  const [active, setActive] = useState<boolean>(false)
+  const [isExpanded, setIsExpanded] = useState<boolean>(false)
 
   const toggleAccordion = () => {
-    if (!active) {
+    if (!isExpanded) {
       setValidExploration(UserExplorationID.EXPLORATION001)
     }
-    setActive(prev => !prev)
+    setIsExpanded(prev => !prev)
   }
 
   const goToForm = () => {
@@ -58,7 +57,7 @@ const ProfileTypeOptions = () => {
         )}
         {profile.isProfileTypeCompleted && (
           <Accordion
-            expanded={active}
+            expanded={isExpanded}
             onChange={toggleAccordion}
             classes={{
               root: 'expansion-panel-root',
@@ -69,14 +68,18 @@ const ProfileTypeOptions = () => {
                 'profile_type.accessibility.button_toggle_detail_profile'
               )}
               expandIcon={
-                <Icon icon={chevronDown} size={16} className="accordion-icon" />
+                <StyledIcon icon={chevronDown} className="accordion-icon" />
               }
               classes={{
                 root: 'expansion-panel-summary',
                 content: 'expansion-panel-content',
               }}
             >
-              <Icon className="profile-icon" icon={profileIcon} size={42} />
+              <StyledIcon
+                className="profile-icon"
+                icon={profileIcon}
+                size={42}
+              />
               <div className="text-16-normal profile-title">
                 {t('profile_type.your_profile')}
               </div>
@@ -94,7 +97,7 @@ const ProfileTypeOptions = () => {
                   <div className="value">
                     {t(`profile_type.housing_type.${profileType.housingType}`)}
                   </div>
-                  {profileType.constructionYear && (
+                  {Boolean(profileType.constructionYear) && (
                     <div className="value">
                       {t(
                         `profile_type.construction_year.${
diff --git a/src/components/Options/ReportOptions/ReportOptions.spec.tsx b/src/components/Options/ReportOptions/ReportOptions.spec.tsx
index 14752d0b242c4ba2333d151dca4fb41c539eaeac..ff979961be610940b17fc79bc0c10b065714caaa 100644
--- a/src/components/Options/ReportOptions/ReportOptions.spec.tsx
+++ b/src/components/Options/ReportOptions/ReportOptions.spec.tsx
@@ -71,7 +71,7 @@ describe('ReportOptions component', () => {
   describe('should test water alert', () => {
     const storeWaterDone = createMockEcolyoStore({
       global: { ...mockGlobalState, fluidStatus: fluidStatusConnectedData },
-      profile: { sendAnalysisNotification: false },
+      profile: { ...mockProfileState, sendAnalysisNotification: false },
     })
     it('should be rendered with sendConsumptionAlert to false and enable it', async () => {
       render(
@@ -89,10 +89,11 @@ describe('ReportOptions component', () => {
       })
     })
 
-    it('should render waterLimit to 100', async () => {
+    it('should render waterLimit to 100', () => {
       const storeWaterAlert = createMockEcolyoStore({
         global: { ...mockGlobalState, fluidStatus: fluidStatusConnectedData },
         profile: {
+          ...mockProfileState,
           sendConsumptionAlert: true,
           waterDailyConsumptionLimit: 100,
         },
diff --git a/src/components/Options/ReportOptions/ReportOptions.tsx b/src/components/Options/ReportOptions/ReportOptions.tsx
index ab9bf280a489403943a040a97096087dce19943e..fb7750f05670885281acb68f70ea1cb3a28e431f 100644
--- a/src/components/Options/ReportOptions/ReportOptions.tsx
+++ b/src/components/Options/ReportOptions/ReportOptions.tsx
@@ -1,7 +1,7 @@
 import { OutlinedInput } from '@material-ui/core'
 import StyledSwitch from 'components/CommonKit/Switch/StyledSwitch'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidState, FluidType, TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import { Dataload, TimePeriod } from 'models'
@@ -69,21 +69,18 @@ const ReportOptions = () => {
         endDate: DateTime.now(),
       }
       const consumptionService = new ConsumptionDataManager(client)
-      const lastSemesterMax = await consumptionService.getMaxLoad(
-        timePeriod,
-        TimeStep.DAY,
-        [FluidType.WATER],
-        undefined,
-        false,
-        true
-      )
+      const lastSemesterMax = await consumptionService.getMaxLoad({
+        maxTimePeriod: timePeriod,
+        timeStep: TimeStep.DAY,
+        fluidTypes: [FluidType.WATER],
+        withDate: true,
+      })
       if (lastSemesterMax) {
         setLastSemesterMaxDay(lastSemesterMax as Dataload)
       }
     }
-    if (subscribed) {
-      getMaxLoadData()
-    }
+    subscribed && getMaxLoadData()
+
     return () => {
       subscribed = false
     }
diff --git a/src/components/Options/ReportOptions/reportOptions.scss b/src/components/Options/ReportOptions/reportOptions.scss
index 58ab12b6b0aaa790e6c71101041272ca86361267..aa8cd00d10027bffb40b33e6732bc73486101dcd 100644
--- a/src/components/Options/ReportOptions/reportOptions.scss
+++ b/src/components/Options/ReportOptions/reportOptions.scss
@@ -7,7 +7,6 @@
   align-items: center;
   justify-content: center;
   padding: 0 1.5rem;
-  margin-top: 2rem;
   .report-option-content {
     max-width: 45.75rem;
     width: 100%;
diff --git a/src/components/Options/Unsubscribe/Unsubscribe.tsx b/src/components/Options/Unsubscribe/Unsubscribe.tsx
index 07efaeaf987b1428dcdbccb14ca1502f6bc382f6..43a024dbb98439ad96a6d264405515d71268289f 100644
--- a/src/components/Options/Unsubscribe/Unsubscribe.tsx
+++ b/src/components/Options/Unsubscribe/Unsubscribe.tsx
@@ -4,7 +4,7 @@ import EcolyoGlowIcon from 'assets/icons/ico/ecolyo-glow.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import ProfileService from 'services/profile.service'
 import './unsubscribe.scss'
diff --git a/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap b/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap
index 7c656548ccaacfba5622169171ff6b2524b8ef7c..493580dda04352001b7b0a3620b31a1b525b66fe 100644
--- a/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap
+++ b/src/components/Options/__snapshots__/OptionsView.spec.tsx.snap
@@ -10,137 +10,145 @@ exports[`OptionsView component should be rendered correctly 1`] = `
   />
   <mock-content>
     <div
-      class="profile-type-root"
+      class="options-root"
     >
-      <div
-        class="profile-type-content"
-      >
-        <div
-          class="head text-16-normal-uppercase"
-        >
-          profile_type.title_profile
-        </div>
-        <button
-          class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 profile-link"
-          tabindex="0"
-          type="button"
-        >
-          <div
-            class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
-          >
-            <svg
-              aria-hidden="true"
-              class="profile-icon styles__icon___23x3R"
-              height="42"
-              width="42"
-            >
-              <use
-                xlink:href="#test-file-stub"
-              />
-            </svg>
-            <span
-              class="link-label text-16-normal"
-            >
-              profile_type.read_profile
-            </span>
-          </div>
-          <span
-            class="MuiCardActionArea-focusHighlight"
-          />
-          <span
-            class="MuiTouchRipple-root"
-          />
-        </button>
-      </div>
-    </div>
-    <div
-      class="export-option-root"
-    >
-      <div
-        class="export-option-content"
-      >
+      <div>
         <div
-          class="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded"
+          class="profile-type-root"
         >
           <div
-            aria-disabled="false"
-            aria-expanded="false"
-            aria-label="profile_type.accessibility.button_toggle_export"
-            class="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary"
-            role="button"
-            tabindex="0"
+            class="profile-type-content"
           >
             <div
-              class="MuiAccordionSummary-content expansion-panel-content"
+              class="head text-16-normal-uppercase"
             >
-              <svg
-                class="export-icon styles__icon___23x3R"
-                height="42"
-                width="42"
-              >
-                <use
-                  xlink:href="#test-file-stub"
-                />
-              </svg>
-              <div
-                class="text-16-normal accordion-title"
-              >
-                export.title_export
-              </div>
+              profile_type.title_profile
             </div>
-            <div
-              aria-disabled="false"
-              aria-hidden="true"
-              class="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd"
+            <button
+              class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 profile-link"
+              tabindex="0"
+              type="button"
             >
-              <span
-                class="MuiIconButton-label"
+              <div
+                class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
               >
                 <svg
-                  class="accordion-icon styles__icon___23x3R"
-                  height="16"
-                  width="16"
+                  aria-hidden="true"
+                  class="profile-icon styles__icon___23x3R"
+                  height="42"
+                  width="42"
                 >
                   <use
                     xlink:href="#test-file-stub"
                   />
                 </svg>
-              </span>
+                <span
+                  class="link-label text-16-normal"
+                >
+                  profile_type.read_profile
+                </span>
+              </div>
+              <span
+                class="MuiCardActionArea-focusHighlight"
+              />
               <span
                 class="MuiTouchRipple-root"
               />
-            </div>
+            </button>
           </div>
+        </div>
+        <div
+          class="export-option-root"
+        >
           <div
-            class="MuiCollapse-root MuiCollapse-hidden"
-            style="min-height: 0px;"
+            class="export-option-content"
           >
             <div
-              class="MuiCollapse-wrapper"
+              class="MuiPaper-root MuiAccordion-root expansion-panel-root MuiAccordion-rounded MuiPaper-elevation1 MuiPaper-rounded"
             >
               <div
-                class="MuiCollapse-wrapperInner"
+                aria-disabled="false"
+                aria-expanded="false"
+                aria-label="profile_type.accessibility.button_toggle_export"
+                class="MuiButtonBase-root MuiAccordionSummary-root expansion-panel-summary"
+                role="button"
+                tabindex="0"
               >
                 <div
-                  role="region"
+                  class="MuiAccordionSummary-content expansion-panel-content"
                 >
+                  <svg
+                    aria-hidden="true"
+                    class="export-icon styles__icon___23x3R"
+                    height="42"
+                    width="42"
+                  >
+                    <use
+                      xlink:href="#test-file-stub"
+                    />
+                  </svg>
                   <div
-                    class="MuiAccordionDetails-root expansion-panel-details"
+                    class="text-16-normal accordion-title"
                   >
-                    <div
-                      class="text-15-normal grey"
-                    >
-                      export.text1
-                    </div>
-                    <div
-                      class="text-16-bold"
+                    export.title_export
+                  </div>
+                </div>
+                <div
+                  aria-disabled="false"
+                  aria-hidden="true"
+                  class="MuiButtonBase-root MuiIconButton-root MuiAccordionSummary-expandIcon MuiIconButton-edgeEnd"
+                >
+                  <span
+                    class="MuiIconButton-label"
+                  >
+                    <svg
+                      aria-hidden="true"
+                      class="accordion-icon styles__icon___23x3R"
+                      height="16"
+                      width="16"
                     >
-                      export.fluid_select
-                    </div>
+                      <use
+                        xlink:href="#test-file-stub"
+                      />
+                    </svg>
+                  </span>
+                  <span
+                    class="MuiTouchRipple-root"
+                  />
+                </div>
+              </div>
+              <div
+                class="MuiCollapse-root MuiCollapse-hidden"
+                style="min-height: 0px;"
+              >
+                <div
+                  class="MuiCollapse-wrapper"
+                >
+                  <div
+                    class="MuiCollapse-wrapperInner"
+                  >
                     <div
-                      class="text-15-normal grey"
+                      role="region"
                     >
-                      export.no_data
+                      <div
+                        class="MuiAccordionDetails-root expansion-panel-details"
+                      >
+                        <div
+                          class="text-15-normal grey"
+                        >
+                          export.text1
+                        </div>
+                        <div
+                          class="text-16-bold"
+                        >
+                          export.fluid_select
+                        </div>
+                        <div
+                          class="text-15-normal grey"
+                        >
+                          export.no_data
+                        </div>
+                      </div>
                     </div>
                   </div>
                 </div>
@@ -149,255 +157,240 @@ exports[`OptionsView component should be rendered correctly 1`] = `
           </div>
         </div>
       </div>
-    </div>
-    <div
-      class="report-option-root"
-    >
       <div
-        class="report-option-content"
+        class="report-option-root"
       >
         <div
-          class="reportCard"
+          class="report-option-content"
         >
           <div
-            class="row"
+            class="reportCard"
           >
-            <span
-              class="MuiSwitch-root WithStyles(ForwardRef(Switch))-root-3"
+            <div
+              class="row"
             >
               <span
-                aria-disabled="false"
-                class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-7 MuiSwitch-switchBase WithStyles(ForwardRef(Switch))-switchBase-4 MuiSwitch-colorSecondary PrivateSwitchBase-checked-8 Mui-checked WithStyles(ForwardRef(Switch))-checked-5"
+                class="MuiSwitch-root WithStyles(ForwardRef(Switch))-root-3"
               >
                 <span
-                  class="MuiIconButton-label"
+                  aria-disabled="false"
+                  class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-7 MuiSwitch-switchBase WithStyles(ForwardRef(Switch))-switchBase-4 MuiSwitch-colorSecondary PrivateSwitchBase-checked-8 Mui-checked WithStyles(ForwardRef(Switch))-checked-5"
                 >
-                  <input
-                    checked=""
-                    class="PrivateSwitchBase-input-10 MuiSwitch-input"
-                    type="checkbox"
-                    value=""
-                  />
                   <span
-                    class="MuiSwitch-thumb"
+                    class="MuiIconButton-label"
+                  >
+                    <input
+                      checked=""
+                      class="PrivateSwitchBase-input-10 MuiSwitch-input"
+                      type="checkbox"
+                      value=""
+                    />
+                    <span
+                      class="MuiSwitch-thumb"
+                    />
+                  </span>
+                  <span
+                    class="MuiTouchRipple-root"
                   />
                 </span>
                 <span
-                  class="MuiTouchRipple-root"
+                  class="MuiSwitch-track WithStyles(ForwardRef(Switch))-track-6"
                 />
               </span>
               <span
-                class="MuiSwitch-track WithStyles(ForwardRef(Switch))-track-6"
-              />
-            </span>
+                class="text-16-normal-uppercase"
+              >
+                profile.report.title_bilan
+              </span>
+            </div>
             <span
-              class="text-16-normal-uppercase"
+              class="text-16-normal"
             >
-              profile.report.title_bilan
+              profile.report.switch_label_bilan
             </span>
           </div>
-          <span
-            class="text-16-normal"
-          >
-            profile.report.switch_label_bilan
-          </span>
         </div>
       </div>
-    </div>
-    <div
-      class="help-root"
-    >
       <div
-        class="help-content"
+        class="styled-card-root"
       >
         <div
-          class="help-header text-16-normal-uppercase"
-        >
-          help.title_help
-        </div>
-        <a
-          class="MuiTypography-root MuiLink-root MuiLink-underlineHover help-card-link MuiTypography-colorPrimary"
-          tabindex="0"
+          class="styled-card-content"
         >
           <div
-            class="card"
+            class="styled-card-header text-16-normal-uppercase"
+          >
+            help.title_help
+          </div>
+          <button
+            class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 undefined"
+            tabindex="0"
+            type="button"
           >
             <div
-              class="help-card"
+              class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
             >
-              <div
-                class="help-card-content"
+              <svg
+                aria-hidden="true"
+                class="styles__icon___23x3R"
+                height="38"
+                width="38"
               >
-                <svg
-                  aria-hidden="true"
-                  class="help-card-content-icon styles__icon___23x3R"
-                  height="42"
-                  width="42"
-                >
-                  <use
-                    xlink:href="#test-file-stub"
-                  />
-                </svg>
-                <div
-                  class="help-card-content-title"
-                >
-                  help.read_help
-                </div>
-              </div>
+                <use
+                  xlink:href="#test-file-stub"
+                />
+              </svg>
+              help.read_help
             </div>
-          </div>
-        </a>
+            <span
+              class="MuiCardActionArea-focusHighlight"
+            />
+            <span
+              class="MuiTouchRipple-root"
+            />
+          </button>
+        </div>
       </div>
-    </div>
-    <div
-      class="legal-notice-root"
-    >
       <div
-        class="legal-notice-content"
+        class="info-links"
       >
         <div
-          class="legal-notice-header text-16-normal-uppercase"
-        >
-          legal.title_legal
-        </div>
-        <a
-          class="MuiTypography-root MuiLink-root MuiLink-underlineHover legal-notice-card-link MuiTypography-colorPrimary"
-          href="/options/legalnotice"
+          class="styled-card-root"
         >
           <div
-            class="card"
+            class="styled-card-content"
           >
             <div
-              class="legal-notice-card"
+              class="styled-card-header text-16-normal-uppercase"
+            >
+              legal.title_legal
+            </div>
+            <button
+              class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 undefined"
+              tabindex="0"
+              type="button"
             >
               <div
-                class="legal-notice-card-content"
+                class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
               >
                 <svg
                   aria-hidden="true"
-                  class="legal-notice-card-content-icon styles__icon___23x3R"
-                  height="42"
-                  width="42"
+                  class="styles__icon___23x3R"
+                  height="38"
+                  width="38"
                 >
                   <use
                     xlink:href="#test-file-stub"
                   />
                 </svg>
-                <div
-                  class="legal-notice-card-content-title"
-                >
-                  legal.read_legal
-                </div>
+                legal.read_legal
               </div>
-            </div>
+              <span
+                class="MuiCardActionArea-focusHighlight"
+              />
+              <span
+                class="MuiTouchRipple-root"
+              />
+            </button>
           </div>
-        </a>
-      </div>
-    </div>
-    <div
-      class="gcu-link-root"
-    >
-      <div
-        class="gcu-link-content"
-      >
-        <a
-          class="MuiTypography-root MuiLink-root MuiLink-underlineHover gcu-link-card-link MuiTypography-colorPrimary"
-          href="/options/gcu"
+        </div>
+        <div
+          class="styled-card-root"
         >
           <div
-            class="card"
+            class="styled-card-content"
           >
-            <div
-              class="gcu-link-card"
+            <button
+              class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 undefined"
+              tabindex="0"
+              type="button"
             >
               <div
-                class="gcu-link-card-content"
+                class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
               >
                 <svg
                   aria-hidden="true"
-                  class="gcu-link-card-content-icon styles__icon___23x3R"
-                  height="42"
-                  width="42"
+                  class="styles__icon___23x3R"
+                  height="38"
+                  width="38"
                 >
                   <use
                     xlink:href="#test-file-stub"
                   />
                 </svg>
-                <div
-                  class="gcu-link-card-content-title"
-                >
-                  common.title_gcu
-                </div>
+                common.title_gcu
               </div>
-            </div>
+              <span
+                class="MuiCardActionArea-focusHighlight"
+              />
+              <span
+                class="MuiTouchRipple-root"
+              />
+            </button>
           </div>
-        </a>
-      </div>
-    </div>
-    <div
-      class="gcu-link-root"
-    >
-      <div
-        class="gcu-link-content"
-      >
-        <a
-          class="MuiTypography-root MuiLink-root MuiLink-underlineHover gcu-link-card-link MuiTypography-colorPrimary"
-          href="https://ecolyo.com/accessibilite.html"
-          target="_blank"
+        </div>
+        <div
+          class="styled-card-root"
         >
           <div
-            class="card"
+            class="styled-card-content"
           >
-            <div
-              class="gcu-link-card"
+            <button
+              class="MuiButtonBase-root MuiCardActionArea-root WithStyles(ForwardRef(CardActionArea))-root-1 undefined"
+              tabindex="0"
+              type="button"
             >
               <div
-                class="gcu-link-card-content"
+                class="MuiCardContent-root WithStyles(ForwardRef(CardContent))-root-2"
               >
                 <svg
                   aria-hidden="true"
-                  class="gcu-link-card-content-icon styles__icon___23x3R"
-                  height="42"
-                  width="42"
+                  class="styles__icon___23x3R"
+                  height="38"
+                  width="38"
                 >
                   <use
                     xlink:href="#test-file-stub"
                   />
                 </svg>
-                <div
-                  class="gcu-link-card-content-title"
-                >
-                  common.title_accessibility
-                </div>
+                common.title_accessibility
               </div>
-            </div>
+              <span
+                class="MuiCardActionArea-focusHighlight"
+              />
+              <span
+                class="MuiTouchRipple-root"
+              />
+            </button>
           </div>
-        </a>
+        </div>
       </div>
-    </div>
-    <div
-      class="matomo-opt-out-container"
-    >
       <div
-        class="matomo-opt-out"
+        class="styled-card-root"
       >
         <div
-          class="opt-out-header text-16-normal-uppercase"
+          class="styled-card-content"
         >
-          matomo.matomo_title
+          <div
+            class="styled-card-header text-16-normal-uppercase"
+          >
+            matomo.matomo_title
+          </div>
+          <iframe
+            class="matomo-content"
+            sandbox="allow-popups allow-scripts"
+            src="http://localhost:9800/index.php?module=CoreAdminHome&action=optOut&language=fr&backgroundColor=121212&fontColor=e0e0e0&fontSize=&fontFamily=sans-serif"
+            style="height: 250px;"
+            title="opt-out"
+          />
         </div>
-        <iframe
-          src="http://localhost:9800/index.php?module=CoreAdminHome&action=optOut&language=fr&backgroundColor=121212&fontColor=e0e0e0&fontSize=&fontFamily=sans-serif"
-          style="height: 250px;"
-          title="opt-out"
-        />
       </div>
     </div>
     <div
       class="parameters-logos"
     >
       <img
-        alt="Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
+        alt="common.funders_logo"
         src="test-file-stub"
       />
     </div>
diff --git a/src/components/PartnerIssue/PartnerIssueModal.tsx b/src/components/PartnerIssue/PartnerIssueModal.tsx
index d6158bd696ecd68900096f8994e68a8d3f8532e3..1e295b2933607f0d70748e704890e4809d7e4506 100644
--- a/src/components/PartnerIssue/PartnerIssueModal.tsx
+++ b/src/components/PartnerIssue/PartnerIssueModal.tsx
@@ -1,13 +1,13 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import IconButton from '@material-ui/core/IconButton'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import OrangeWarn from 'assets/icons/ico/warn-orange.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { FluidType } from 'enums'
 import React from 'react'
+import { getFluidLabel } from 'utils/utils'
 import './partnerIssueModal.scss'
 
 interface PartnerIssueModalProps {
@@ -23,17 +23,6 @@ const PartnerIssueModal = ({
 }: PartnerIssueModalProps) => {
   const { t } = useI18n()
 
-  const getFluidTypeLabel = () => {
-    switch (issuedFluid) {
-      case FluidType.ELECTRICITY:
-        return 'elec'
-      case FluidType.WATER:
-        return 'water'
-      case FluidType.GAS:
-        return 'gaz'
-    }
-  }
-
   return (
     <Dialog
       open={open}
@@ -51,13 +40,12 @@ const PartnerIssueModal = ({
       <div id="accessibility-title">
         {t('feedback.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={() => handleCloseClick(issuedFluid)}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={() => handleCloseClick(issuedFluid)}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
 
       <div className="partnerIssueModal">
         <StyledIcon icon={OrangeWarn} size={40} className="warn-icon" />
@@ -68,7 +56,9 @@ const PartnerIssueModal = ({
           className="partner-issue-content text-16-normal"
           dangerouslySetInnerHTML={{
             __html: t(
-              `consumption.partner_issue_modal.error_connect_${getFluidTypeLabel()}`
+              `consumption.partner_issue_modal.error_connect_${getFluidLabel(
+                issuedFluid
+              )}`
             ),
           }}
         />
diff --git a/src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap b/src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap
index a0196786c26b18a6c58302c49e56c65b3c1a024b..2da3a371021ada8c3ae39dce5ca2d9d014b5daf3 100644
--- a/src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap
+++ b/src/components/PartnerIssue/__snapshots__/PartnerIssueModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`PartnerIssueModal component should render correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
diff --git a/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.spec.tsx b/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.spec.tsx
index 129114f86fac29eaba1d227ef002015e062b966e..7c697496455ff16cdba2c8e3a05572b776a743a8 100644
--- a/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.spec.tsx
+++ b/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.spec.tsx
@@ -29,7 +29,7 @@ jest.mock('services/profileTypeEntity.service', () => {
 describe('ProfileTypeFinished component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <ProfileTypeFinished profileType={mockProfileType} />
diff --git a/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.tsx b/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.tsx
index f32dd2d9d4b37c8253ddd97169bc1aafa6d39a3a..34cd7b29d36fbb35a2b6d38bf14fa8a63c9bfebd 100644
--- a/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.tsx
+++ b/src/components/ProfileType/ProfileTypeFinished/ProfileTypeFinished.tsx
@@ -4,7 +4,7 @@ import finishIcon from 'assets/icons/visu/profileType/finish.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import useExploration from 'components/Hooks/useExploration'
 import { Client, useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { PROFILETYPE_DOCTYPE } from 'doctypes'
 import { UsageEventType, UserExplorationID } from 'enums'
 import { DateTime } from 'luxon'
diff --git a/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx b/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx
index c1e63fc33d4b952ce125fdb309376e1066800503..20eacbf8817c589113da15c9166d469722e6971b 100644
--- a/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx
+++ b/src/components/ProfileType/ProfileTypeFormDateSelection/ProfileTypeFormDateSelection.tsx
@@ -1,11 +1,11 @@
 import { MenuItem, Select } from '@material-ui/core'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ProfileTypeStepForm } from 'enums'
 import { DateTime } from 'luxon'
 import { ProfileType, ProfileTypeAnswer, ProfileTypeValues } from 'models'
-import React, { useCallback, useState } from 'react'
+import React, { useState } from 'react'
 import { formatTwoDigits, getMonthFullName } from 'utils/utils'
 
 interface ProfileTypeFormDateSelectionProps {
@@ -30,14 +30,14 @@ const ProfileTypeFormDateSelection = ({
 }: ProfileTypeFormDateSelectionProps) => {
   const { t } = useI18n()
   const [selectedYear, setSelectedYear] = useState<number>(DateTime.now().year)
-  const [selectedMonth, setSelectedMonth] = useState<SelectionMonth>({
+  const [selectedMonth, setSelectedMonth] = useState<SelectionMonth>(() => ({
     label: DateTime.now().toLocaleString({ month: 'long' }),
     value: formatTwoDigits(DateTime.now().month), // Date.getMonth starts at 0
-  })
+  }))
   const buildISODate = (year: string, month: string) =>
     DateTime.fromISO(`${year}-${month}-01`)
 
-  const [answer, setAnswer] = useState<ProfileTypeValues>(
+  const [answer, setAnswer] = useState<ProfileTypeValues>(() =>
     buildISODate(selectedYear.toString(), selectedMonth.value)
   )
 
@@ -100,25 +100,21 @@ const ProfileTypeFormDateSelection = ({
     selectYears.push(i)
   }
 
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
-
   const handleNext = () => {
     setNextStep({ ...profileType, [answerType.attribute]: answer })
   }
 
-  function handleSelectMonth(event: any) {
+  function handleSelectMonth(value: string) {
     setSelectedMonth({
-      value: event.target.value,
-      label: getMonthFullName(parseInt(event.target.value)),
+      value: value,
+      label: getMonthFullName(parseInt(value)),
     })
-    setAnswer(buildISODate(selectedYear.toString(), event.target.value))
+    setAnswer(buildISODate(selectedYear.toString(), value))
   }
 
-  function handleSelectYear(event: any) {
-    setSelectedYear(parseInt(event.target.value))
-    setAnswer(buildISODate(event.target.value, selectedMonth.value))
+  function handleSelectYear(value: string) {
+    setSelectedYear(parseInt(value))
+    setAnswer(buildISODate(value, selectedMonth.value))
   }
 
   /** If current year, only show past and present months else show full months */
@@ -137,28 +133,13 @@ const ProfileTypeFormDateSelection = ({
         </div>
         {answer !== null && (
           <div className="select-container">
-            <div className="date-select">
-              <Select
-                labelId="selectYearDate"
-                className="year"
-                defaultValue={selectedYear}
-                value={selectedYear}
-                onChange={e => handleSelectYear(e)}
-              >
-                {selectYears.map(year => (
-                  <MenuItem value={year} key={year} className="date-option">
-                    {year}
-                  </MenuItem>
-                ))}
-              </Select>
-            </div>
             <div className="date-select">
               <Select
                 labelId="selectMonthDate"
                 className="month"
                 defaultValue={selectedMonth.value}
                 value={selectedMonth.value}
-                onChange={e => handleSelectMonth(e)}
+                onChange={e => handleSelectMonth(e.target.value as string)}
               >
                 {renderMonths.map(month => (
                   <MenuItem
@@ -171,11 +152,26 @@ const ProfileTypeFormDateSelection = ({
                 ))}
               </Select>
             </div>
+            <div className="date-select">
+              <Select
+                labelId="selectYearDate"
+                className="year"
+                defaultValue={selectedYear}
+                value={selectedYear}
+                onChange={e => handleSelectYear(e.target.value as string)}
+              >
+                {selectYears.map(year => (
+                  <MenuItem value={year} key={year} className="date-option">
+                    {year}
+                  </MenuItem>
+                ))}
+              </Select>
+            </div>
           </div>
         )}
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disableNextButton={answer === ''}
         isLastStep={true}
diff --git a/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx b/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx
index 2a3c9cfac0a6275e6c409c307dad16ed9ec734ad..b57b25091f5074867e54023b5a0881aaed028fdc 100644
--- a/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx
+++ b/src/components/ProfileType/ProfileTypeFormMultiChoice/ProfileTypeFormMultiChoice.tsx
@@ -1,7 +1,7 @@
 import classNames from 'classnames'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ProfileTypeStepForm } from 'enums'
 import { remove } from 'lodash'
 import { ProfileType, ProfileTypeAnswer } from 'models'
@@ -52,10 +52,6 @@ const ProfileTypeFormMultiChoice = ({
     return answer.includes(value)
   }
 
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
-
   const handleNext = useCallback(() => {
     setNextStep({
       ...currentProfileType,
@@ -86,15 +82,16 @@ const ProfileTypeFormMultiChoice = ({
           const stringValue = value.toString()
           return (
             <label
+              htmlFor={`answer${index}`}
               key={index}
               className={classNames('checkbox', {
                 ['answer-checked']: answer.includes(stringValue),
               })}
             >
               <input
+                id={`answer${index}`}
                 type="checkbox"
                 value={stringValue}
-                name={stringValue}
                 onChange={() => handleChange(stringValue)}
                 checked={isChecked(stringValue)}
               />
@@ -108,7 +105,7 @@ const ProfileTypeFormMultiChoice = ({
         })}
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disableNextButton={answer.length < 1}
       />
diff --git a/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx b/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx
index 61d317064e8565d87c1793b4d5d15b0b7c11cb89..41078fc40a4f17722caee3993d2c60f24ba4a345 100644
--- a/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx
+++ b/src/components/ProfileType/ProfileTypeFormNumber/ProfileTypeFormNumber.tsx
@@ -2,7 +2,7 @@
 import { InputAdornment, OutlinedInput } from '@material-ui/core'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ProfileTypeStepForm } from 'enums'
 import { ProfileType, ProfileTypeAnswer, ProfileTypeValues } from 'models'
 import React, { useCallback, useEffect, useState } from 'react'
@@ -31,10 +31,6 @@ const ProfileTypeFormNumber = ({
   )
   const [answer, setAnswer] = useState<ProfileTypeValues>('')
 
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
-
   const handleNext = useCallback(() => {
     setNextStep({ ...currentProfileType, [answerType.attribute]: answer })
   }, [currentProfileType, setNextStep, answer, answerType.attribute])
@@ -69,7 +65,7 @@ const ProfileTypeFormNumber = ({
         )}
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disableNextButton={answer === ''}
       />
diff --git a/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.spec.tsx b/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.spec.tsx
index 0b4d386c5eb7da75cddb76107b5d482f6cbd7844..b3f119d22801b8db2a6b0ffb2e42588239d01f7c 100644
--- a/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.spec.tsx
+++ b/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.spec.tsx
@@ -12,7 +12,7 @@ import ProfileTypeFormNumberSelection from './ProfileTypeFormNumberSelection'
 describe('ProfileTypeFormNumberSelection component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <ProfileTypeFormNumberSelection
diff --git a/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx b/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx
index 8d733919cc4e7f5b395d7b4d3ea8f6da2e8c6050..f28e9c563bd0cd1ce9acfa0184fad2d7d092eeb3 100644
--- a/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx
+++ b/src/components/ProfileType/ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection.tsx
@@ -1,7 +1,7 @@
 import { Button, TextField } from '@material-ui/core'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ProfileTypeStepForm } from 'enums'
 import { ProfileType, ProfileTypeAnswer, ProfileTypeValues } from 'models'
 import React, { useCallback, useEffect, useState } from 'react'
@@ -41,10 +41,6 @@ const ProfileTypeFormNumberSelection = ({
     setIndex(prev => prev + 1)
   }
 
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
-
   const handleNext = useCallback(() => {
     setNextStep({ ...currentProfileType, [answerType.attribute]: answer })
   }, [currentProfileType, setNextStep, answer, answerType.attribute])
@@ -87,8 +83,8 @@ const ProfileTypeFormNumberSelection = ({
               type="tel"
               className="inputNumberIncrements"
               value={answer.toString()}
-              name={answerType.attribute}
               size="small"
+              disabled
             />
             <Button
               onClick={() => increment()}
@@ -104,7 +100,7 @@ const ProfileTypeFormNumberSelection = ({
         )}
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disableNextButton={answer === ''}
       />
diff --git a/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx b/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx
index 2fc81aa25bc284c25999e7b688f108426f99bf75..8f67be5c254206c4239a190f956d0d423f33c65c 100644
--- a/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx
+++ b/src/components/ProfileType/ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice.tsx
@@ -1,7 +1,7 @@
 import classNames from 'classnames'
 import FormNavigation from 'components/CommonKit/FormNavigation/FormNavigation'
 import 'components/ProfileType/profileTypeForm.scss'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { ProfileTypeStepForm } from 'enums'
 import {
   ProfileEcogesture,
@@ -36,9 +36,6 @@ const ProfileTypeFormSingleChoice = ({
   } = useAppSelector(state => state.ecolyo)
 
   const [answer, setAnswer] = useState<ProfileTypeValues>('')
-  const handlePrevious = useCallback(() => {
-    setPreviousStep()
-  }, [setPreviousStep])
 
   const handleNext = useCallback(() => {
     setNextStep({ ...currentProfileType, [answerType.attribute]: answer })
@@ -79,6 +76,7 @@ const ProfileTypeFormSingleChoice = ({
 
           return (
             <label
+              htmlFor={`answer-${index}`}
               key={index}
               className={classNames({
                 ['radio_short']: answerType.choices.length < 5,
@@ -87,9 +85,9 @@ const ProfileTypeFormSingleChoice = ({
               })}
             >
               <input
+                id={`answer-${index}`}
                 type="radio"
                 value={value.toString()}
-                name={value.toString()}
                 onChange={() => setAnswer(value)}
                 checked={answer === value ? true : false}
               />
@@ -103,7 +101,7 @@ const ProfileTypeFormSingleChoice = ({
         })}
       </div>
       <FormNavigation
-        handlePrevious={handlePrevious}
+        handlePrevious={setPreviousStep}
         handleNext={handleNext}
         disablePrevButton={step === ProfileTypeStepForm.HOUSING_TYPE}
         disableNextButton={answer === '' || answer === undefined}
diff --git a/src/components/ProfileType/ProfileTypeView.tsx b/src/components/ProfileType/ProfileTypeView.tsx
index d7c716aab43ddbf67ac87bb35a3b855bb4466f9b..e7ce6980a5672cb544a43187022a587bde708abc 100644
--- a/src/components/ProfileType/ProfileTypeView.tsx
+++ b/src/components/ProfileType/ProfileTypeView.tsx
@@ -32,6 +32,9 @@ import ProfileTypeFormNumber from './ProfileTypeFormNumber/ProfileTypeFormNumber
 import ProfileTypeFormNumberSelection from './ProfileTypeFormNumberSelection/ProfileTypeFormNumberSelection'
 import ProfileTypeFormSingleChoice from './ProfileTypeFormSingleChoice/ProfileTypeFormSingleChoice'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/profileType
+ */
 const ProfileTypeView = () => {
   const { profile, profileType, profileEcogesture } = useAppSelector(
     state => state.ecolyo
@@ -122,8 +125,7 @@ const ProfileTypeView = () => {
     const profileTypeFormService = new ProfileTypeFormService(
       currentProfileType
     )
-    const previousStep: ProfileTypeStepForm =
-      profileTypeFormService.getPreviousFormStep(step)
+    const previousStep = profileTypeFormService.getPreviousFormStep(step)
     setIsLoading(true)
     setStep(previousStep)
   }, [currentProfileType, step])
diff --git a/src/components/Quiz/QuizBegin/QuizBegin.spec.tsx b/src/components/Quiz/QuizBegin/QuizBegin.spec.tsx
index ccaf243e83620d21cffe47d48d5bc75187afdb2a..11d1e2a39aea132089405f564acdd26a7a19ba40 100644
--- a/src/components/Quiz/QuizBegin/QuizBegin.spec.tsx
+++ b/src/components/Quiz/QuizBegin/QuizBegin.spec.tsx
@@ -15,7 +15,8 @@ jest.mock('services/challenge.service', () => {
 })
 
 describe('QuizBegin component', () => {
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly and launch quiz', async () => {
+    mockUserChallengeUpdateFlag.mockResolvedValueOnce(userChallengeData[0])
     const store = createMockEcolyoStore()
     const { container } = render(
       <Provider store={store}>
diff --git a/src/components/Quiz/QuizBegin/QuizBegin.tsx b/src/components/Quiz/QuizBegin/QuizBegin.tsx
index a6698e7879213511fb233f48970d71abfd6b9f32..952f47d5cb51d83f635b6e9abc570e226c09b7a5 100644
--- a/src/components/Quiz/QuizBegin/QuizBegin.tsx
+++ b/src/components/Quiz/QuizBegin/QuizBegin.tsx
@@ -3,7 +3,7 @@ import quizIcon from 'assets/icons/visu/quiz/questionMark.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import StarsContainer from 'components/CommonKit/StarsContainer/StarsContainer'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { UserChallenge } from 'models'
 import React from 'react'
@@ -17,12 +17,11 @@ const QuizBegin = ({ userChallenge }: { userChallenge: UserChallenge }) => {
   const client = useClient()
   const dispatch = useAppDispatch()
   const launchQuiz = async () => {
-    const challengeService: ChallengeService = new ChallengeService(client)
-    const userChallengeUpdated: UserChallenge =
-      await challengeService.updateUserChallenge(
-        userChallenge,
-        UserChallengeUpdateFlag.QUIZ_START
-      )
+    const challengeService = new ChallengeService(client)
+    const userChallengeUpdated = await challengeService.updateUserChallenge(
+      userChallenge,
+      UserChallengeUpdateFlag.QUIZ_START
+    )
     dispatch(updateUserChallengeList(userChallengeUpdated))
   }
 
diff --git a/src/components/Quiz/QuizExplanationModal/QuizExplanationModal.tsx b/src/components/Quiz/QuizExplanationModal/QuizExplanationModal.tsx
index 928940f0642c7398a5ddd3dbe4b0aa883c5ccd0a..b00190ae45972c25d1b4afd39892147824983cc2 100644
--- a/src/components/Quiz/QuizExplanationModal/QuizExplanationModal.tsx
+++ b/src/components/Quiz/QuizExplanationModal/QuizExplanationModal.tsx
@@ -2,15 +2,15 @@ import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
 import correctAnswer from 'assets/icons/ico/correctAnswer.svg'
 import wrongAnswer from 'assets/icons/ico/wrongAnswer.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { QuestionEntity } from 'models'
-import React, { useEffect, useState } from 'react'
+import React from 'react'
 import './quizExplanationModal.scss'
 
 interface QuizExplanationModalProps {
   open: boolean
-  question: QuestionEntity | undefined
+  question: QuestionEntity
   answerIndex: number
   goNext: () => void
   handleCloseClick: () => void
@@ -24,15 +24,9 @@ const QuizExplanationModal = ({
   handleCloseClick,
 }: QuizExplanationModalProps) => {
   const { t } = useI18n()
-  const [validAnswer, setValidAnswer] = useState<number>(0)
-  useEffect(() => {
-    if (question) {
-      const resultIndex: number = question.answers.findIndex(
-        answer => answer.isTrue
-      )
-      setValidAnswer(resultIndex)
-    }
-  }, [question])
+
+  const validAnswer = question.answers.findIndex(answer => answer.isTrue)
+
   return (
     <Dialog
       open={open}
@@ -49,12 +43,12 @@ const QuizExplanationModal = ({
           <>
             {question.answers[answerIndex].isTrue ? (
               <div>
-                <Icon icon={correctAnswer} size={100} />
+                <StyledIcon icon={correctAnswer} size={100} />
                 <p className="quiz-modal-answer correct">{t('quiz.correct')}</p>
               </div>
             ) : (
               <div>
-                <Icon icon={wrongAnswer} size={100} />
+                <StyledIcon icon={wrongAnswer} size={100} />
                 <p className="quiz-modal-answer wrong">{t('quiz.wrong')}</p>
               </div>
             )}
diff --git a/src/components/Quiz/QuizFinish/QuizFinish.spec.tsx b/src/components/Quiz/QuizFinish/QuizFinish.spec.tsx
index 9bac2567e4a78b44b8dcf3cf0ee6234b2e75df6e..64c31a9f68eaeba845876e8e4e4a7cc58ff0da9c 100644
--- a/src/components/Quiz/QuizFinish/QuizFinish.spec.tsx
+++ b/src/components/Quiz/QuizFinish/QuizFinish.spec.tsx
@@ -20,7 +20,8 @@ jest.mock('react-router-dom', () => ({
 }))
 
 describe('QuizFinish', () => {
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly and go back to challenges page', async () => {
+    mockUserChallengeUpdateFlag.mockResolvedValueOnce(userChallengeData[0])
     const store = createMockEcolyoStore()
     const { container } = render(
       <Provider store={store}>
diff --git a/src/components/Quiz/QuizFinish/QuizFinish.tsx b/src/components/Quiz/QuizFinish/QuizFinish.tsx
index c2c1d8ebec6a7fa203fd2208fc38db4e75a389fa..0bbbee5f01168b58d9ff2fd8082a8e2b9772417d 100644
--- a/src/components/Quiz/QuizFinish/QuizFinish.tsx
+++ b/src/components/Quiz/QuizFinish/QuizFinish.tsx
@@ -2,7 +2,7 @@ import Button from '@material-ui/core/Button'
 import starResult from 'assets/icons/visu/quiz/starResult.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { UserChallenge } from 'models'
 import React, { useCallback, useMemo } from 'react'
@@ -36,6 +36,7 @@ const QuizFinish = ({ userChallenge }: { userChallenge: UserChallenge }) => {
     dispatch(updateUserChallengeList(userChallengeUpdated))
     navigate('/challenges')
   }
+
   return (
     <div className="quiz-container">
       <div className="quiz-finish-container">
diff --git a/src/components/Quiz/QuizQuestion/QuizQuestion.spec.tsx b/src/components/Quiz/QuizQuestion/QuizQuestion.spec.tsx
index 6abd2f50f97ab01603e316fce1d83ff8ddf201d8..93bf18196d0beb418f7972788b0070d55df3b93c 100644
--- a/src/components/Quiz/QuizQuestion/QuizQuestion.spec.tsx
+++ b/src/components/Quiz/QuizQuestion/QuizQuestion.spec.tsx
@@ -1,17 +1,18 @@
 import { render, waitFor } from '@testing-library/react'
 import { UserQuestionState } from 'enums'
+import { QuestionEntity } from 'models'
 import React from 'react'
 import { Provider } from 'react-redux'
 import { createMockEcolyoStore } from 'tests/__mocks__/store'
 import { userChallengeData } from 'tests/__mocks__/userChallengeData.mock'
 import QuizQuestion from './QuizQuestion'
 
+const mockGetCustomQuestion = jest.fn<Promise<QuestionEntity>, [string]>()
+
 jest.mock('services/quiz.service', () => {
-  return jest.fn(() => {
-    return {
-      getCustomQuestion: jest.fn(),
-    }
-  })
+  return jest.fn(() => ({
+    getCustomQuestion: mockGetCustomQuestion,
+  }))
 })
 
 jest.mock(
@@ -26,7 +27,7 @@ jest.mock(
 describe('QuizQuestion component', () => {
   const store = createMockEcolyoStore()
 
-  it('should be rendered correctly with question', async () => {
+  it('should be rendered correctly with question', () => {
     const { container } = render(
       <Provider store={store}>
         <QuizQuestion userChallenge={userChallengeData[0]} />
@@ -38,6 +39,24 @@ describe('QuizQuestion component', () => {
     ).toBeFalsy()
   })
 
+  it('should be rendered correctly with loader', async () => {
+    const updateUserChallengeData = {
+      ...userChallengeData[0],
+    }
+    updateUserChallengeData.quiz.questions.forEach(
+      answer => (answer.result = UserQuestionState.CORRECT)
+    )
+    const { container } = render(
+      <Provider store={store}>
+        <QuizQuestion userChallenge={updateUserChallengeData} />
+      </Provider>
+    )
+    await waitFor(() => null, { container })
+    expect(
+      container.getElementsByClassName('question-loading')[0]
+    ).toBeInTheDocument()
+  })
+
   it('should be rendered correctly with customQuestion', async () => {
     const updateUserChallengeData = {
       ...userChallengeData[0],
@@ -45,6 +64,21 @@ describe('QuizQuestion component', () => {
     updateUserChallengeData.quiz.questions.forEach(
       answer => (answer.result = UserQuestionState.CORRECT)
     )
+    mockGetCustomQuestion.mockResolvedValue({
+      questionLabel: 'customQuestion',
+      explanation: 'explanation',
+      answers: [
+        {
+          answerLabel: 'answer1',
+          isTrue: true,
+        },
+        {
+          answerLabel: 'answer2',
+          isTrue: false,
+        },
+      ],
+      source: 'source',
+    })
     const { container } = render(
       <Provider store={store}>
         <QuizQuestion userChallenge={updateUserChallengeData} />
diff --git a/src/components/Quiz/QuizQuestion/QuizQuestion.tsx b/src/components/Quiz/QuizQuestion/QuizQuestion.tsx
index 25ff5662bdd27baa282c522037a2e2178f939c50..d38fb0d51d186537354c5c097a67d6ca2afd4b9d 100644
--- a/src/components/Quiz/QuizQuestion/QuizQuestion.tsx
+++ b/src/components/Quiz/QuizQuestion/QuizQuestion.tsx
@@ -1,26 +1,29 @@
+import Loader from 'components/Loader/Loader'
 import { useClient } from 'cozy-client'
 import { QuestionEntity, UserChallenge } from 'models'
-import React, { useEffect, useState } from 'react'
+import React, { useEffect, useRef, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
 import QuizService from 'services/quiz.service'
 import { useAppSelector } from 'store/hooks'
+import './quizQuestion.scss'
 import QuizQuestionContent from './QuizQuestionContent'
 import QuizQuestionContentCustom from './QuizQuestionContentCustom'
-import './quizQuestion.scss'
 
 const QuizQuestion = ({ userChallenge }: { userChallenge: UserChallenge }) => {
   const client = useClient()
-  const { fluidTypes } = useAppSelector(state => state.ecolyo.global)
   const navigate = useNavigate()
-  const questionsIsLocked: boolean = userChallenge.quiz.questions.some(
+  const { fluidTypes } = useAppSelector(state => state.ecolyo.global)
+
+  const questionsIsLocked = userChallenge.quiz.questions.some(
     answer => answer.result == 0
   )
-  const [question, setQuestion] = useState<QuestionEntity>()
-  const [isCustomQuest, setIsCustomQuest] = useState<boolean>(
-    !questionsIsLocked
-  )
-  const [customQuestionLoading, setCustomQuestionLoading] =
-    useState<boolean>(false)
+  const [customQuestion, setCustomQuestion] = useState<QuestionEntity>()
+  const [isCustomQuest, setIsCustomQuest] = useState(!questionsIsLocked)
+
+  const mainContentRef = useRef<HTMLDivElement>(null)
+  const focusMainContent = () => {
+    setTimeout(() => mainContentRef.current?.focus(), 0)
+  }
 
   const goBack = () => {
     navigate('/challenges')
@@ -29,19 +32,14 @@ const QuizQuestion = ({ userChallenge }: { userChallenge: UserChallenge }) => {
   useEffect(() => {
     let subscribed = true
     async function loadCustomQuestion() {
-      const quizService: QuizService = new QuizService(client)
-      const customQuestion: QuestionEntity =
-        await quizService.getCustomQuestion(
-          userChallenge.quiz.customQuestion,
-          fluidTypes
-        )
-      if (subscribed) {
-        setQuestion(customQuestion)
-        setCustomQuestionLoading(false)
-      }
+      const quizService = new QuizService(client)
+      const customQuestion = await quizService.getCustomQuestion(
+        userChallenge.quiz.customQuestion,
+        fluidTypes
+      )
+      setCustomQuestion(customQuestion)
     }
-    if (isCustomQuest) {
-      setCustomQuestionLoading(true)
+    if (isCustomQuest && subscribed) {
       loadCustomQuestion()
     }
     return () => {
@@ -49,23 +47,37 @@ const QuizQuestion = ({ userChallenge }: { userChallenge: UserChallenge }) => {
     }
   }, [client, fluidTypes, isCustomQuest, userChallenge.quiz.customQuestion])
 
-  return (
-    <>
-      {isCustomQuest ? (
+  if (isCustomQuest && !customQuestion) {
+    return (
+      <div ref={mainContentRef} className="quiz-content" tabIndex={-1}>
+        <div className="question-loading">
+          <Loader />
+        </div>
+      </div>
+    )
+  }
+
+  if (isCustomQuest && customQuestion) {
+    return (
+      <div ref={mainContentRef} className="quiz-content" tabIndex={-1}>
         <QuizQuestionContentCustom
           userChallenge={userChallenge}
           goBack={goBack}
-          question={question}
-          isLoading={customQuestionLoading}
-        />
-      ) : (
-        <QuizQuestionContent
-          userChallenge={userChallenge}
-          setIsCustomQuest={setIsCustomQuest}
-          goBack={goBack}
+          customQuestion={customQuestion}
         />
-      )}
-    </>
+      </div>
+    )
+  }
+
+  return (
+    <div ref={mainContentRef} className="quiz-content" tabIndex={-1}>
+      <QuizQuestionContent
+        userChallenge={userChallenge}
+        setIsCustomQuest={setIsCustomQuest}
+        goBack={goBack}
+        focusCallback={focusMainContent}
+      />
+    </div>
   )
 }
 
diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContent.spec.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContent.spec.tsx
index 707db20c957bf13a88e956b40872912e4343738a..24613141899dab79b74d474a8f10ddae3f4a677a 100644
--- a/src/components/Quiz/QuizQuestion/QuizQuestionContent.spec.tsx
+++ b/src/components/Quiz/QuizQuestion/QuizQuestionContent.spec.tsx
@@ -33,6 +33,7 @@ describe('QuizQuestionContent component', () => {
           userChallenge={userChallengeData[0]}
           setIsCustomQuest={() => false}
           goBack={mockedNavigate('/challenges')}
+          focusCallback={jest.fn()}
         />
       </Provider>
     )
@@ -48,6 +49,7 @@ describe('QuizQuestionContent component', () => {
           userChallenge={userChallengeData[0]}
           setIsCustomQuest={() => false}
           goBack={mockedNavigate('/challenges')}
+          focusCallback={jest.fn()}
         />
       </Provider>
     )
diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx
index eb59925814374d01f1b630783c21b082cbb32db6..aa0bef5463cd8eee94d54b8fcaf05d2f1d6b2b27 100644
--- a/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx
+++ b/src/components/Quiz/QuizQuestion/QuizQuestionContent.tsx
@@ -3,7 +3,7 @@ import CloseIcon from 'assets/icons/ico/close.svg'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import QuizExplanationModal from 'components/Quiz/QuizExplanationModal/QuizExplanationModal'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { UserChallenge } from 'models'
 import React, { Dispatch, SetStateAction, useCallback, useState } from 'react'
@@ -17,12 +17,14 @@ interface QuizQuestionContent {
   userChallenge: UserChallenge
   setIsCustomQuest: Dispatch<SetStateAction<boolean>>
   goBack: () => void
+  focusCallback: () => void
 }
 
 const QuizQuestionContent = ({
   userChallenge,
   setIsCustomQuest,
   goBack,
+  focusCallback,
 }: QuizQuestionContent) => {
   const { t } = useI18n()
   const client = useClient()
@@ -48,7 +50,7 @@ const QuizQuestionContent = ({
     )
     setAnswerIndex(resultIndex)
     setOpenModal(true)
-    const quizUpdated = await quizService.updateUserQuiz(
+    const quizUpdated = quizService.updateUserQuiz(
       userChallenge.quiz,
       result[0].isTrue,
       questionIndex
@@ -73,22 +75,25 @@ const QuizQuestionContent = ({
     if (questionIndex !== userChallenge.quiz.questions.length - 1) {
       setQuestionIndex(questionIndex + 1)
     }
+    focusCallback()
   }, [
     questionIndex,
+    userChallenge.quiz.questions.length,
+    focusCallback,
     setIsCustomQuest,
     setQuestionIndex,
     setUserChoice,
     setOpenModal,
-    userChallenge.quiz.questions.length,
   ])
 
   return (
     <div className="quiz-container">
       <div className="question-container">
         <StyledIconButton
-          className="btn-back"
           icon={CloseIcon}
           onClick={goBack}
+          aria-label={t('quiz.accessibility.window_quit')}
+          className="btn-back"
         />
         <p className="index-question">{questionIndex + 1}/5</p>
         <p className="question text-18-bold">
diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx
index 9dbdbb01994e2df94271ff6e5198e069aa3887fb..2aade1252e59fef1d013db67b6c570ac3db14cfd 100644
--- a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx
+++ b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.spec.tsx
@@ -23,9 +23,10 @@ jest.mock('services/quiz.service', () => {
   }))
 })
 
+const mockUpdateUserChallenge = jest.fn()
 jest.mock('services/challenge.service', () => {
   return jest.fn(() => ({
-    updateUserChallenge: jest.fn(),
+    updateUserChallenge: mockUpdateUserChallenge,
   }))
 })
 
@@ -36,9 +37,8 @@ describe('QuizCustomQuestionContent component', () => {
       <Provider store={store}>
         <QuizQuestionContentCustom
           userChallenge={userChallengeData[0]}
-          question={questionEntity}
+          customQuestion={questionEntity}
           goBack={mockHistoryPush('/challenges')}
-          isLoading={false}
         />
       </Provider>
     )
@@ -63,13 +63,13 @@ describe('QuizCustomQuestionContent component', () => {
     expect(screen.getByRole('progressbar', { busy: true })).toBeInTheDocument()
   })
   it('should display QuizExplanationModal when click on Button', async () => {
+    mockUpdateUserChallenge.mockResolvedValue(userChallengeData[0])
     render(
       <Provider store={store}>
         <QuizQuestionContentCustom
           userChallenge={userChallengeData[0]}
-          question={questionEntity}
+          customQuestion={questionEntity}
           goBack={mockHistoryPush('/challenges')}
-          isLoading={false}
         />
       </Provider>
     )
diff --git a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx
index f37f638feef599af138a08aab4538c714f7485f3..e690af2d35d2fa31acc81c7933ae67b8f45e2752 100644
--- a/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx
+++ b/src/components/Quiz/QuizQuestion/QuizQuestionContentCustom.tsx
@@ -1,10 +1,9 @@
 import Button from '@material-ui/core/Button'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
-import Loader from 'components/Loader/Loader'
 import QuizExplanationModal from 'components/Quiz/QuizExplanationModal/QuizExplanationModal'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { UserChallengeUpdateFlag } from 'enums'
 import { QuestionEntity, UserChallenge } from 'models'
 import React, { useState } from 'react'
@@ -17,15 +16,13 @@ import './quizQuestion.scss'
 interface QuizQuestionContentCustomProps {
   userChallenge: UserChallenge
   goBack: () => void
-  question: QuestionEntity | undefined
-  isLoading: boolean
+  customQuestion: QuestionEntity
 }
 
 const QuizQuestionContentCustom = ({
   userChallenge,
   goBack,
-  question,
-  isLoading,
+  customQuestion,
 }: QuizQuestionContentCustomProps) => {
   const { t } = useI18n()
   const client = useClient()
@@ -38,27 +35,25 @@ const QuizQuestionContentCustom = ({
   const challengeService = new ChallengeService(client)
 
   const validateQuestion = async () => {
-    if (question) {
-      const resultIndex = question.answers.findIndex(
-        answer => answer.answerLabel === userChoice
-      )
-      setAnswerIndex(resultIndex)
-      setOpenModal(true)
+    const resultIndex = customQuestion.answers.findIndex(
+      answer => answer.answerLabel === userChoice
+    )
+    setAnswerIndex(resultIndex)
+    setOpenModal(true)
 
-      const result = question.answers.filter(
-        answer => answer.answerLabel === userChoice
-      )
-      const quizUpdated = await quizService.updateUserQuiz(
-        userChallenge.quiz,
-        result[0].isTrue
-      )
-      const userChallengeUpdated = await challengeService.updateUserChallenge(
-        userChallenge,
-        UserChallengeUpdateFlag.QUIZ_UPDATE,
-        quizUpdated
-      )
-      dispatch(updateUserChallengeList(userChallengeUpdated))
-    }
+    const result = customQuestion.answers.filter(
+      answer => answer.answerLabel === userChoice
+    )
+    const quizUpdated = quizService.updateUserQuiz(
+      userChallenge.quiz,
+      result[0].isTrue
+    )
+    const userChallengeUpdated = await challengeService.updateUserChallenge(
+      userChallenge,
+      UserChallengeUpdateFlag.QUIZ_UPDATE,
+      quizUpdated
+    )
+    dispatch(updateUserChallengeList(userChallengeUpdated))
   }
 
   const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -87,33 +82,21 @@ const QuizQuestionContentCustom = ({
           {t('quiz.consumption_question')}
         </p>
 
-        {isLoading ? (
-          <div className="question-loading">
-            <Loader />
+        <p className="question text-18-bold">{customQuestion.questionLabel}</p>
+        {customQuestion.answers.map((answer, index) => (
+          <div className="answer" key={index}>
+            <input
+              type="radio"
+              id={`answer${index}`}
+              value={answer.answerLabel}
+              onChange={handleChange}
+              checked={userChoice === answer.answerLabel}
+            />
+            <label htmlFor={`answer${index}`} className="text-16-bold">
+              {answer.answerLabel}
+            </label>
           </div>
-        ) : (
-          question && (
-            <>
-              <p className="question text-18-bold">{question.questionLabel}</p>
-              {question.answers.map((answer, index) => {
-                return (
-                  <div className="answer" key={index}>
-                    <input
-                      type="radio"
-                      id={`answer${index}`}
-                      value={answer.answerLabel}
-                      onChange={handleChange}
-                      checked={userChoice === answer.answerLabel}
-                    />
-                    <label htmlFor={`answer${index}`} className="text-16-bold">
-                      {answer.answerLabel}
-                    </label>
-                  </div>
-                )
-              })}
-            </>
-          )
-        )}
+        ))}
       </div>
       <Button
         aria-label={t('quiz.accessibility.button_validate')}
@@ -127,7 +110,7 @@ const QuizQuestionContentCustom = ({
       <QuizExplanationModal
         open={openModal}
         answerIndex={answerIndex}
-        question={question}
+        question={customQuestion}
         goNext={finishQuiz}
         handleCloseClick={() => setOpenModal(false)}
       />
diff --git a/src/components/Quiz/QuizQuestion/quizQuestion.scss b/src/components/Quiz/QuizQuestion/quizQuestion.scss
index cbab0ba2fc91fcab6fc0c6f47d570947dfd17849..035243a5a713a7a569c904715585d27805d1458f 100644
--- a/src/components/Quiz/QuizQuestion/quizQuestion.scss
+++ b/src/components/Quiz/QuizQuestion/quizQuestion.scss
@@ -1,89 +1,93 @@
 @import 'src/styles/base/color';
 @import 'src/styles/base/breakpoint';
 
-.quiz-container {
-  .question-container {
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-    padding: 1.5rem;
-    box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);
-    border-radius: 4px;
-    transition: all 300ms ease;
-    color: $white;
-    background: $grey-linear-gradient-background;
-    position: relative;
-    @media (min-width: $width-large-phone) {
-      height: 45vh;
-    }
-
-    .question-loading {
-      min-height: 13.875rem;
+.quiz-content {
+  outline: none;
+  margin: auto;
+  .quiz-container {
+    .question-container {
       display: flex;
+      flex-direction: column;
       justify-content: center;
       align-items: center;
+      padding: 1.5rem;
+      box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);
+      border-radius: 4px;
+      transition: all 300ms ease;
+      color: $white;
+      background: $grey-linear-gradient-background;
+      position: relative;
+      @media (min-width: $width-large-phone) {
+        height: 45vh;
+      }
+
+      .question-loading {
+        min-height: 13.875rem;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+      .question {
+        color: $grey-bright;
+        text-align: center;
+        margin-bottom: 2rem;
+        @media (min-width: $width-large-phone) {
+          padding: 0 1rem;
+        }
+      }
+      .question-title {
+        color: $blue-light;
+        margin-bottom: 0.5rem;
+      }
+      .btn-back {
+        color: $white;
+        background: none;
+        border: none;
+        padding: 0;
+        font-size: 1.3rem;
+        position: absolute;
+        top: 1rem;
+        right: 1rem;
+      }
     }
-    .question {
-      color: $grey-bright;
+    .answer {
       text-align: center;
-      margin-bottom: 2rem;
+      width: 100%;
       @media (min-width: $width-large-phone) {
-        padding: 0 1rem;
+        max-width: 80%;
+      }
+      input[type='radio'] {
+        position: fixed;
+        opacity: 0;
+        pointer-events: none;
+      }
+      input[type='radio']:focus + label {
+        background: $blue-light;
+        color: $dark-light-2;
+        border-color: $blue-light;
+      }
+      label {
+        display: block;
+        border: 1px solid $grey-bright;
+        padding: 0.5rem;
+        margin-bottom: 1rem;
+        cursor: pointer;
+      }
+      input[type='radio']:checked + label,
+      label:hover {
+        background: $blue-radial-gradient;
+        color: $dark-light-2;
+        border-color: $blue-light;
       }
     }
-    .question-title {
-      color: $blue-light;
-      margin-bottom: 0.5rem;
-    }
-    .btn-back {
-      color: $white;
-      background: none;
-      border: none;
-      padding: 0;
-      font-size: 1.3rem;
-      position: absolute;
-      top: 1rem;
-      right: 1rem;
-    }
-  }
-  .answer {
-    text-align: center;
-    width: 100%;
-    @media (min-width: $width-large-phone) {
-      max-width: 80%;
-    }
-    input[type='radio'] {
-      position: fixed;
-      opacity: 0;
-      pointer-events: none;
-    }
-    input[type='radio']:focus + label {
-      background: $blue-light;
-      color: $dark-light-2;
-      border-color: $blue-light;
-    }
-    label {
-      display: block;
-      border: 1px solid $grey-bright;
-      padding: 0.5rem;
-      margin-bottom: 1rem;
-      cursor: pointer;
-    }
-    input[type='radio']:checked + label,
-    label:hover {
-      background: $blue-radial-gradient;
-      color: $dark-light-2;
-      border-color: $blue-light;
+    button.validate {
+      margin-top: 1rem;
+      width: auto;
+      padding: 0.5rem 3rem;
     }
-  }
-  button.validate {
-    margin-top: 1rem;
-    width: auto;
-    padding: 0.5rem 3rem;
-  }
 
-  .index-question {
-    margin: 2rem 0 1rem;
+    .index-question {
+      margin: 2rem 0 1rem;
+    }
   }
 }
diff --git a/src/components/Quiz/QuizView.tsx b/src/components/Quiz/QuizView.tsx
index fc45df655cf53bcc4fc6851edb1b6ecb2d87a4b0..33abffc0471b1bf2679b542390fb24ecf2f769bc 100644
--- a/src/components/Quiz/QuizView.tsx
+++ b/src/components/Quiz/QuizView.tsx
@@ -9,6 +9,9 @@ import QuizBegin from './QuizBegin/QuizBegin'
 import QuizFinish from './QuizFinish/QuizFinish'
 import QuizQuestion from './QuizQuestion/QuizQuestion'
 
+/**
+ * http://ecolyo.cozy.tools:8080/#/challenges/quiz
+ */
 const QuizView = () => {
   const { currentChallenge } = useAppSelector(state => state.ecolyo.challenge)
 
diff --git a/src/components/ReleaseNotesModal/ReleaseNotesModal.tsx b/src/components/ReleaseNotesModal/ReleaseNotesModal.tsx
index d6c0ac583c54beb4f24437b35bce4ab8f9a8e3e2..ec22b2ffc21da51aa72a09d5187cb058356da279 100644
--- a/src/components/ReleaseNotesModal/ReleaseNotesModal.tsx
+++ b/src/components/ReleaseNotesModal/ReleaseNotesModal.tsx
@@ -1,22 +1,31 @@
 import Button from '@material-ui/core/Button'
 import Dialog from '@material-ui/core/Dialog'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
-import { useAppSelector } from 'store/hooks'
+import { useNavigate } from 'react-router-dom'
+import { showReleaseNotes } from 'store/global/global.slice'
+import { useAppDispatch, useAppSelector } from 'store/hooks'
 import './ReleaseNotesModal.scss'
 
-interface ReleaseNotesModalProps {
-  open: boolean
-  handleCloseClick: () => void
-}
-
-const ReleaseNotesModal = ({
-  open,
-  handleCloseClick,
-}: ReleaseNotesModalProps) => {
+const ReleaseNotesModal = ({ open }: { open: boolean }) => {
   const { t } = useI18n()
+  const navigate = useNavigate()
+  const dispatch = useAppDispatch()
   const { releaseNotes } = useAppSelector(state => state.ecolyo.global)
 
+  const handleCloseClick = () => {
+    dispatch(
+      showReleaseNotes({
+        show: false,
+        notes: releaseNotes.notes,
+        redirectLink: releaseNotes.redirectLink,
+      })
+    )
+    if (releaseNotes.redirectLink) {
+      navigate(releaseNotes.redirectLink)
+    }
+  }
+
   return (
     <Dialog
       open={open}
diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx
index a6cdf99bbd9d30ea9d8342544d664a61d6b70e0f..a1a55f5ce7708c662e9da033e65de53b044f09fe 100644
--- a/src/components/Routes/Routes.tsx
+++ b/src/components/Routes/Routes.tsx
@@ -89,7 +89,6 @@ const AppRoutes = ({ termsStatus }: { termsStatus: TermsStatus }) => {
             <Route path="/ecogestures" element={<EcogestureTabsView />} />
             <Route path="/options/legalnotice" element={<LegalNoticeView />} />
             <Route path="/options/gcu" element={<GCUView />} />
-            <Route path="/options/:connectParam" element={<OptionsView />} />
             <Route path="/options" element={<OptionsView />} />
             <Route path="/analysis" element={<AnalysisView />} />
             <Route path="/profiletype" element={<ProfileTypeView />} />
diff --git a/src/components/SkipLink/SkipLink.scss b/src/components/SkipLink/SkipLink.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c893a4a3ac29691269d6784ca0bdd345db135036
--- /dev/null
+++ b/src/components/SkipLink/SkipLink.scss
@@ -0,0 +1,18 @@
+@import 'src/styles/base/color';
+@import 'src/styles/base/z-index';
+
+.skip-link {
+  position: absolute;
+  top: -40px;
+  left: 0;
+  background: $dark;
+  color: $white;
+  border: $white;
+  padding: 8px;
+  z-index: $skip-link;
+  text-decoration: 'none';
+  transition: top 0.3s;
+  &:focus {
+    top: 0;
+  }
+}
diff --git a/src/components/SkipLink/SkipLink.tsx b/src/components/SkipLink/SkipLink.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a12d6807b38ae2bc6256d4584954271a9efa0a77
--- /dev/null
+++ b/src/components/SkipLink/SkipLink.tsx
@@ -0,0 +1,23 @@
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
+import React from 'react'
+import './SkipLink.scss'
+
+const SkipLink = () => {
+  const { t } = useI18n()
+
+  const handleSkip = (event: React.MouseEvent<HTMLButtonElement>) => {
+    event.preventDefault()
+    const mainContent = document.getElementById('app-content')
+    if (mainContent) {
+      mainContent.focus()
+    }
+  }
+
+  return (
+    <button type="button" className="skip-link" onClick={handleSkip}>
+      {t('common.accessibility.skip_link')}
+    </button>
+  )
+}
+
+export default SkipLink
diff --git a/src/components/Splash/SplashRoot.spec.tsx b/src/components/Splash/SplashRoot.spec.tsx
index 3f57b513afae955128380a203e95c612e23b5b07..710e35610f799a1c78a8450de3e00b4812446428 100644
--- a/src/components/Splash/SplashRoot.spec.tsx
+++ b/src/components/Splash/SplashRoot.spec.tsx
@@ -12,7 +12,7 @@ jest.mock('@sentry/react', () => ({
 
 describe('SplashRoot component', () => {
   const store = createMockEcolyoStore()
-  it('should be rendered correctly', async () => {
+  it('should be rendered correctly', () => {
     const { container } = render(
       <Provider store={store}>
         <SplashRoot>children</SplashRoot>
diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx
index 068f256c176eb0af7d04ddf2f29bcedbb352df2f..c3eba12ff61cd7cd2fc3e7e98d3eb2d5523b5cc8 100644
--- a/src/components/Splash/SplashRoot.tsx
+++ b/src/components/Splash/SplashRoot.tsx
@@ -19,7 +19,6 @@ import {
   PartnersInfo,
   Profile,
   ProfileType,
-  UserChallenge,
 } from 'models'
 import React, { ReactNode, useCallback, useEffect, useState } from 'react'
 import ActionService from 'services/action.service'
@@ -105,7 +104,7 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => {
 
   /** Process customPopup and enable it if activated */
   const processCustomPopup = useCallback(
-    async (profile: Profile, customPopup: CustomPopup) => {
+    (profile: Profile, customPopup: CustomPopup) => {
       try {
         if (
           today !== profile?.customPopupDate.toISO() &&
@@ -124,7 +123,7 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => {
    * For each fluid, set partnersIssue to true if notification is activated and seenDate < today
    */
   const processPartnersStatus = useCallback(
-    async (profile: Profile, partnersInfo: PartnersInfo) => {
+    (profile: Profile, partnersInfo: PartnersInfo) => {
       try {
         if (
           partnersInfo.notification_activated &&
@@ -182,180 +181,189 @@ const SplashRoot = ({ fadeTimer = 1000, children }: SplashRootProps) => {
 
   useEffect(() => {
     let subscribed = true
-    async function loadData() {
-      const initializationService = new InitializationService(
-        client,
-        setInitStep,
-        setInitStepErrors
-      )
-      const customPopupService = new CustomPopupService(client)
-      const partnersInfoService = new PartnersInfoService(client)
-      const ms = new MigrationService(client, setInitStepErrors)
+    function loadData() {
       const startTime = performance.now()
-      const transaction = Sentry.startTransaction({ name: 'Initialize app' })
-      try {
-        // init Terms
-        const termsStatus = await initializationService.initConsent()
-        if (subscribed) dispatch(updateTermsStatus(termsStatus))
-
-        // Init fluidPrices
-        await initializationService.initFluidPrices()
-
-        // Init profile and update ecogestures, challenges, analysis
-        const profile = await initializationService.initProfile()
-        const profileType = await initializationService.initProfileType()
-        const profileEcogesture =
-          await initializationService.initProfileEcogesture()
-
-        const migrationsResult = await ms.runMigrations(migrations)
-        // Init last release notes when they exist
-        dispatch(
-          showReleaseNotes({
-            notes: migrationsResult.notes,
-            redirectLink: migrationsResult.redirectLink,
-            show: migrationsResult.show,
-          })
+      Sentry.startSpan({ name: 'Initialize app' }, async () => {
+        const initializationService = new InitializationService(
+          client,
+          setInitStepErrors
         )
-        if (subscribed && profile) {
-          setValidExploration(UserExplorationID.EXPLORATION007)
+        const customPopupService = new CustomPopupService(client)
+        const partnersInfoService = new PartnersInfoService(client)
+        const ms = new MigrationService(client, setInitStepErrors)
+        try {
+          // Run init steps in parallel
+          setInitStep(InitSteps.PROFILE)
           const [
-            duelHash,
-            quizHash,
-            challengeHash,
-            explorationHash,
-            analysisResult,
+            termsStatus,
+            ,
+            profile,
+            profileType,
+            profileEcogesture,
+            fluidStatus,
           ] = await Promise.all([
-            initializationService.initDuelEntity(profile.duelHash),
-            initializationService.initQuizEntity(profile.quizHash),
-            initializationService.initExplorationEntity(profile.challengeHash),
-            initializationService.initChallengeEntity(profile.explorationHash),
-            initializationService.initAnalysis(profile),
+            initializationService.initConsent(),
+            initializationService.initFluidPrices(),
+            initializationService.initProfile(),
+            initializationService.initProfileType(),
+            initializationService.initProfileEcogesture(),
+            initializationService.initFluidStatus(),
           ])
-          const updatedProfile: Partial<Profile> = {
-            duelHash,
-            quizHash,
-            challengeHash,
-            explorationHash,
-            monthlyAnalysisDate: analysisResult.monthlyAnalysisDate,
-            haveSeenLastAnalysis: analysisResult.haveSeenLastAnalysis,
-          }
-          dispatch(updateProfile(updatedProfile))
-          dispatch(setAnalysisMonth(analysisResult.monthlyAnalysisDate))
-          if (profileType) {
-            await loadProfileType(profileType)
-          }
-          if (profileEcogesture) {
-            dispatch(setProfileEcogesture(profileEcogesture))
-          }
-          dispatch(toggleAnalysisNotification(!profile.haveSeenLastAnalysis))
-        }
-        // Init Fluid status && lastDate for the chart
-        const fluidStatus = await initializationService.initFluidStatus()
-        if (subscribed) {
-          dispatch(setFluidStatus(fluidStatus))
-          let lastDataDate: DateTime | null = DateTime.fromISO('0001-01-01')
-          for (const fluid of fluidStatus) {
-            if (fluid.lastDataDate && fluid.lastDataDate > lastDataDate) {
-              lastDataDate = fluid.lastDataDate
+          if (subscribed) dispatch(updateTermsStatus(termsStatus))
+
+          setInitStep(InitSteps.MIGRATION)
+          const migrationsResult = await ms.runMigrations(migrations)
+          // Init last release notes when they exist
+          dispatch(
+            showReleaseNotes({
+              notes: migrationsResult.notes,
+              redirectLink: migrationsResult.redirectLink,
+              show: migrationsResult.show,
+            })
+          )
+          if (subscribed && profile) {
+            setValidExploration(UserExplorationID.EXPLORATION007)
+            setInitStep(InitSteps.CHALLENGES)
+            const [
+              duelHash,
+              quizHash,
+              challengeHash,
+              explorationHash,
+              analysisResult,
+            ] = await Promise.all([
+              initializationService.initDuelEntity(profile.duelHash),
+              initializationService.initQuizEntity(profile.quizHash),
+              initializationService.initExplorationEntity(
+                profile.challengeHash
+              ),
+              initializationService.initChallengeEntity(
+                profile.explorationHash
+              ),
+              initializationService.initAnalysis(profile),
+            ])
+            const updatedProfile: Partial<Profile> = {
+              duelHash,
+              quizHash,
+              challengeHash,
+              explorationHash,
+              monthlyAnalysisDate: analysisResult.monthlyAnalysisDate,
+              haveSeenLastAnalysis: analysisResult.haveSeenLastAnalysis,
+            }
+            dispatch(updateProfile(updatedProfile))
+            dispatch(setAnalysisMonth(analysisResult.monthlyAnalysisDate))
+            if (profileType) {
+              await loadProfileType(profileType)
+            }
+            if (profileEcogesture) {
+              dispatch(setProfileEcogesture(profileEcogesture))
             }
+            dispatch(toggleAnalysisNotification(!profile.haveSeenLastAnalysis))
           }
-        }
-        // Init Challenge
-        const userChallengeList =
-          await initializationService.initUserChallenges(fluidStatus)
-        if (subscribed) {
-          dispatch(setUserChallengeList(userChallengeList))
-          const filteredCurrentOngoingChallenge = userChallengeList.filter(
-            challenge => challenge.state === UserChallengeState.ONGOING
-          )
-          // Set Notification if exploration state is notification
-          if (
-            filteredCurrentOngoingChallenge[0]?.exploration.state ===
-            UserExplorationState.NOTIFICATION
-          ) {
-            dispatch(toggleChallengeExplorationNotification(true))
+
+          // Process fluids status
+          if (subscribed) {
+            dispatch(setFluidStatus(fluidStatus))
+            let lastDataDate = DateTime.fromISO('0001-01-01')
+            for (const fluid of fluidStatus) {
+              if (fluid.lastDataDate && fluid.lastDataDate > lastDataDate) {
+                lastDataDate = fluid.lastDataDate
+              }
+            }
           }
-          // Set action to notification if action is accomplished
-          if (
-            filteredCurrentOngoingChallenge[0]?.action.state ===
-            UserActionState.ONGOING
-          ) {
-            const actionService = new ActionService(client)
-            const updatedUserChallenge: UserChallenge | null =
-              await actionService.isActionDone(
+          // Init Challenge
+          const userChallengeList =
+            await initializationService.initUserChallenges(fluidStatus)
+          if (subscribed) {
+            dispatch(setUserChallengeList(userChallengeList))
+            const filteredCurrentOngoingChallenge = userChallengeList.filter(
+              challenge => challenge.state === UserChallengeState.ONGOING
+            )
+            // Set Notification if exploration state is notification
+            if (
+              filteredCurrentOngoingChallenge[0]?.exploration.state ===
+              UserExplorationState.NOTIFICATION
+            ) {
+              dispatch(toggleChallengeExplorationNotification(true))
+            }
+            // Set action to notification if action is accomplished
+            if (
+              filteredCurrentOngoingChallenge[0]?.action.state ===
+              UserActionState.ONGOING
+            ) {
+              const actionService = new ActionService(client)
+              const updatedUserChallenge = await actionService.isActionDone(
                 filteredCurrentOngoingChallenge[0]
               )
-            if (updatedUserChallenge) {
-              dispatch(updateUserChallengeList(updatedUserChallenge))
+              if (updatedUserChallenge) {
+                dispatch(updateUserChallengeList(updatedUserChallenge))
+              }
             }
-          }
-          // Set Notification if action state is notification
-          if (
-            filteredCurrentOngoingChallenge[0]?.action.state ===
-            UserActionState.NOTIFICATION
-          ) {
-            dispatch(toggleChallengeActionNotification(true))
-          }
-          const filteredCurrentDuelChallenge = userChallengeList.filter(
-            challenge => challenge.state === UserChallengeState.DUEL
-          )
-          if (
-            filteredCurrentDuelChallenge[0]?.duel.state ===
-            UserDuelState.ONGOING
-          ) {
-            const { updatedUserChallenge, dataloads } =
-              await initializationService.initDuelProgress(
-                filteredCurrentDuelChallenge[0]
-              )
-            if (subscribed) {
-              dispatch(
-                setChallengeConsumption({
-                  userChallenge: updatedUserChallenge,
-                  currentDataload: dataloads,
-                })
-              )
-              // Check is duel is done and display notification
-              const challengeService = new ChallengeService(client)
-              const { isDone } = await challengeService.isChallengeDone(
-                updatedUserChallenge,
-                dataloads
-              )
-              dispatch(toggleChallengeDuelNotification(isDone))
+            // Set Notification if action state is notification
+            if (
+              filteredCurrentOngoingChallenge[0]?.action.state ===
+              UserActionState.NOTIFICATION
+            ) {
+              dispatch(toggleChallengeActionNotification(true))
+            }
+            const filteredCurrentDuelChallenge = userChallengeList.filter(
+              challenge => challenge.state === UserChallengeState.DUEL
+            )
+            if (
+              filteredCurrentDuelChallenge[0]?.duel.state ===
+              UserDuelState.ONGOING
+            ) {
+              const { updatedUserChallenge, dataloads } =
+                await initializationService.initDuelProgress(
+                  filteredCurrentDuelChallenge[0]
+                )
+              if (subscribed) {
+                dispatch(
+                  setChallengeConsumption({
+                    userChallenge: updatedUserChallenge,
+                    currentDataload: dataloads,
+                  })
+                )
+                // Check is duel is done and display notification
+                const challengeService = new ChallengeService(client)
+                const { isDone } = challengeService.isChallengeDone(
+                  updatedUserChallenge,
+                  dataloads
+                )
+                dispatch(toggleChallengeDuelNotification(isDone))
+              }
             }
           }
-        }
 
-        /**
-         * Load custom popup and partners info synchronously so these treatments don't block the loading
-         */
-        customPopupService.getCustomPopup().then(async customPopup => {
-          if (profile && customPopup) {
-            await processCustomPopup(profile, customPopup)
+          /**
+           * Load custom popup and partners info synchronously so these treatments don't block the loading
+           */
+          customPopupService.getCustomPopup().then(customPopup => {
+            if (profile && customPopup) {
+              processCustomPopup(profile, customPopup)
+            }
+          })
+          partnersInfoService.getPartnersInfo().then(async partnersInfo => {
+            if (profile && partnersInfo) {
+              await processFluidsStatus(profile, partnersInfo)
+              processPartnersStatus(profile, partnersInfo)
+            }
+          })
+
+          if (subscribed) {
+            logDuration('[Initialization] Finished successfully !', startTime)
+            setState(prev => ({
+              ...prev,
+              splashStart: true,
+            }))
           }
-        })
-        partnersInfoService.getPartnersInfo().then(async partnersInfo => {
-          if (profile && partnersInfo) {
-            await processFluidsStatus(profile, partnersInfo)
-            await processPartnersStatus(profile, partnersInfo)
+        } catch (error: any) {
+          if (error.message === 'Failed to fetch' && !initStepErrors) {
+            setInitStepErrors(InitStepsErrors.UNKNOWN_ERROR)
           }
-        })
-
-        if (subscribed) {
-          logDuration('[Initialization] Finished successfully !', startTime)
-          setState(prev => ({
-            ...prev,
-            splashStart: true,
-          }))
+          logApp.error(`[Initialization] Error : ${error}`)
+          Sentry.captureException(error)
         }
-      } catch (error: any) {
-        if (error.message === 'Failed to fetch' && !initStepErrors) {
-          setInitStepErrors(InitStepsErrors.UNKNOWN_ERROR)
-        }
-        logApp.error(`[Initialization] Error : ${error}`)
-        Sentry.captureException(error)
-      } finally {
-        transaction.finish()
-      }
+      })
     }
     if (!initStepErrors) loadData()
     return () => {
diff --git a/src/components/Splash/SplashScreen.spec.tsx b/src/components/Splash/SplashScreen.spec.tsx
index a8c692fbc40679130cd74dfd6eb681e79e4f67ed..44ec12deeb16a415bf71a390bd5743de3d2ff3d6 100644
--- a/src/components/Splash/SplashScreen.spec.tsx
+++ b/src/components/Splash/SplashScreen.spec.tsx
@@ -5,7 +5,7 @@ import SplashScreen from './SplashScreen'
 
 describe('SplashScreen component', () => {
   it('should be rendered correctly', () => {
-    const { container } = render(<SplashScreen initStep={InitSteps.CONSENT} />)
+    const { container } = render(<SplashScreen initStep={InitSteps.PROFILE} />)
     expect(container).toMatchSnapshot()
   })
 })
diff --git a/src/components/Splash/SplashScreen.tsx b/src/components/Splash/SplashScreen.tsx
index 7704bccd4961e2a1ee0d11e682cb69493e00ad45..c286acabee740cc9513a4d83d10e364204e50cad 100644
--- a/src/components/Splash/SplashScreen.tsx
+++ b/src/components/Splash/SplashScreen.tsx
@@ -1,6 +1,6 @@
 import logoLoading from 'assets/anims/logoLoading.gif'
 import logos from 'assets/png/logos_partenaires.svg'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { InitSteps } from 'models'
 import React from 'react'
 import './splashScreen.scss'
@@ -8,8 +8,10 @@ import './splashScreen.scss'
 const SplashScreen = ({ initStep }: { initStep: InitSteps }) => {
   const { t } = useI18n()
   const getProgress = () => {
-    const total = Object.values(InitSteps).length / 2
-    const progress = initStep === 0 ? 10 : Math.round((initStep / total) * 100)
+    const currentIndex = Object.values(InitSteps).indexOf(initStep)
+    const progress = Math.round(
+      (currentIndex / Object.values(InitSteps).length) * 100
+    )
     return progress - 90 /* hack to make the progress bar start way left */
   }
   return (
@@ -30,10 +32,7 @@ const SplashScreen = ({ initStep }: { initStep: InitSteps }) => {
         {t(`splashscreen.step.${initStep}`)}
       </div>
       <div className="splash-logos-container">
-        <img
-          src={logos}
-          alt="Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
-        />
+        <img src={logos} alt={t(`common.funders_logo`)} />
       </div>
     </div>
   )
diff --git a/src/components/Splash/SplashScreenError.tsx b/src/components/Splash/SplashScreenError.tsx
index eaec77ac5e95732a1ab252a0ec5bd05ae03130fa..d7d1984b287293c15f49f5c7477af1bf7d94053b 100644
--- a/src/components/Splash/SplashScreenError.tsx
+++ b/src/components/Splash/SplashScreenError.tsx
@@ -1,7 +1,7 @@
 import Button from '@material-ui/core/Button'
 import ecolyoIcon from 'assets/icons/ico/ecolyo.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import { InitStepsErrors } from 'models'
 import React from 'react'
 import './splashScreen.scss'
diff --git a/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap
index fa4bb3de62203c74ec6b90ba02c140ece728fc6f..429a52a266923551930f2a5a2f744c0491f7f904 100644
--- a/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap
+++ b/src/components/Splash/__snapshots__/SplashRoot.spec.tsx.snap
@@ -27,7 +27,7 @@ exports[`SplashRoot component should be rendered correctly 1`] = `
           >
             <div
               class="splash-progress-bar-content"
-              style="left: -73%;"
+              style="left: -90%;"
             />
           </div>
         </div>
@@ -35,13 +35,13 @@ exports[`SplashRoot component should be rendered correctly 1`] = `
       <div
         class="step-label text-18-normal"
       >
-        splashscreen.step.1
+        splashscreen.step.profile
       </div>
       <div
         class="splash-logos-container"
       >
         <img
-          alt="Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
+          alt="common.funders_logo"
           src="test-file-stub"
         />
       </div>
@@ -83,7 +83,7 @@ exports[`SplashRoot component should render the error screen 1`] = `
         <div
           class="splash-error-text text-18-normal"
         >
-          splashscreen.consent_error
+          splashscreen.consos_error
         </div>
       </div>
     </div>
diff --git a/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap b/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap
index 312e5c68c2a2ccd1ba7f994716b8cfd3ce1a7788..9d42bdb596f1565cc9c83da65fd4605e9b8786ad 100644
--- a/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap
+++ b/src/components/Splash/__snapshots__/SplashScreen.spec.tsx.snap
@@ -23,7 +23,7 @@ exports[`SplashScreen component should be rendered correctly 1`] = `
         >
           <div
             class="splash-progress-bar-content"
-            style="left: -73%;"
+            style="left: -90%;"
           />
         </div>
       </div>
@@ -31,13 +31,13 @@ exports[`SplashScreen component should be rendered correctly 1`] = `
     <div
       class="step-label text-18-normal"
     >
-      splashscreen.step.1
+      splashscreen.step.profile
     </div>
     <div
       class="splash-logos-container"
     >
       <img
-        alt="Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
+        alt="common.funders_logo"
         src="test-file-stub"
       />
     </div>
diff --git a/src/components/Terms/CGUModal.tsx b/src/components/Terms/CGUModal.tsx
index a5ae234d15802ee66227cec1f37ce71bed6d6084..e7c0d595384cce2e6b480df3ee1281ff4dff0230 100644
--- a/src/components/Terms/CGUModal.tsx
+++ b/src/components/Terms/CGUModal.tsx
@@ -1,9 +1,9 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import GCUContent from 'components/Options/GCU/GCUContent'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './termsView.scss'
 
@@ -26,13 +26,12 @@ const CGUModal = ({ open, handleCloseClick }: CGUModalProps) => {
       <div id="accessibility-title">
         {t('feedback.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <GCUContent />
       <Button
         aria-label={t('gcu_modal.accessibility.button_accept')}
diff --git a/src/components/Terms/DataShareConsentContent.spec.tsx b/src/components/Terms/DataShareConsentContent.spec.tsx
index d2e1baab73a768707a7f3ebd2a12facf01663965..5b0a587b239f2da4ea389dba8bd620edc68cda4c 100644
--- a/src/components/Terms/DataShareConsentContent.spec.tsx
+++ b/src/components/Terms/DataShareConsentContent.spec.tsx
@@ -1,13 +1,13 @@
 import { render } from '@testing-library/react'
 import React from 'react'
 import { Provider } from 'react-redux'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import { createMockEcolyoStore, mockProfileState } from 'tests/__mocks__/store'
 import DataShareConsentContent from './DataShareConsentContent'
 
 describe('DataShareConsentContent component', () => {
   it('should be rendered correctly with first connexion text', () => {
     const store = createMockEcolyoStore({
-      profile: { isFirstConnection: true },
+      profile: { ...mockProfileState, isFirstConnection: true },
     })
     const { container } = render(
       <Provider store={store}>
@@ -18,7 +18,7 @@ describe('DataShareConsentContent component', () => {
   })
   it('should be rendered correctly without first connexion text', () => {
     const store = createMockEcolyoStore({
-      profile: { isFirstConnection: false },
+      profile: { ...mockProfileState, isFirstConnection: false },
     })
     const { container } = render(
       <Provider store={store}>
diff --git a/src/components/Terms/DataShareConsentContent.tsx b/src/components/Terms/DataShareConsentContent.tsx
index 97e17a7abb99a7e0e5fc8b9bef177412afe13654..4f93b0955b8abecd581cdfc11ade2d8cb344f32c 100644
--- a/src/components/Terms/DataShareConsentContent.tsx
+++ b/src/components/Terms/DataShareConsentContent.tsx
@@ -1,4 +1,4 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import { useAppSelector } from 'store/hooks'
 import './termsView.scss'
@@ -15,9 +15,12 @@ const DataShareConsentContent = () => {
             ? t('dataShare.title1')
             : t('dataShare.title1Update')}
         </h1>
-        {!isFirstConnection && (
-          <p className="text-14-normal">{t('dataShare.title2Update')}</p>
-        )}
+        <p className="text-14-normal">
+          {isFirstConnection
+            ? t('dataShare.title2')
+            : t('dataShare.title2Update')}
+        </p>
+
         <p className="text-14-normal">{t('dataShare.part1')}</p>
         <p className="text-14-normal">{t('dataShare.part2')}</p>
         <p className="text-14-normal">{t('dataShare.part3')}</p>
diff --git a/src/components/Terms/LegalNoticeModal.tsx b/src/components/Terms/LegalNoticeModal.tsx
index 1dce2e13d0b262d18aacfd5b4e31e2f6a9044425..b06ebc982203c8639154192d35ca655ff5071a1f 100644
--- a/src/components/Terms/LegalNoticeModal.tsx
+++ b/src/components/Terms/LegalNoticeModal.tsx
@@ -1,9 +1,9 @@
-import { Button, IconButton } from '@material-ui/core'
+import { Button } from '@material-ui/core'
 import Dialog from '@material-ui/core/Dialog'
 import CloseIcon from 'assets/icons/ico/close.svg'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import LegalNoticeContent from 'components/Options/LegalNotice/LegalNoticeContent'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './termsView.scss'
 
@@ -28,13 +28,12 @@ const LegalNoticeModal = ({
       }}
     >
       <div id="accessibility-title">{t('legal.title_legal')}</div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={handleCloseClick}
         aria-label={t('feedback.accessibility.button_close')}
         className="modal-paper-close-button"
-        onClick={handleCloseClick}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <LegalNoticeContent />
       <Button
         aria-label={t('gcu_modal.accessibility.button_accept')}
diff --git a/src/components/Terms/MinorUpdateContent.tsx b/src/components/Terms/MinorUpdateContent.tsx
index 1633b98d3c150676afdcd9626411b1e24557c4d4..bc1114f3cab83d7178c69c569cfe3d29ec4addb0 100644
--- a/src/components/Terms/MinorUpdateContent.tsx
+++ b/src/components/Terms/MinorUpdateContent.tsx
@@ -1,4 +1,4 @@
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React from 'react'
 import './termsView.scss'
 
diff --git a/src/components/Terms/TermsView.spec.tsx b/src/components/Terms/TermsView.spec.tsx
index 98d0aae76563e2cabe38caf2240088104e408396..0c9e0a9c5e324ea38e73d2918bd4f424bfc2aab5 100644
--- a/src/components/Terms/TermsView.spec.tsx
+++ b/src/components/Terms/TermsView.spec.tsx
@@ -3,7 +3,11 @@ import { userEvent } from '@testing-library/user-event'
 import React from 'react'
 import { Provider } from 'react-redux'
 import * as storeHooks from 'store/hooks'
-import { createMockEcolyoStore } from 'tests/__mocks__/store'
+import {
+  createMockEcolyoStore,
+  mockGlobalState,
+  mockProfileState,
+} from 'tests/__mocks__/store'
 import { mockUpToDateTerm } from 'tests/__mocks__/termsData.mock'
 import TermsView from './TermsView'
 
@@ -40,6 +44,36 @@ describe('TermsView component', () => {
     await waitFor(() => null, { container })
     expect(container).toMatchSnapshot()
   })
+
+  it('should open CGU modal', async () => {
+    render(
+      <Provider store={store}>
+        <TermsView />
+      </Provider>
+    )
+    await act(async () => {
+      await userEvent.click(
+        screen.getByRole('button', {
+          name: 'dataShare.validCGU_button',
+        })
+      )
+    })
+    expect(screen.getByRole('dialog')).toBeInTheDocument()
+  })
+
+  it('should open legal notice modal', async () => {
+    render(
+      <Provider store={store}>
+        <TermsView />
+      </Provider>
+    )
+    await act(async () => {
+      await userEvent.click(
+        screen.getByRole('button', { name: 'dataShare.validLegal_button' })
+      )
+    })
+    expect(screen.getByRole('dialog')).toBeInTheDocument()
+  })
   it('should be unable to click "validate" button first then enable checkboxes and valid consent', async () => {
     mockCreateTerm.mockResolvedValueOnce(mockUpToDateTerm)
     const { container } = render(
@@ -62,34 +96,45 @@ describe('TermsView component', () => {
       await userEvent.click(acceptButton)
     })
 
-    expect(mockAppDispatch).toHaveBeenCalledTimes(3)
+    expect(mockAppDispatch).toHaveBeenCalledTimes(4)
   })
 
-  it('should open CGU modal', async () => {
-    render(
-      <Provider store={store}>
+  it('should not display the newsletter checkbox if already subscribed', async () => {
+    const storeSubscribed = createMockEcolyoStore({
+      global: {
+        ...mockGlobalState,
+        termsStatus: { accepted: false, versionType: 'init' },
+      },
+      profile: { ...mockProfileState, sendAnalysisNotification: true },
+    })
+
+    const { container } = render(
+      <Provider store={storeSubscribed}>
         <TermsView />
       </Provider>
     )
-    await act(async () => {
-      await userEvent.click(
-        screen.getByRole('button', { name: 'dataShare.validCGU_button' })
-      )
-    })
-    expect(screen.getByRole('dialog')).toBeInTheDocument()
+    await waitFor(() => null, { container })
+
+    const [, , boxNewsletter] = screen.getAllByRole('checkbox')
+    expect(boxNewsletter).toBeUndefined()
   })
 
-  it('should open legal notice modal', async () => {
-    render(
-      <Provider store={store}>
+  it('should display the newsletter checkbox if not subscribed', async () => {
+    const storeNotSubscribed = createMockEcolyoStore({
+      global: {
+        ...mockGlobalState,
+        termsStatus: { accepted: false, versionType: 'init' },
+      },
+      profile: { ...mockProfileState, sendAnalysisNotification: false },
+    })
+    const { container } = render(
+      <Provider store={storeNotSubscribed}>
         <TermsView />
       </Provider>
     )
-    await act(async () => {
-      await userEvent.click(
-        screen.getByRole('button', { name: 'dataShare.validLegal_button' })
-      )
-    })
-    expect(screen.getByRole('dialog')).toBeInTheDocument()
+    await waitFor(() => null, { container })
+
+    const [, , boxNewsletter] = screen.getAllByRole('checkbox')
+    expect(boxNewsletter).toBeInTheDocument()
   })
 })
diff --git a/src/components/Terms/TermsView.tsx b/src/components/Terms/TermsView.tsx
index 4087319de1ea026307e2c0b567cdf5ea598b486c..5521249aa30d09ccd3c33b450646421ccdcb2017 100644
--- a/src/components/Terms/TermsView.tsx
+++ b/src/components/Terms/TermsView.tsx
@@ -1,11 +1,12 @@
-import { Button } from '@material-ui/core'
+import { Button, Checkbox } from '@material-ui/core'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useCallback, useState } from 'react'
 import { useNavigate } from 'react-router-dom'
 import TermsService from 'services/terms.service'
 import { updateTermsStatus } from 'store/global/global.slice'
 import { useAppDispatch, useAppSelector } from 'store/hooks'
+import { updateProfile } from 'store/profile/profile.slice'
 import CGUModal from './CGUModal'
 import DataShareConsentContent from './DataShareConsentContent'
 import LegalNoticeModal from './LegalNoticeModal'
@@ -17,26 +18,16 @@ const TermsView = () => {
   const client = useClient()
   const navigate = useNavigate()
   const dispatch = useAppDispatch()
-  const { termsStatus } = useAppSelector(state => state.ecolyo.global)
+  const {
+    global: { termsStatus },
+    profile: { sendAnalysisNotification },
+  } = useAppSelector(state => state.ecolyo)
+  const [acceptNewsletter, setAcceptNewsletter] = useState(false)
   const [GCUValidation, setGCUValidation] = useState(false)
   const [dataConsentValidation, setDataConsentValidation] = useState(false)
   const [openCGUModal, setOpenCGUModal] = useState(false)
   const [openLegalNoticeModal, setOpenLegalNoticeModal] = useState(false)
 
-  const toggleCGUModal = () => {
-    setOpenCGUModal(prev => !prev)
-  }
-  const toggleLegalNoticeModal = () => {
-    setOpenLegalNoticeModal(prev => !prev)
-  }
-
-  const handleGCUValidate = () => {
-    setGCUValidation(prev => !prev)
-  }
-  const handleDataConsentValidation = () => {
-    setDataConsentValidation(prev => !prev)
-  }
-
   const handleTermValidate = useCallback(async () => {
     const termsService = new TermsService(client)
     const createdTerm = await termsService.createTerm()
@@ -48,8 +39,12 @@ const TermsView = () => {
         })
       )
     }
+
+    if (acceptNewsletter) {
+      dispatch(updateProfile({ sendAnalysisNotification: true }))
+    }
     navigate('/consumption')
-  }, [dispatch, client, navigate])
+  }, [client, acceptNewsletter, navigate, dispatch])
 
   return (
     <div className="terms-wrapper">
@@ -58,31 +53,28 @@ const TermsView = () => {
         <>
           <div className="terms-content">
             <DataShareConsentContent />
-            <label className="inline">
-              <input
-                type="checkbox"
-                name="Data-consent-validation"
-                className="inputCheckbox"
-                onChange={handleDataConsentValidation}
+            <label htmlFor="dataConsent" className="inline">
+              <Checkbox
+                id="dataConsent"
+                onChange={e => setDataConsentValidation(e.target.checked)}
                 checked={dataConsentValidation}
+                required
               />
               {t('dataShare.validDataConsent')}
             </label>
-            <label className="inline">
-              <input
+            <label htmlFor="gcu" className="inline">
+              <Checkbox
                 id="gcu"
-                type="checkbox"
-                name="GCU-validation"
-                className="inputCheckbox"
-                onChange={handleGCUValidate}
+                onChange={e => setGCUValidation(e.target.checked)}
                 checked={GCUValidation}
+                required
               />
               <div>
                 <span>{t('dataShare.validCGU')}</span>
                 <Button
                   size="small"
                   className="btnText"
-                  onClick={toggleCGUModal}
+                  onClick={() => setOpenCGUModal(true)}
                 >
                   {t('dataShare.validCGU_button')}
                 </Button>
@@ -91,13 +83,25 @@ const TermsView = () => {
                 <Button
                   size="small"
                   className="btnText"
-                  onClick={toggleLegalNoticeModal}
+                  onClick={() => setOpenLegalNoticeModal(true)}
                 >
                   {t('dataShare.validLegal_button')}
                 </Button>
                 <span>{t('dataShare.validLegal2')}</span>
               </div>
             </label>
+            {!sendAnalysisNotification && (
+              <label htmlFor="newsletter" className="inline">
+                <Checkbox
+                  id="newsletter"
+                  onChange={e => setAcceptNewsletter(e.target.checked)}
+                  checked={acceptNewsletter}
+                />
+                <div>
+                  <span>{t('dataShare.acceptNewsletter')}</span>
+                </div>
+              </label>
+            )}
           </div>
           <div className="terms-footer">
             <Button
@@ -116,21 +120,20 @@ const TermsView = () => {
             <MinorUpdateContent />
           </div>
           <div className="terms-footer">
-            <Button
-              aria-label={t('minorUpdate.button')}
-              onClick={handleTermValidate}
-              className="btnPrimary"
-            >
+            <Button onClick={handleTermValidate} className="btnPrimary">
               {t('minorUpdate.button')}
             </Button>
           </div>
         </>
       )}
 
-      <CGUModal open={openCGUModal} handleCloseClick={toggleCGUModal} />
+      <CGUModal
+        open={openCGUModal}
+        handleCloseClick={() => setOpenCGUModal(false)}
+      />
       <LegalNoticeModal
         open={openLegalNoticeModal}
-        handleCloseClick={toggleLegalNoticeModal}
+        handleCloseClick={() => setOpenLegalNoticeModal(false)}
       />
     </div>
   )
diff --git a/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap b/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap
index a2fff83b060e8eb574459d9e44ff77973dadaa83..fba795cb09444cde38151b2c62da860d749f20c1 100644
--- a/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap
+++ b/src/components/Terms/__snapshots__/CGUModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`CGUModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -149,11 +150,6 @@ exports[`CGUModal component should be rendered correctly 1`] = `
             >
               gcu.content.part3_3
             </p>
-            <p
-              class="text-14-normal"
-            >
-              gcu.content.part3_4
-            </p>
             <div
               class="gcu-content-part-title text-15-normal"
             >
diff --git a/src/components/Terms/__snapshots__/DataShareConsentContent.spec.tsx.snap b/src/components/Terms/__snapshots__/DataShareConsentContent.spec.tsx.snap
index 69141d0536a316b3162f78c838aab7612e51e4a4..1a3d6f325acb6475bb6df19011318675a2c9a2f8 100644
--- a/src/components/Terms/__snapshots__/DataShareConsentContent.spec.tsx.snap
+++ b/src/components/Terms/__snapshots__/DataShareConsentContent.spec.tsx.snap
@@ -13,6 +13,11 @@ exports[`DataShareConsentContent component should be rendered correctly with fir
       >
         dataShare.title1
       </h1>
+      <p
+        class="text-14-normal"
+      >
+        dataShare.title2
+      </p>
       <p
         class="text-14-normal"
       >
diff --git a/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap b/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap
index 2f134b674a199fe9c243f1a07083daad1b0f2310..12f39a089ab591baf0fda9b7c671d1807d647f13 100644
--- a/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap
+++ b/src/components/Terms/__snapshots__/LegalNoticeModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`LegalNoticeModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
diff --git a/src/components/Terms/__snapshots__/TermsView.spec.tsx.snap b/src/components/Terms/__snapshots__/TermsView.spec.tsx.snap
index 0783bbe8bd4baac1ffc15c47ee7fddf4c20c265d..179095095f100cf6168e34701f9b6f4a8e71d91c 100644
--- a/src/components/Terms/__snapshots__/TermsView.spec.tsx.snap
+++ b/src/components/Terms/__snapshots__/TermsView.spec.tsx.snap
@@ -102,23 +102,74 @@ exports[`TermsView component should be rendered correctly 1`] = `
       </div>
       <label
         class="inline"
+        for="dataConsent"
       >
-        <input
-          class="inputCheckbox"
-          name="Data-consent-validation"
-          type="checkbox"
-        />
+        <span
+          aria-disabled="false"
+          class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-1 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
+        >
+          <span
+            class="MuiIconButton-label"
+          >
+            <input
+              class="PrivateSwitchBase-input-4"
+              data-indeterminate="false"
+              id="dataConsent"
+              required=""
+              type="checkbox"
+              value=""
+            />
+            <svg
+              aria-hidden="true"
+              class="MuiSvgIcon-root"
+              focusable="false"
+              viewBox="0 0 24 24"
+            >
+              <path
+                d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
+              />
+            </svg>
+          </span>
+          <span
+            class="MuiTouchRipple-root"
+          />
+        </span>
         dataShare.validDataConsent
       </label>
       <label
         class="inline"
+        for="gcu"
       >
-        <input
-          class="inputCheckbox"
-          id="gcu"
-          name="GCU-validation"
-          type="checkbox"
-        />
+        <span
+          aria-disabled="false"
+          class="MuiButtonBase-root MuiIconButton-root PrivateSwitchBase-root-1 MuiCheckbox-root MuiCheckbox-colorSecondary MuiIconButton-colorSecondary"
+        >
+          <span
+            class="MuiIconButton-label"
+          >
+            <input
+              class="PrivateSwitchBase-input-4"
+              data-indeterminate="false"
+              id="gcu"
+              required=""
+              type="checkbox"
+              value=""
+            />
+            <svg
+              aria-hidden="true"
+              class="MuiSvgIcon-root"
+              focusable="false"
+              viewBox="0 0 24 24"
+            >
+              <path
+                d="M19 5v14H5V5h14m0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"
+              />
+            </svg>
+          </span>
+          <span
+            class="MuiTouchRipple-root"
+          />
+        </span>
         <div>
           <span>
             dataShare.validCGU
diff --git a/src/components/Terms/termsView.scss b/src/components/Terms/termsView.scss
index 4c4c64281fae0cf2874a67ebdbf9314c2b9be681..50d40e2c6646e7c178c0dc13609598aef42046b0 100644
--- a/src/components/Terms/termsView.scss
+++ b/src/components/Terms/termsView.scss
@@ -5,13 +5,6 @@
   box-sizing: border-box;
   width: 100vw;
   overflow-x: hidden;
-  p,
-  ul,
-  li,
-  label,
-  span {
-    color: $grey-bright;
-  }
   h1 {
     color: $gold-shadow;
     font-weight: 800;
diff --git a/src/components/TotalConsumption/TotalConsumption.tsx b/src/components/TotalConsumption/TotalConsumption.tsx
index eec9e9ab7730e222d0f969a3339c9e75f4d3548a..75959c1e99cef1fc63ed720fc6678189e8de628f 100644
--- a/src/components/TotalConsumption/TotalConsumption.tsx
+++ b/src/components/TotalConsumption/TotalConsumption.tsx
@@ -72,7 +72,7 @@ const TotalConsumption = ({ fluidType }: { fluidType: FluidType }) => {
   )
 
   useEffect(() => {
-    let isMounted = true
+    let subscribed = true
     const fetchTotal = async () => {
       await computeTotal(currentDatachart.actualData, setTotalValue)
       if (currentDatachart.comparisonData) {
@@ -82,9 +82,9 @@ const TotalConsumption = ({ fluidType }: { fluidType: FluidType }) => {
         )
       }
     }
-    isMounted && fetchTotal()
+    subscribed && fetchTotal()
     return () => {
-      isMounted = false
+      subscribed = false
     }
   }, [currentDatachart, fluidType, currentTimeStep, client, computeTotal])
 
diff --git a/src/components/WelcomeModal/WelcomeModal.spec.tsx b/src/components/WelcomeModal/WelcomeModal.spec.tsx
index e6104c84270c4a833d39aeba79a39661c8ca0ccc..41b8a4e13427b5aa1ad184a6dca4b0cefe609652 100644
--- a/src/components/WelcomeModal/WelcomeModal.spec.tsx
+++ b/src/components/WelcomeModal/WelcomeModal.spec.tsx
@@ -8,7 +8,7 @@ import WelcomeModal from './WelcomeModal'
 
 jest.mock('components/Hooks/useUserInstanceSettings', () => {
   return jest.fn(() => ({
-    data: {
+    instanceSettings: {
       // eslint-disable-next-line camelcase
       public_name: 'mocked_public_name',
     },
diff --git a/src/components/WelcomeModal/WelcomeModal.tsx b/src/components/WelcomeModal/WelcomeModal.tsx
index 7af1db71548ac6f02d8f6d6ca6f2f19942df54f6..b1fdea23c244792b15525c0951ef1675d336ac79 100644
--- a/src/components/WelcomeModal/WelcomeModal.tsx
+++ b/src/components/WelcomeModal/WelcomeModal.tsx
@@ -1,10 +1,11 @@
-import { Button, Dialog, IconButton } from '@material-ui/core'
+import { Button, Dialog } from '@material-ui/core'
 import CloseIcon from 'assets/icons/ico/close.svg'
 import PartnersConsentIcon from 'assets/icons/visu/onboarding/partners_consent.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import useUserInstanceSettings from 'components/Hooks/useUserInstanceSettings'
 import { useClient } from 'cozy-client'
-import { useI18n } from 'cozy-ui/transpiled/react/I18n'
-import Icon from 'cozy-ui/transpiled/react/Icon'
+import { useI18n } from 'cozy-ui/transpiled/react/providers/I18n'
 import React, { useCallback } from 'react'
 import EnvironmentService from 'services/environment.service'
 import MailService from 'services/mail.service'
@@ -19,9 +20,9 @@ const WelcomeModal = ({ open }: { open: boolean }) => {
   const { t } = useI18n()
   const client = useClient()
   const dispatch = useAppDispatch()
-  const { data: instanceSettings } = useUserInstanceSettings()
+  const { instanceSettings } = useUserInstanceSettings()
 
-  const setWelcomeModalViewed = useCallback(async () => {
+  const setWelcomeModalViewed = useCallback(() => {
     const mailService = new MailService()
     let username = ''
 
@@ -79,13 +80,12 @@ const WelcomeModal = ({ open }: { open: boolean }) => {
       <div id="accessibility-title">
         {t('onboarding.welcomeModal.accessibility.window_title')}
       </div>
-      <IconButton
+      <StyledIconButton
+        icon={CloseIcon}
+        onClick={setWelcomeModalViewed}
         aria-label={t('onboarding.welcomeModal.accessibility.button_valid')}
         className="modal-paper-close-button"
-        onClick={setWelcomeModalViewed}
-      >
-        <Icon icon={CloseIcon} size={16} />
-      </IconButton>
+      />
       <div className="info">
         <h1 className="info-header text-24-bold">
           {t('onboarding.welcomeModal.title')}
@@ -95,7 +95,7 @@ const WelcomeModal = ({ open }: { open: boolean }) => {
           <p>{t('onboarding.welcomeModal.part2')}</p>
         </div>
         <div className="info-footer">
-          <Icon icon={PartnersConsentIcon} size={191} />
+          <StyledIcon icon={PartnersConsentIcon} size={191} />
           <Button
             aria-label={t('onboarding.welcomeModal.accessibility.button_valid')}
             onClick={setWelcomeModalViewed}
diff --git a/src/components/WelcomeModal/__snapshots__/WelcomeModal.spec.tsx.snap b/src/components/WelcomeModal/__snapshots__/WelcomeModal.spec.tsx.snap
index 602c18b25b32ece87df10ab23d9192551e040e3f..7f96a2ea50d0f1b608eef4e5d093391c97902a71 100644
--- a/src/components/WelcomeModal/__snapshots__/WelcomeModal.spec.tsx.snap
+++ b/src/components/WelcomeModal/__snapshots__/WelcomeModal.spec.tsx.snap
@@ -47,6 +47,7 @@ exports[`WelcomeModal component should be rendered correctly 1`] = `
             class="MuiIconButton-label"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="16"
               width="16"
@@ -84,6 +85,7 @@ exports[`WelcomeModal component should be rendered correctly 1`] = `
             class="info-footer"
           >
             <svg
+              aria-hidden="true"
               class="styles__icon___23x3R"
               height="191"
               width="191"
diff --git a/src/components/theme.ts b/src/components/theme.ts
index 9f08839f031ef6da09636a558b98e59e6d0226f7..0d900f018f4bc247c2cd50952ed9e960099bd328 100644
--- a/src/components/theme.ts
+++ b/src/components/theme.ts
@@ -7,6 +7,9 @@ export const theme = createTheme({
       main: '#F1C017',
       '500': '#579eff',
     },
+    secondary: {
+      main: '#F1C017',
+    },
   },
   typography: { fontFamily: ['Lato'].join(',') },
   overrides: {
@@ -36,5 +39,10 @@ export const theme = createTheme({
         color: '#e0e0e0',
       },
     },
+    MuiCheckbox: {
+      root: {
+        padding: 0,
+      },
+    },
   },
 })
diff --git a/src/db/explorationEntity.json b/src/db/explorationEntity.json
index 3a596b8da0b693d4b9912c0e17ad4dc4128dfd53..41e1ad408a6b89152be2c60b603401084e68023e 100644
--- a/src/db/explorationEntity.json
+++ b/src/db/explorationEntity.json
@@ -26,7 +26,7 @@
   {
     "_id": "EXPLORATION003",
     "state": 0,
-    "description": "Consultez vos données sur une période de 5 ans.",
+    "description": "Découvrez le pas de temps de \"5 ans\" dans la page Consos et consultez ainsi vos données dans leur historique le plus profond.",
     "complementary_description": "",
     "target": 1,
     "type": 2,
diff --git a/src/db/profileData.ts b/src/db/profileData.ts
index e6b02f585913c10d51b800de352c1a0bc86018ea..e045626a4857bb80e5da8c779f4c60c79d82ec6e 100644
--- a/src/db/profileData.ts
+++ b/src/db/profileData.ts
@@ -9,22 +9,23 @@ const profileData: Omit<ProfileEntity, 'id'> = {
   explorationHash: '',
   haveSeenEcogestureModal: false,
   haveSeenLastAnalysis: true,
+  isAnalysisReminderEnabled: true,
   isFirstConnection: true,
   isProfileEcogestureCompleted: false,
   isProfileTypeCompleted: false,
   lastConnectionDate: '0000-01-01T00:00:00.000Z',
   mailToken: '',
   monthlyAnalysisDate: '0000-01-01T00:00:00.000Z',
+  onboarding: {
+    isWelcomeSeen: false,
+  },
   partnersIssueSeenDate: {
     enedis: '0000-01-01T00:00:00.000Z',
     egl: '0000-01-01T00:00:00.000Z',
     grdf: '0000-01-01T00:00:00.000Z',
   },
   quizHash: '',
-  onboarding: {
-    isWelcomeSeen: false,
-  },
-  sendAnalysisNotification: true,
+  sendAnalysisNotification: false,
   sendConsumptionAlert: false,
   waterDailyConsumptionLimit: 0,
 }
diff --git a/src/db/profileTypeData.json b/src/db/profileTypeData.json
index 63b94873cec67f27366b8d0095e9dd892ac01630..4722cac419bfb9fbd7476a28e8f77c9ed372f831 100644
--- a/src/db/profileTypeData.json
+++ b/src/db/profileTypeData.json
@@ -17,7 +17,8 @@
       "hasReplacedHeater": "unknown",
       "warmingFluid": 0,
       "hotWaterFluid": 0,
-      "cookingFluid": 0
+      "cookingFluid": 0,
+      "equipments": []
     }
   }
 ]
diff --git a/src/doctypes/com-grandlyon-ecolyo-form.ts b/src/doctypes/com-grandlyon-ecolyo-form.ts
new file mode 100644
index 0000000000000000000000000000000000000000..45b9b49f6dfc98cfd379815bf9ef0e759e344899
--- /dev/null
+++ b/src/doctypes/com-grandlyon-ecolyo-form.ts
@@ -0,0 +1 @@
+export const FORM_DOCTYPE = 'com.grandlyon.ecolyo.form'
diff --git a/src/doctypes/index.ts b/src/doctypes/index.ts
index 3eded16b7eb5ed8c96f57ab34952b702f8c94a03..96ab63b223bd8b006bd039a29844cc4467659002 100644
--- a/src/doctypes/index.ts
+++ b/src/doctypes/index.ts
@@ -3,6 +3,7 @@ import { DUEL_DOCTYPE } from './com-grandlyon-ecolyo-duel'
 import { ECOGESTURE_DOCTYPE } from './com-grandlyon-ecolyo-ecogesture'
 import { EXPLORATION_DOCTYPE } from './com-grandlyon-ecolyo-exploration'
 import { FLUIDSPRICES_DOCTYPE } from './com-grandlyon-ecolyo-fluidsprices'
+import { FORM_DOCTYPE } from './com-grandlyon-ecolyo-form'
 import { PROFILE_DOCTYPE } from './com-grandlyon-ecolyo-profile'
 import { PROFILEECOGESTURE_DOCTYPE } from './com-grandlyon-ecolyo-profileecogesture'
 import { PROFILETYPE_DOCTYPE } from './com-grandlyon-ecolyo-profiletype'
@@ -182,6 +183,11 @@ const doctypes = {
     attributes: {},
     relationships: {},
   },
+  form: {
+    doctype: FORM_DOCTYPE,
+    attributes: {},
+    relationships: {},
+  },
 }
 
 export default doctypes
@@ -192,6 +198,7 @@ export * from './com-grandlyon-ecolyo-duel'
 export * from './com-grandlyon-ecolyo-ecogesture'
 export * from './com-grandlyon-ecolyo-exploration'
 export * from './com-grandlyon-ecolyo-fluidsprices'
+export * from './com-grandlyon-ecolyo-form'
 export * from './com-grandlyon-ecolyo-profile'
 export * from './com-grandlyon-ecolyo-profileecogesture'
 export * from './com-grandlyon-ecolyo-profiletype'
diff --git a/src/doctypes/remote/org.ecolyo.avg-temperature.ts b/src/doctypes/remote/org.ecolyo.avg_temperature.ts
similarity index 55%
rename from src/doctypes/remote/org.ecolyo.avg-temperature.ts
rename to src/doctypes/remote/org.ecolyo.avg_temperature.ts
index ff3c5e7a4365981943d9689e1bf5893bc05189ab..5173322d251b4bc78026874bf70ef11bed665271 100644
--- a/src/doctypes/remote/org.ecolyo.avg-temperature.ts
+++ b/src/doctypes/remote/org.ecolyo.avg_temperature.ts
@@ -1,2 +1,2 @@
 export const REMOTE_ORG_ECOLYO_AVG_TEMPERATURE =
-  '/remote/org.ecolyo.avg-temperature'
+  '/remote/org.ecolyo.avg_temperature'
diff --git a/src/enums/fluid.enum.ts b/src/enums/fluid.enum.ts
index e0d99c964422498efa7e84da07bccf184a746b84..4ebd4f94525810c87fda0386281482ef393b0a4b 100644
--- a/src/enums/fluid.enum.ts
+++ b/src/enums/fluid.enum.ts
@@ -5,6 +5,7 @@ export enum FluidType {
   MULTIFLUID = 3,
 }
 
+/** Application state for fluid, managed by the FluidService */
 export enum FluidState {
   KONNECTOR_NOT_FOUND = 'KONNECTOR_NOT_FOUND',
   NOT_CONNECTED = 'NOT_CONNECTED',
diff --git a/src/enums/konnectorStatus.enum.ts b/src/enums/konnectorStatus.enum.ts
index ca1975dae2695c73ce407198441602ff49f2b1f5..4ff5dad28d62214d0acf6e009c3f95577ea2ea26 100644
--- a/src/enums/konnectorStatus.enum.ts
+++ b/src/enums/konnectorStatus.enum.ts
@@ -1,3 +1,4 @@
+/** Raw errors from konnector */
 export enum KonnectorError {
   LOGIN_FAILED = 'LOGIN_FAILED',
   USER_ACTION_NEEDED = 'USER_ACTION_NEEDED',
@@ -7,6 +8,9 @@ export enum KonnectorError {
   CRITICAL = 'exit status 1',
   MISSING_SECRET = "Cannot read property 'secret' of null",
   USER_ACTION_NEEDED_ACCOUNT_REMOVED = 'USER_ACTION_NEEDED.ACCOUNT_REMOVED',
+  USER_ACTION_NEEDED_CGU_FORM = 'USER_ACTION_NEEDED.CGU_FORM',
+  VENDOR_DOWN = 'VENDOR_DOWN',
+  MAINTENANCE = 'MAINTENANCE',
 }
 
 export enum KonnectorUpdate {
diff --git a/src/enums/userQuiz.enum.ts b/src/enums/userQuiz.enum.ts
index d681613d5c3f5d7fb7557b3f73fd8a8a115bdbbb..f2c9e9d519e7d6c92e50256ecd2b9dff8ea97fc7 100644
--- a/src/enums/userQuiz.enum.ts
+++ b/src/enums/userQuiz.enum.ts
@@ -12,5 +12,5 @@ export enum CustomQuestionType {
 export enum UserQuestionState {
   UNLOCKED = 0,
   CORRECT = 1,
-  UNCORRECT = 2,
+  INCORRECT = 2,
 }
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 32c7bb1ea53ea9abf52a61f0ab8c67995eacf43c..193e8920f42014534755c276ce77b9c836dced38 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -2,6 +2,9 @@
   "common": {
     "title_app": "Ecolyo",
     "title_consumption": "Conso",
+    "title_consumption_electricity": "Conso électrique",
+    "title_consumption_gas": "Conso de gaz",
+    "title_consumption_water": "Conso d'eau",
     "title_challenge": "Défis",
     "title_quiz": "Quiz",
     "title_exploration": "Exploration",
@@ -19,8 +22,10 @@
     "title_sge_connect": "Connexion à l'électricité",
     "title_gas_connect": "Connexion au gaz",
     "accessibility": {
-      "loading": "Chargement"
-    }
+      "loading": "Chargement",
+      "skip_link": "Aller au contenu"
+    },
+    "funders_logo": "Logo des financeurs : Métropole de Lyon, Etat via la Banque des Territoires et son programme France 2030, Union Européenne"
   },
   "navigation": {
     "consumption": "Conso",
@@ -98,7 +103,11 @@
     "approximative_description": "Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil",
     "no_data": "Pas de données",
     "accessibility": {
-      "button_go_to_profil": "Détailler mon profil"
+      "button_go_to_profil": "Détailler mon profil",
+      "comparison_multifluid": "Vos dépenses (tous fluides confondus) vs Dépenses moyennes",
+      "comparison_electricity": "Votre consommation d'électricité vs Consommation moyenne",
+      "comparison_water": "Votre consommation d'eau vs Consommation moyenne",
+      "comparison_gas": "Votre consommation de gaz vs Consommation moyenne"
     },
     "max_day": "Jour où vous avez le plus consommé",
     "compare": {
@@ -117,6 +126,13 @@
         "data_info": "Données Météo France issues de la station météo Lyon Bron.",
         "close": "Fermer la fenêtre"
       }
+    },
+    "newsletter_reminder": {
+      "title": "Envie d'être averti de votre dernier bilan\u00a0?",
+      "text": "Recevez chaque mois votre bilan ainsi que des conseils saisonniers par mail.",
+      "button": "Je m'inscris",
+      "stop_showing": "Ne plus afficher",
+      "close": "Fermer la fenêtre"
     }
   },
   "analysis_error_modal": {
@@ -132,6 +148,7 @@
   },
   "analysis_pie": {
     "total": "Conso totale",
+    "details": "Détail par fluide",
     "month": "Au mois\u00a0",
     "estimation": "Comment sont estimés<br>les prix\u00a0?"
   },
@@ -150,8 +167,8 @@
   },
   "elec_info_modal": {
     "accessibility": {
-      "window_title": "electricity-info-modal",
-      "button_close": "close-modal"
+      "window_title": "Information sur les statistiques Enedis",
+      "button_close": "Fermer la fenêtre d'information"
     },
     "maxPowerTitle": "Qu’est-ce que la puissance maximum\u00a0?",
     "maxPowerDetails-1": "C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.",
@@ -197,8 +214,8 @@
       "consentLi2": "L'historique et le relevé de vos consommations au pas de temps 30 minutes",
       "consentLi3": "Les puissances maximales atteintes quotidiennement",
       "consentLi4": "Les données contractuelles (début de contrat et puissance souscrite)",
-      "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un\u00a0an</span>",
-      "consentCheck2": "J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente"
+      "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span class='gold'>un\u00a0an</span> *",
+      "consentCheck2": "J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente *"
     },
     "grdfgrandlyon": {
       "title": "Ecolyo doit se connecter au gaz",
@@ -226,11 +243,11 @@
       "textConsent": "Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes\u00a0:",
       "consentLi1": "L'historique de vos consommations (jusqu’à 36 mois) et le relevé quotidien de vos consommations",
       "consentLi2": "Les données contractuelles (type de compteur, date de début de contrat)",
-      "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un\u00a0an</span>",
-      "consentCheck2": "J’atteste être le titulaire du point de livraison (PCE) renseigné à l’étape précédente",
+      "consentCheck1": "Je consens à partager les données personnelles ci-dessus pour une durée d'<span class='gold'>un\u00a0an</span> *",
+      "consentCheck2": "J’atteste être le titulaire du point de livraison (PCE) renseigné à l’étape précédente *",
       "waiting": {
         "mailSent": "Un mail vous a été envoyé...",
-        "mailDelay": "Patience, cela peut prendre jusqu'à 15 minutes",
+        "mailDelay": "cela peut prendre jusqu'à 3 minutes",
         "validate": "Merci de valider l'autorisation d'accès à vos données",
         "comeback": "Une fois ce clic effectué, revenez ici pour accéder à vos données",
         "button_done": "C’est fait !"
@@ -268,6 +285,7 @@
     },
     "accessibility": {
       "button_reveal_password": "Afficher le mot de passe",
+      "button_hide_password": "Masquer le mot de passe",
       "button_connect": "Se connecter",
       "button_create_account": "Se créer un compte",
       "window_title": "Fenêtre d'information sur la création de compte.",
@@ -293,7 +311,8 @@
       },
       "locked": {
         "desc": "À débloquer en terminant le défi précédent"
-      }
+      },
+      "goto": "Aller vers le challenge"
     },
     "card_done": {
       "saving": "Économie de",
@@ -331,11 +350,14 @@
   "consumption": {
     "display_last_data": "Voir mes dernières consos",
     "accessibility": {
+      "navigation_group": "Choix de la période",
+      "fluid_menu": "Choix du fluide",
       "button_previous_period": "Afficher la période précédente",
       "button_next_period": "Afficher la période suivante",
       "button_previous_value": "Sélectionner la valeur précédente",
       "button_next_value": "Sélectionner la valeur suivante",
-      "checkbox_compare": "Afficher ou cacher la comparaison"
+      "checkbox_compare": "Afficher ou cacher la comparaison",
+      "bar": "Consommation du %{date} : %{value} %{unit}"
     },
     "partner_issue_modal": {
       "title": "Attention\u00a0!",
@@ -346,7 +368,20 @@
       "additional_text": "La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>",
       "ok": "Ok"
     },
-    "compared": "Comparé"
+    "compared": "Comparé",
+    "water_pricing": {
+      "year": "Année %{year}",
+      "consumption": "Consommation : <span>%{consumption}m³</span>",
+      "free": "Gratuit",
+      "regular": "Tarif normal",
+      "double": "Tarif double",
+      "more": "En savoir plus",
+      "modal": {
+        "title": "A partir du 1er janvier 2025, une tarification solidaire et environnementale de l’eau est mise en place.",
+        "details": "Cette jauge vous permet de garder un œil tout au long de l’année sur votre consommation d’eau afin de voir dans quelle tranche vous vous situez en tant que particulier.<br><br> Cette information vous est donnée à titre informatif, l'application définitive des tranches sera assurée par Eau Publique du Grand Lyon sur vos factures d'eau à compter du 01/01/2025 en fonction de vos consommations.",
+        "understood": "J'ai compris"
+      }
+    }
   },
   "consumption_details": {
     "detail": "Détail par fluide",
@@ -364,6 +399,11 @@
     "aie": "Aïe !",
     "data_empty": "Vide",
     "estimated": "estimés",
+    "cost_per_fluid": {
+      "electricity": "Part de l'électricité",
+      "water": "Part de l'eau",
+      "gas": "Part du gaz"
+    },
     "dataModal": {
       "list_title": "3 raisons possibles :",
       "item1": "le lien entre Ecolyo et le fournisseur de données est rompu\u00a0: une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.",
@@ -380,7 +420,7 @@
       "list1": " : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)",
       "list2": " : 1 kWh = %{gasPrice} €TTC (Prix repère de vente de gaz publié par la Commission de Régulation de l'Energie au %{gasPriceStartDate} pour un consommateur \"Cuisson/Eau Chaude\")",
       "list3": " : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)",
-      "part3": "Le coût de votre abonnement n'est pas pris en compte dans Ecolyo pour l'électricité et le gaz."
+      "part3": "Le coût de votre abonnement n'est pas pris en compte pour l'électricité."
     },
     "release_notes_modal": {
       "title": "Du nouveau sur Ecolyo !",
@@ -435,7 +475,8 @@
     "title": "Félicitations !",
     "subtitle": "Vous avez terminé tous les défis !",
     "message1": "Nous travaillons actuellement à vous proposer de nouveaux défis.",
-    "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle d'aide."
+    "message2": "Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle d'aide.",
+    "close": "Fermer la fenêtre"
   },
   "duel_empty_value_modal": {
     "title": "Oups !",
@@ -491,14 +532,13 @@
     },
     "initModal": {
       "title": "Sélectionner mes astuces",
-      "text1": "Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes ",
-      "text2": "Vous pouvez sélectionner celles à mettre en objectifs et celles que vous appliquez déjà.",
-      "text3": "Afin de pré-sélectionner les astuces correspondant à votre consommation, merci de répondre à quelques rapides questions.",
+      "text1": "Les astuces présentées dans cette page sont des actions qui vous permettent de réduire vos consommations. Elles sont appelées parfois aussi écogestes.",
+      "text2": "Répondez à un court questionnaire pour générer une liste d'astuces adaptée à votre profil puis sélectionnez celles que vous suivez déjà et celles que vous voulez vous mettre en objectif !",
       "btn1": "Plus tard",
       "btn2": "C'est parti !"
     },
-    "reinit": "Réinitialiser ma sélection",
-    "reinitModal": {
+    "reset": "Réinitialiser ma sélection",
+    "resetModal": {
       "title_part1": "Cette action",
       "title_part2": "supprimera votre liste d’astuces",
       "title_part3": "sélectionnées dans",
@@ -586,7 +626,7 @@
       "freezer": "Congélateur",
       "boiler": "Chaudière",
       "hydraulic_heating": "Chauffage hydraulique",
-      "accessible_label": "Sélection d'équipement"
+      "accessible_label": "Liste des équipements"
     }
   },
   "ecogesture_selection": {
@@ -653,34 +693,36 @@
     "later": "Plus tard",
     "lets_go": "J'y vais",
     "accessibility": {
-      "window_title": "Fenêtre de partage de retours",
-      "button_close": "Fermer la fenêtre de partage de retours"
+      "window_title": "Fenêtre de service assistance aux utilisateurs",
+      "button_close": "Fermer la fenêtre de service assistance aux utilisateurs"
     }
   },
   "dataShare": {
     "title1": "Bienvenue !",
     "title1Update": "Ecolyo évolue !",
+    "title2": "Vous accédez pour la première fois à Ecolyo. Pour cela, nul besoin de vous créer un compte. ",
     "title2Update": "Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.",
-    "part1": "Nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon, ci-après nommé cloud personnel.",
+    "part1": "Pour le bon fonctionnement du service, nous avons besoin de l’adresse email utilisée lors de la création de votre Cozy Métropole de Lyon.",
     "part2": "Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.",
     "part3": "La Métropole de Lyon utilisera cet email afin de vous tenir informé·e\u00a0:",
     "item1": "En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.",
     "item2": "En cas de problème majeur avec la gestion de votre compte.",
-    "item3": "De l’évolution de vos consommations, des nouveautés et  de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.",
+    "item3": "De l’évolution de vos consommations, des nouveautés et  de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous inscrire ou désinscrire de cette lettre via la page Options du service.",
     "part4": "Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole  de Lyon sur leur contenu.",
-    "part5": "Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elles conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.",
-    "part6": "Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.",
+    "part5": "Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité et de gaz sont quant à elles conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.",
+    "part6": "Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de garantir le bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.",
     "part7": "Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.",
     "part8": "Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :",
     "part9": "Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ",
     "part10": "ou en ligne, au moyen du formulaire disponible à l'adresse suivante\u00a0: ",
     "link1": "<a href=\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>",
-    "validDataConsent": "Je consens au traitement de mes données tel que décrit ci-dessus.",
+    "validDataConsent": "Je consens au traitement de mes données tel que décrit ci-dessus. *",
     "validCGU": "Je valide les ",
     "validCGU_button": "Conditions Générales d’Utilisation",
     "validLegal": " du service et ai pris connaissance des ",
     "validLegal_button": "Mentions Légales",
-    "validLegal2": "de celui-ci.",
+    "validLegal2": "de celui-ci. *",
+    "acceptNewsletter": "Je souhaite recevoir tous les mois un bilan de mes consommations ainsi que des conseils spécifiques.",
     "button_accept": "C'est parti !",
     "accessibility": {
       "button_accept": "Accepter les conditions générales d'utilisation"
@@ -692,48 +734,47 @@
   },
   "gcu": {
     "title": "Conditions générales d’utilisation du service",
-    "version": "Version du 12.12.2022",
+    "version": "Version du 20.09.2024",
     "content": {
       "title1": "Ecolyo, késako\u00a0?",
       "part1_1": "Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.",
-      "part1_2": "C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.",
+      "part1_2": "C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que la Métropole a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.",
       "part1_3": "Tous les termes « techniques » sont définis en bas de page.",
       "title2": "Quelles fonctionnalités le service propose-t-il\u00a0?",
       "part2_1": "La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).",
-      "part2_2": "Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages\u00a0: ",
-      "part2_2_list1": "Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.",
-      "part2_2_list2": "Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.",
-      "part2_2_list3": "Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.",
+      "part2_2": "Au-delà de la visualisation de vos consommations et parce que la Métropole souhaite vous aider à diminuer ces consommations, vous retrouverez plusieurs autres pages\u00a0: ",
+      "part2_2_list1": "Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous encourager à réduire vos consommations.",
+      "part2_2_list2": "Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec la possibilité de les adapter plus précisément à votre profil.",
+      "part2_2_list3": "Analyse : Une analyse de vos consommations réelles comparées à celle d’un foyer étant proche du vôtre.",
       "part2_3": "Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.",
-      "part2_4": "Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.",
+      "part2_4": "La dernière page est la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, ajuster votre profil ou encore vous abonner ou désabonner à la lettre mensuelle.",
       "title3": "Comment ai-je accès à mes données d’électricité, de gaz et d’eau\u00a0?",
       "part3_1": "Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).",
-      "part3_2": "Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau Publique du Grand Lyon.",
-      "part3_3": "Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.",
-      "part3_4": "Il vous faudra donc avoir un compte chez GRDF et Eau Publique du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.",
+      "part3_2": "Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Quant à Téléo, c’est Eau Publique du Grand Lyon.",
+      "part3_3": "Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations. Il existe des dizaines de fournisseurs d’électricité ou de gaz, mais seulement trois gestionnaires de réseaux. La Métropole a donc décidé de travailler avec ces derniers, au plus près de la donnée brute issue de vos compteurs.",
       "title4": "Ecolyo se trouve dans un cloud personnel Métropole de Lyon, qu’est-ce que cela signifie\u00a0?",
-      "part4_1": "Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix.  Le service Ecolyo se déploie  à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.",
+      "part4_1": "Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un Cozy Métropole de Lyon. Ce cloud personnel est un espace sécurisé conçu pour vous apporter visibilité, transparence et maîtrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettent de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix.  Le service Ecolyo se déploie  à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, ainsi que celles des autres services que vous pourriez utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.",
       "part4_2": "Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">ici</a>.",
       "title5": "Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès\u00a0?",
-      "part5_1": "Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement\u00a0? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.",
+      "part5_1": "Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. Via les parcours proposés par l’application, vous pourrez progressivement donner votre consentement et ainsi accéder à vos données de consommations. Une facture sera nécessaire afin de préciser vos numéros de compteurs. Le consentement est donné pour une durée limitée précisée dans les écrans. Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés pendant 5 ans, ce qui relève de la prérogative des gestionnaires de réseau.",
       "part5_2": "Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.",
       "part5_3": "Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et  à plusieurs niveaux : ",
       "part5_3_list1": "Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).",
-      "part5_3_list2": "Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.",
-      "part5_4": "Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.",
-      "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.",
+      "part5_3_list2": "Pour supprimer l’ensemble de vos données ainsi que votre cloud personnel Métropole de Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la page Paramètres.",
+      "part5_4": "Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans droit de regard de la Métropole de Lyon.",
+      "part5_5": "Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau Publique du Grand Lyon, dans le cas de l’eau, ainsi que vos informations d’identification entrées lors de votre première connexion sont stockées et utilisées dans le service.",
       "title6": "Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment\u00a0?",
-      "part6_1": "Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon",
+      "part6_1": "Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’astuces personnalisées). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Métropole de Lyon",
       "part6_2": "Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.",
       "part6_3": "La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Métropole de Lyon. Elle utilise cet email afin de vous tenir informé·e :",
-      "part6_3_list1": "En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. ",
+      "part6_3_list1": "En réponse à vos demandes, si vous avez pris l’initiative de contacter la Métropole de Lyon. ",
       "part6_3_list2": "En cas de problème majeur avec la gestion de votre compte.",
-      "part6_3_list3": "De l’évolution de vos consommations, des nouveautés et  de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.",
-      "part6_4": "Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.",
-      "part6_5": "Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.",
+      "part6_3_list3": "De l’évolution de vos consommations, des nouveautés et  de la qualité du service via une lettre mensuelle si vous y êtes inscrit. Vous pouvez à tout moment vous inscrire ou désinscrire de cette lettre via la page Options du service.",
+      "part6_4": "Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale) et au gaz (nom, code postal). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et GRDF et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.",
+      "part6_5": "Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées permettra à la Métropole de LYon de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.",
       "title8": "Encore des questions\u00a0?",
-      "part8_1": "N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.",
-      "part8_2": "Dernière option, contactez-nous directement à <a href=\"mailto:ecolyo@grandlyon.com\">ecolyo(at)grandlyon.com</a>.",
+      "part8_1": "Il est possible de consulter la FAQ ou de contacter l’équipe via le formulaire de contact présent sur l’ensemble des pages.",
+      "part8_2": "Sinon, il est également possible de joindre directement à <a href=\"mailto:ecolyo@grandlyon.com\">ecolyo(at)grandlyon.com</a>.",
       "title9": "LEXIQUE",
       "part9_1_title": "Cloud personnel Métropole de Lyon : ",
       "part9_1_content": "Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.",
@@ -760,7 +801,7 @@
   "header": {
     "accessibility": {
       "button_back": "Retour à la page précédente",
-      "button_open_feedbacks": "Ouvrir le partage de retours"
+      "button_open_feedbacks": "Ouvrir le service assistance aux utilisateurs"
     }
   },
   "konnector_form": {
@@ -816,9 +857,9 @@
     "success_data_electricity": "Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.",
     "success_data_water": "Vos données de consommation d'eau sont maintenant connectées à Ecolyo.",
     "success_data_gas": "Vos données de consommation de gaz sont maintenant connectées à Ecolyo.",
-    "success_data_additional_electricity": "Les données de consommations mettent entre un et deux jours pour arriver.",
-    "success_data_additional_water": "Les données de consommations mettent entre trois et cinq jours pour arriver.",
-    "success_data_additional_gas": "Les données de consommations mettent entre trois et cinq jours pour arriver.",
+    "success_data_additional_electricity": "Vos données les plus récentes peuvent prendre entre un et deux jours être disponibles.",
+    "success_data_additional_water": "Vos données les plus récentes peuvent prendre entre trois et cinq jours être disponibles.",
+    "success_data_additional_gas": "Vos données les plus récentes peuvent prendre entre trois et cinq jours être disponibles.",
     "success_update_txt": "Connexion réussie !",
     "success_data_update_electricity": "Ecolyo est bien connecté à votre compteur d'électricité.",
     "success_data_update_water": "Ecolyo est bien connecté à votre compteur d'eau.",
@@ -855,7 +896,6 @@
     "button_check_info": "Vérifier les infos",
     "button_go": "J'y vais",
     "button_later": "Plus tard",
-    "button_come_back_later": "Revenir plus tard",
     "show_common_error": "Voir les erreurs récurrentes",
     "show_common_error_list": "<span>Le problème peut provenir des cas suivants :</span><ul><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span class=\"gold\">titulaire du contrat</span> et non le co-titulaire.</li><li>  Votre nom comporte un tiret\u00a0? Tentez sans le tiret.</li><li>Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li>Avez-vous bien entré le <span class=\"gold\">numéro de votre compteur</span> (PDL)\u00a0? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p>Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div class=\"center\">Avez-vous pensez à vérifier ces informations\u00a0?</div>",
     "accessibility": {
@@ -866,7 +906,7 @@
   "consent_outdated": {
     "title": {
       "0": "Votre autorisation pour afficher vos données d’électricité a expiré",
-      "2": "Aie !"
+      "2": "Aïe !"
     },
     "text1": {
       "0": "Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.",
@@ -879,12 +919,16 @@
     "later": "Plus tard",
     "go": "J'y vais",
     "no": "Non",
-    "yes": "Oui"
+    "yes": "Oui",
+    "accessibility": {
+      "window_title": "Fenêtre d'erreur, consentement expiré",
+      "button_close": "Fermer la fenêtre"
+    }
   },
   "legal": {
     "read_legal": "Lire les mentions légales",
     "title_legal": "Mentions légales & CGU",
-    "version": "Version du 12.12.2022",
+    "version": "Version du 20.09.2024",
     "site": "Site du service Ecolyo : <a href=\"https://ecolyo.com/\"> https://ecolyo.com/</a>",
     "adress": "Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03",
     "phone": "Tél : (33) 4 78 63 40 40",
@@ -896,29 +940,29 @@
     "p3b": "Photographies : ",
     "p3": "sauf mention contraire, les photos sont la propriété de la Métropole de Lyon",
     "p4b": "Conception et Charte graphique : ",
-    "p4": "Florent Dufier",
+    "p4": "Métropole de Lyon, Sopra Steria",
     "p5b": "Réalisation technique : ",
     "p5": "Métropole de Lyon, Sopra Steria",
     "p6b": "Maintenance technique : ",
     "p6": "Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques",
     "title1": "Crédits",
-    "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.",
+    "part1": "Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, global, lodash, luxon, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: jest-junit, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, RocketChat, SonarQube.",
     "title2": "Traitement des données personnelles et droit d’accès, de modification et de suppression",
-    "part2": "Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : ",
-    "part2-1": "Les partenaires du service GRDF et Eau Publique du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.",
-    "part2-2": "Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.",
+    "part2": "Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data était défini selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : ",
+    "part2-1": "Eau Publique du Grand Lyon est responsable exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.",
+    "part2-2": "Enedis et GRDF sont responsables de la collecte des données de consommation d’électricité et de gaz et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.",
     "part2-3": "La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : ",
     "part2-3-1": "Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;",
     "part2-3-2": "Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;",
     "part2-3-3": "Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.",
     "part2-3-4": "Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.",
     "part2-3-5": "Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\"https://ecolyo.com/cloud_statistiques.html\">ici</a>).",
-    "part2-4": "La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.",
-    "part2-5": "L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.",
+    "part2-4": "La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, elle utilise des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.",
+    "part2-5": "L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau Publique du Grand Lyon qu’à sa demande expresse après la saisie de ses identifiants.",
     "part2-6": "L’utilisateur est donc le seul à accéder :",
     "part2-6-1": "À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.",
     "part2-6-2": "À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.",
-    "part2-6-3": "À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.",
+    "part2-6-3": "À ses données de consommation d'eau journalières, hebdomadaires, mensuelles et annuelles.",
     "part2-7": "Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\">aux mentions légales et CGU du cloud personnel métropolitain.</a> ",
     "part2-8": "Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.",
     "part2-9": "Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :",
@@ -1173,7 +1217,8 @@
       "button_toggle_detail_profile": "Afficher ou masquer le détail du profil",
       "button_toggle_export": "Afficher ou masquer l'export des données'",
       "button_toggle_average_home": "Afficher ou masquer les informations sur le comparatif'",
-      "button_validate": "Valider"
+      "button_validate": "Valider",
+      "button_export_data": "Télécharger les données"
     }
   },
   "export": {
@@ -1224,6 +1269,7 @@
     "next": "Suivant",
     "consumption_question": "Question sur votre consommation",
     "accessibility": {
+      "window_quit": "Quitter la fenêtre",
       "window_title": "Fenêtre de résultat",
       "button_end_quiz": "Terminer le quiz",
       "button_go_back": "Retour",
@@ -1251,12 +1297,9 @@
     "unknown_error": "Veuillez vérifier votre connexion internet",
     "network_error": "Erreur de réseau",
     "step": {
-      "0": "Mise à jour de l'application",
-      "1": "Vérification de vos consentements pour partager vos données avec Ecolyo",
-      "2": "Chargement de votre profil",
-      "3": "Actualisation de votre progression dans les défis",
-      "4": "Mise à jour des prix",
-      "5": "Connexion à vos données de consommation"
+      "migration": "Mise à jour de l'application",
+      "profile": "Chargement de votre profil",
+      "challenges": "Actualisation de votre progression dans les défis"
     }
   },
   "timestep": {
diff --git a/src/migrations/migration.data.ts b/src/migrations/migration.data.ts
index 650fce8de0a109e7405dd8dbf12e19fa152e8b0a..3fcd8c6a72a1e622a8a56708e2eac84f47674444 100644
--- a/src/migrations/migration.data.ts
+++ b/src/migrations/migration.data.ts
@@ -43,7 +43,7 @@ export const migrations: Migration[] = [
       'Removes old profileType artifacts from users database : \n - Oldest profileType is deleted \n - Removes insulation work form fields that were prone to errors \n - Changes area and outsideFacingWalls form field to strings \n - Changes updateDate values of all existing profileType to match "created_at" entry (former updateDate values got corrupted and hold no meanings).',
     releaseNotes: null,
     docTypes: PROFILETYPE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<ProfileType[]> => {
+    run: (_client: Client, docs: any[]): ProfileType[] => {
       docs.sort(function (a, b) {
         const c = DateTime.fromISO(a.cozyMetadata.createdAt, {
           zone: 'utc',
@@ -103,7 +103,7 @@ export const migrations: Migration[] = [
     description: 'Removes old profileType and GCUApprovalDate from profile.',
     docTypes: PROFILE_DOCTYPE,
     releaseNotes: null,
-    run: async (_client: Client, docs: any[]): Promise<Profile[]> => {
+    run: (_client: Client, docs: any[]): Profile[] => {
       return docs.map(doc => {
         if (doc.GCUApprovalDate) {
           delete doc.GCUApprovalDate
@@ -123,7 +123,7 @@ export const migrations: Migration[] = [
       'Updates userChallenges to make sure no quiz results are overflowing.',
     releaseNotes: null,
     docTypes: USERCHALLENGE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<UserChallenge[]> => {
+    run: (_client: Client, docs: any[]): UserChallenge[] => {
       return docs.map(doc => {
         if (doc.quiz.result > 5) {
           doc.quiz.result = 5
@@ -155,7 +155,7 @@ export const migrations: Migration[] = [
       tag: 'day',
       limit: 120,
     },
-    run: async (_client: Client, docs: any[]): Promise<any[]> => {
+    run: (_client: Client, docs: any[]): any[] => {
       return docs.map(doc => {
         doc.deleteAction = true
         return doc
@@ -174,7 +174,7 @@ export const migrations: Migration[] = [
       tag: 'month',
       limit: 4,
     },
-    run: async (_client: Client, docs: any[]): Promise<any[]> => {
+    run: (_client: Client, docs: any[]): any[] => {
       return docs.map(doc => {
         doc.deleteAction = true
         return doc
@@ -193,7 +193,7 @@ export const migrations: Migration[] = [
       tag: 'year',
       limit: 1,
     },
-    run: async (_client: Client, docs: any[]): Promise<any[]> => {
+    run: (_client: Client, docs: any[]): any[] => {
       return docs.map(doc => {
         doc.deleteAction = true
         return doc
@@ -207,7 +207,7 @@ export const migrations: Migration[] = [
     description: 'Corrects individual insulation work field on profileType.',
     releaseNotes: null,
     docTypes: PROFILETYPE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<ProfileType[]> => {
+    run: (_client: Client, docs: any[]): ProfileType[] => {
       return docs.map(doc => {
         if (!Array.isArray(doc.individualInsulationWork)) {
           doc.individualInsulationWork = [doc.individualInsulationWork]
@@ -256,15 +256,15 @@ export const migrations: Migration[] = [
       'ProfileTypes start now at the begining of the month, no duplications can exist over the same month.',
     releaseNotes: null,
     docTypes: PROFILETYPE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<any[]> => {
+    run: (_client: Client, docs: any[]): any[] => {
       function checkDate(d1: string, d2: string) {
-        const dtd1: DateTime = DateTime.fromISO(d1)
-        const dtd2: DateTime = DateTime.fromISO(d2)
+        const dtd1 = DateTime.fromISO(d1)
+        const dtd2 = DateTime.fromISO(d2)
         return dtd1.year === dtd2.year && dtd1.month === dtd2.month
       }
 
       for (let i = 0; i < docs.length; i++) {
-        const dtStartOfMonth: DateTime = DateTime.fromISO(docs[i].updateDate)
+        const dtStartOfMonth = DateTime.fromISO(docs[i].updateDate)
         docs[i].updateDate = dtStartOfMonth
           .setZone('utc', {
             keepLocalTime: true,
@@ -289,7 +289,7 @@ export const migrations: Migration[] = [
     docTypes: FLUIDSPRICES_DOCTYPE,
     isCreate: true,
     isDeprecated: true,
-    run: async (): Promise<any> => {
+    run: (): any => {
       return []
     },
   },
@@ -301,7 +301,7 @@ export const migrations: Migration[] = [
       "Profil now contains partnersIssueDate in order to handle partners' issue display",
     releaseNotes: null,
     docTypes: PROFILE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<Profile[]> => {
+    run: (_client: Client, docs: any[]): Profile[] => {
       return docs.map(doc => {
         doc.partnersIssueDate = DateTime.local()
           .minus({ day: 1 })
@@ -318,7 +318,7 @@ export const migrations: Migration[] = [
       'Rename tutorial to onboaring in ecolyo profile, remove isLastTermAccepted',
     releaseNotes: null,
     docTypes: PROFILE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<ProfileType[]> => {
+    run: (_client: Client, docs: any[]): ProfileType[] => {
       return docs.map(doc => {
         if (doc.tutorial) {
           doc.onboarding = { ...doc.tutorial }
@@ -343,7 +343,7 @@ export const migrations: Migration[] = [
       tag: 'day',
       limit: 1000,
     },
-    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+    run: (_client: Client, docs: any[]): DataloadEntity[] => {
       let prevData: DataloadEntity = {
         id: '',
         day: 0,
@@ -381,7 +381,7 @@ export const migrations: Migration[] = [
       tag: 'day',
       limit: 1000,
     },
-    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+    run: (_client: Client, docs: any[]): DataloadEntity[] => {
       let prevData: DataloadEntity = {
         id: '',
         day: 0,
@@ -419,7 +419,7 @@ export const migrations: Migration[] = [
       tag: 'month',
       limit: 17,
     },
-    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+    run: (_client: Client, docs: any[]): DataloadEntity[] => {
       return docs.map(doc => {
         if (doc.price) {
           delete doc.price
@@ -440,7 +440,7 @@ export const migrations: Migration[] = [
       tag: 'year',
       limit: 3,
     },
-    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+    run: (_client: Client, docs: any[]): DataloadEntity[] => {
       return docs.map(doc => {
         if (doc.price) {
           delete doc.price
@@ -461,7 +461,7 @@ export const migrations: Migration[] = [
       tag: 'month',
       limit: 17,
     },
-    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+    run: (_client: Client, docs: any[]): DataloadEntity[] => {
       return docs.map(doc => {
         if (doc.price) {
           delete doc.price
@@ -482,7 +482,7 @@ export const migrations: Migration[] = [
       tag: 'year',
       limit: 3,
     },
-    run: async (_client: Client, docs: any[]): Promise<DataloadEntity[]> => {
+    run: (_client: Client, docs: any[]): DataloadEntity[] => {
       return docs.map(doc => {
         if (doc.price) {
           delete doc.price
@@ -499,7 +499,7 @@ export const migrations: Migration[] = [
     releaseNotes: null,
     docTypes: FLUIDSPRICES_DOCTYPE,
     isDeprecated: true,
-    run: async (): Promise<any> => {
+    run: (): any => {
       return []
     },
   },
@@ -510,7 +510,7 @@ export const migrations: Migration[] = [
     description: 'Replace old minCons with the new calculation',
     releaseNotes: null,
     docTypes: ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<any> => {
+    run: (_client: Client, docs: any[]): any => {
       return docs.map(doc => {
         if (doc.minLoad) {
           const numberofDaysInMonth = DateTime.fromObject({
@@ -532,7 +532,7 @@ export const migrations: Migration[] = [
       'Empty fluidPrices db so it can be fetched with right format from remote doctype',
     releaseNotes: null,
     docTypes: FLUIDSPRICES_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<any> => {
+    run: (_client: Client, docs: any[]): any => {
       return docs.map(doc => {
         doc.deleteAction = true
         return doc
@@ -552,7 +552,7 @@ export const migrations: Migration[] = [
     },
     redirectLink: '/consumption/electricity',
     docTypes: '',
-    run: async (): Promise<any> => undefined,
+    run: (): any => undefined,
     isEmpty: true,
   },
   {
@@ -563,7 +563,7 @@ export const migrations: Migration[] = [
       'Profil now contains partnersIssueSeenDates in order to handle each partners issue date. Also removes previous partnersIssueDate',
     releaseNotes: null,
     docTypes: PROFILE_DOCTYPE,
-    run: async (_client: Client, docs: any[]): Promise<Profile[]> => {
+    run: (_client: Client, docs: any[]): Profile[] => {
       return docs.map(doc => {
         doc.partnersIssueSeenDate = {
           enedis: DateTime.local().minus({ day: 1 }).startOf('day'),
@@ -584,7 +584,7 @@ export const migrations: Migration[] = [
     description: 'Fix apartment typo',
     releaseNotes: null,
     docTypes: PROFILETYPE_DOCTYPE,
-    run: async (_client: Client, docs: any[]) => {
+    run: (_client: Client, docs: any[]) => {
       return docs.map(doc => {
         if (doc.housingType === 'appartment') {
           doc.housingType = 'apartment'
@@ -600,7 +600,7 @@ export const migrations: Migration[] = [
     description: 'Add garden room & equipment type',
     releaseNotes: null,
     docTypes: ECOGESTURE_DOCTYPE,
-    run: async (_client: Client, ecogestures: Ecogesture[]) => {
+    run: (_client: Client, ecogestures: Ecogesture[]) => {
       return ecogestures.map(ecogesture => {
         const ecData = ecogestureData.find(
           ec => ec._id === ecogesture.id
@@ -615,4 +615,18 @@ export const migrations: Migration[] = [
       })
     },
   },
+  {
+    baseSchemaVersion: 24,
+    targetSchemaVersion: 25,
+    appVersion: '3.1.0',
+    description: 'Initialize isAnalysisReminderEnabled in profile',
+    releaseNotes: null,
+    docTypes: PROFILE_DOCTYPE,
+    run: (_client: Client, docs: Profile[]) => {
+      return docs.map(doc => {
+        doc.isAnalysisReminderEnabled = true
+        return doc
+      })
+    },
+  },
 ]
diff --git a/src/migrations/migration.service.spec.ts b/src/migrations/migration.service.spec.ts
index c865c5d7adff26fcd6ee1131e4f6f751a3ac0a6c..ade8d9556fd312b63756b8ee55d1dcce3fb255bb 100644
--- a/src/migrations/migration.service.spec.ts
+++ b/src/migrations/migration.service.spec.ts
@@ -36,7 +36,7 @@ describe('Migration service', () => {
         description: 'Removing mailToken from profil',
         docTypes: PROFILE_DOCTYPE,
         releaseNotes: releaseNotes,
-        run: async (client: Client, docs: any[]): Promise<Profile[]> => {
+        run: (client: Client, docs: any[]): Profile[] => {
           return docs.map(doc => {
             if (doc.mailToken) {
               delete doc.mailToken
@@ -67,7 +67,7 @@ describe('Migration service', () => {
         description: 'Removing mailToken from profil',
         docTypes: PROFILE_DOCTYPE,
         releaseNotes: releaseNotes,
-        run: async (client: Client, docs: any[]): Promise<Profile[]> => {
+        run: (client: Client, docs: any[]): Profile[] => {
           return []
         },
       },
@@ -99,7 +99,7 @@ describe('Migration service', () => {
         description: 'Removing mailToken from profil',
         docTypes: PROFILE_DOCTYPE,
         releaseNotes: releaseNotes,
-        run: async (client: Client, docs: any[]): Promise<Profile[]> => {
+        run: (client: Client, docs: any[]): Profile[] => {
           return []
         },
       },
@@ -135,7 +135,7 @@ describe('Migration service', () => {
         description: 'Removing mailToken from profil',
         docTypes: PROFILE_DOCTYPE,
         releaseNotes: releaseNotes,
-        run: async (client: Client, docs: any[]): Promise<Profile[]> => {
+        run: (client: Client, docs: any[]): Profile[] => {
           return []
         },
       },
@@ -161,7 +161,7 @@ describe('Migration service', () => {
         description: 'Removing mailToken from profil',
         docTypes: PROFILE_DOCTYPE,
         releaseNotes: releaseNotes,
-        run: async (client: Client, docs: any[]): Promise<Profile[]> => {
+        run: (client: Client, docs: any[]): Profile[] => {
           return []
         },
       },
@@ -172,7 +172,7 @@ describe('Migration service', () => {
         description: 'Removing mailToken from profil',
         docTypes: PROFILE_DOCTYPE,
         releaseNotes: releaseNotes,
-        run: async (client: Client, docs: any[]): Promise<Profile[]> => {
+        run: (client: Client, docs: any[]): Profile[] => {
           return []
         },
       },
diff --git a/src/migrations/migration.service.ts b/src/migrations/migration.service.ts
index 757f9644727b3f045dcfa578f784c4c61432445b..0e7f051b019832ff0d8847e47bba311d58bd82cb 100644
--- a/src/migrations/migration.service.ts
+++ b/src/migrations/migration.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { SCHEMAS_DOCTYPE } from 'doctypes'
 import { InitStepsErrors, ReleaseNotes, Schema } from 'models'
 import { logDuration } from 'utils/duration'
@@ -9,7 +9,7 @@ import {
   MIGRATION_RESULT_COMPLETE,
   MIGRATION_RESULT_FAILED,
 } from './migration.data'
-import { Migration, MigrationResult } from './migration.type'
+import { Migration } from './migration.type'
 
 export class MigrationService {
   private readonly _client: Client
@@ -31,7 +31,7 @@ export class MigrationService {
    * @returns Promise<number> Version number of schema
    */
   public async currentSchemaVersion(_client: Client): Promise<number> {
-    const query: QueryDefinition = Q(SCHEMAS_DOCTYPE)
+    const query = Q(SCHEMAS_DOCTYPE)
     const data: QueryResult<Schema[]> = await _client.query(query.limitBy(1))
     return data?.data[0]?.version || 0
   }
@@ -61,10 +61,7 @@ export class MigrationService {
 
       for (const migration of migrationsToRun) {
         // First attempt
-        const migrationResult: MigrationResult = await migrate(
-          migration,
-          this._client
-        )
+        const migrationResult = await migrate(migration, this._client)
         logApp.info(migrationLog(migration, migrationResult))
 
         if (migrationResult.type === MIGRATION_RESULT_FAILED) {
diff --git a/src/migrations/migration.spec.ts b/src/migrations/migration.spec.ts
index 03ae98d6611370f73800a205c7c26fea9b5aae44..a7535b3301b7fb48831633adf5f2e18d9fada632 100644
--- a/src/migrations/migration.spec.ts
+++ b/src/migrations/migration.spec.ts
@@ -20,7 +20,7 @@ describe('migration logger', () => {
     description: 'Removing mailToken from profil',
     docTypes: PROFILE_DOCTYPE,
     releaseNotes: null,
-    run: async (mockClient, docs: any[]): Promise<Profile[]> => {
+    run: (mockClient, docs: any[]): Profile[] => {
       return docs.map(doc => {
         if (doc.mailToken) {
           delete doc.mailToken
@@ -63,7 +63,7 @@ describe('migration', () => {
     description: 'Removing mailToken from profil',
     docTypes: PROFILE_DOCTYPE,
     releaseNotes: null,
-    run: async (mockClient, docs: any[]): Promise<Profile[]> => {
+    run: (mockClient, docs: any[]): Profile[] => {
       return docs.map(doc => {
         if (doc.GCUApprovalDate) {
           delete doc.GCUApprovalDate
@@ -160,7 +160,7 @@ describe('migration', () => {
       description: 'Removing mailToken from profil',
       docTypes: PROFILE_DOCTYPE,
       releaseNotes: null,
-      run: async (mockClient, docs: any[]): Promise<Profile[]> => {
+      run: (mockClient, docs: any[]): Profile[] => {
         return []
       },
     }
@@ -206,7 +206,7 @@ describe('migration create', () => {
       docTypes: FLUIDSPRICES_DOCTYPE,
       releaseNotes: null,
       isCreate: true,
-      run: async (): Promise<FluidPrice[]> => {
+      run: (): FluidPrice[] => {
         return []
       },
     }
diff --git a/src/migrations/migration.ts b/src/migrations/migration.ts
index 2129af07325c78f34319913811a8a5ea7afd928c..0e0dea00ca76941f03ae901e8ed4c7d890b71030 100644
--- a/src/migrations/migration.ts
+++ b/src/migrations/migration.ts
@@ -25,7 +25,7 @@ function migrationNoop(): MigrationResult {
  * @returns Promise<number> Version number of schema
  */
 async function currentSchemaVersion(_client: Client): Promise<number> {
-  const query: QueryDefinition = Q(SCHEMAS_DOCTYPE)
+  const query = Q(SCHEMAS_DOCTYPE)
   const data: QueryResult<Schema[]> = await _client.query(query.limitBy(1))
   return data.data[0].version
 }
@@ -63,7 +63,7 @@ async function updateSchemaVersion(
   targetSchemaVersion: number
 ): Promise<void> {
   logApp.info('[Migration] Update schema version')
-  const query: QueryDefinition = Q(SCHEMAS_DOCTYPE)
+  const query = Q(SCHEMAS_DOCTYPE)
   const data: QueryResult<Schema[]> = await _client.query(query.limitBy(1))
   const doc = data.data[0]
   doc.version = targetSchemaVersion
@@ -74,9 +74,10 @@ async function updateSchemaVersion(
  * Save updated docs
  * @returns Promise<MigrationResult>
  */
+// eslint-disable-next-line @typescript-eslint/require-await
 async function save(_client: Client, docs: any[]): Promise<MigrationResult> {
   logApp.info('[Migration] Saving docs...')
-  const migrationResult: MigrationResult = migrationNoop()
+  const migrationResult = migrationNoop()
 
   if (docs.length) {
     logApp.info('[Migration] Saving docs...')
@@ -104,7 +105,7 @@ async function save(_client: Client, docs: any[]): Promise<MigrationResult> {
  * @returns Promise<number> Version number of schema
  */
 const schemaExist = async (_client: Client): Promise<boolean> => {
-  const query: QueryDefinition = Q(SCHEMAS_DOCTYPE)
+  const query = Q(SCHEMAS_DOCTYPE)
   const data: QueryResult<Schema[]> = await _client.query(query.limitBy(1))
   return data.data.length > 0 ? true : false
 }
@@ -141,7 +142,7 @@ export async function migrate(
   } else {
     let result: MigrationResult
     try {
-      const docToUpdate: any[] = await getDocs(
+      const docToUpdate = await getDocs(
         _client,
         migration.docTypes,
         migration.queryOptions
@@ -149,7 +150,7 @@ export async function migrate(
       if (migration.isDeprecated) {
         result = migrationNoop()
       } else if (docToUpdate.length && !migration.isCreate) {
-        const migratedDocs = await migration.run(_client, docToUpdate)
+        const migratedDocs = migration.run(_client, docToUpdate)
         if (migratedDocs.length) {
           result = await save(_client, migratedDocs)
         } else {
@@ -161,11 +162,13 @@ export async function migrate(
 
       // Handle new doctype creation
       if (migration.isCreate && !migration.isDeprecated) {
-        await migration.run(_client, docToUpdate)
+        migration.run(_client, docToUpdate)
         result = { type: MIGRATION_RESULT_COMPLETE, errors: [] }
       }
 
       switch (result.type) {
+        case MIGRATION_RESULT_FAILED:
+          throw new Error('Migration failed')
         case MIGRATION_RESULT_NOOP:
         case MIGRATION_RESULT_COMPLETE:
           await updateSchemaVersion(_client, migration.targetSchemaVersion)
diff --git a/src/migrations/migration.type.ts b/src/migrations/migration.type.ts
index e4b7a93c41f4cc840d720efd63179e1c8abace36..dca5840cc02c01d7360d652ee1ecbc3e9972d0c8 100644
--- a/src/migrations/migration.type.ts
+++ b/src/migrations/migration.type.ts
@@ -3,7 +3,7 @@ import { Notes } from 'models'
 
 type SchemaVersion = number
 
-export type MigrationData = {
+export interface MigrationData {
   errors: any[]
 }
 export interface MigrationNoop extends MigrationData {
@@ -21,7 +21,7 @@ export type MigrationResult =
   | MigrationComplete
   | MigrationFailed
 
-export type Migration = {
+export interface Migration {
   baseSchemaVersion: SchemaVersion
   targetSchemaVersion: SchemaVersion
   description: string
@@ -33,10 +33,10 @@ export type Migration = {
   queryOptions?: MigrationQueryOptions
   isEmpty?: boolean
   appVersion: string
-  run: (_client: Client, docs: any[]) => Promise<any[]>
+  run: (_client: Client, docs: any[]) => any[]
 }
 
-export type MigrationQueryOptions = {
+export interface MigrationQueryOptions {
   scope: string
   tag: string
   limit: number
diff --git a/src/models/account.model.ts b/src/models/account.model.ts
index bb125bcc9db89a4a5485e39a40b12188d19fd36e..4595f62e3605221e82dcce7791d11d1a8f5528ca 100644
--- a/src/models/account.model.ts
+++ b/src/models/account.model.ts
@@ -12,7 +12,7 @@ export interface Account extends AccountAttributes {
   id?: string
   _rev?: string
   _type?: string
-  cozyMetadata?: Record<string, any>
+  cozyMetadata?: Record<string, unknown>
 }
 export interface SgeAccountData {
   consentId: number
diff --git a/src/models/analysis.model.ts b/src/models/analysis.model.ts
index 62a9391f40499daef1d5aa106ff40703e5a6f729..5eb6c6cb7945998d550ee2f4e7ff3d7ae2c35485 100644
--- a/src/models/analysis.model.ts
+++ b/src/models/analysis.model.ts
@@ -3,4 +3,5 @@ import { DateTime } from 'luxon'
 export interface AnalysisState {
   period: 'month' | 'year'
   analysisMonth: DateTime
+  haveSeenNewsletterReminder: boolean
 }
diff --git a/src/models/dataload.model.ts b/src/models/dataload.model.ts
index e40d69dfea223a50afb617fd95af328dfe2181ee..35b1e72be1676a4d0b324107150a46b88c27f5fa 100644
--- a/src/models/dataload.model.ts
+++ b/src/models/dataload.model.ts
@@ -19,11 +19,17 @@ export interface DataloadEntity {
   _id?: string
   _type?: string
   _rev?: string
-  day: number
-  hour: number
+  /** load (in kWh or L) */
   load: number
+  /** minute of the date, set to 0 except for minute series */
   minute: number
+  /** hour of the date, set to 0 except for minute and hour series */
+  hour: number
+  /** day of the date, set to 1 for month and year series */
+  day: number
+  /** month of the date, set to 1 for year series */
   month: number
+  /** year of the date */
   year: number
   price?: number
 }
diff --git a/src/models/dju.model.ts b/src/models/dju.model.ts
index 57b9fdc640f67e39c39a3db7b959350804ed397b..19d2c423bff15875f4d2bf92500dcaab8dc96b59 100644
--- a/src/models/dju.model.ts
+++ b/src/models/dju.model.ts
@@ -8,6 +8,6 @@ export interface DjuResult {
 
 interface DjuMeasure {
   month: string
-  average_measurement: number
+  sum_measurement: number
   identifiant: string
 }
diff --git a/src/models/global.model.ts b/src/models/global.model.ts
index d0542952106660c0f2531adef5293c390a2a96b6..98f670d2a4e630da0a65b717611f4e6890f09ced 100644
--- a/src/models/global.model.ts
+++ b/src/models/global.model.ts
@@ -3,7 +3,6 @@ import { TermsStatus } from 'models'
 import { FluidStatus } from './fluid.model'
 import { PartnersInfo } from './partnersInfo.model'
 import { ReleaseNotes } from './releaseNotes.model'
-import { SgeStore } from './sgeStore.model'
 
 export interface GlobalState {
   screenType: ScreenType
@@ -16,7 +15,6 @@ export interface GlobalState {
   fluidStatus: FluidStatus[]
   fluidTypes: FluidType[]
   shouldRefreshConsent: boolean
-  sgeConnect: SgeStore
   partnersInfo: PartnersInfo
   ecogestureFilter: Usage
   lastEpglLogin: string
diff --git a/src/models/index.ts b/src/models/index.ts
index e4f280922aadaceb2e89fe834fb0a4cc757d3bdc..d59ad6f52a57536fd73d1037425f89d2b7e7bfd1 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -35,4 +35,3 @@ export * from './term.model'
 export * from './timePeriod.model'
 export * from './trigger.model'
 export * from './usageEvent.model'
-export * from './userInstanceSettings.model'
diff --git a/src/models/initialisationSteps.model.ts b/src/models/initialisationSteps.model.ts
index fd9cb97b414f2aab8c18118ad913e2d31de9783e..3635dd515418cabfae4b938f50591602d2ecd89d 100644
--- a/src/models/initialisationSteps.model.ts
+++ b/src/models/initialisationSteps.model.ts
@@ -1,10 +1,7 @@
 export enum InitSteps {
-  MIGRATION,
-  CONSENT,
-  PROFILE,
-  CHALLENGES,
-  PRICES, // never used
-  CONSOS,
+  PROFILE = 'profile',
+  MIGRATION = 'migration',
+  CHALLENGES = 'challenges',
 }
 export enum InitStepsErrors {
   MIGRATION_ERROR = 'migration_error',
diff --git a/src/models/profile.model.ts b/src/models/profile.model.ts
index c041fb23a5f8acd5a20d4cf83dc48a518374bad1..a36f2cd44c27b41b02b81909fb748b8cf0f5ec77 100644
--- a/src/models/profile.model.ts
+++ b/src/models/profile.model.ts
@@ -1,26 +1,36 @@
 import { DateTime } from 'luxon'
 
-interface Onboarding {
-  isWelcomeSeen: boolean
-}
-
 export interface ProfileEntity {
   id: string
+  /** Hash used to verify the content of ecogestures */
   ecogestureHash: string
+  /** Hash used to verify the content of challenges */
   challengeHash: string
+  /** Hash used to verify the content of duels */
   duelHash: string
+  /** Hash used to verify the content of quiz */
   quizHash: string
+  /** Hash used to verify the content of exploration */
   explorationHash: string
+  /** Boolean used to inform if the user connects for the first time */
   isFirstConnection: boolean
+  /** Date of the last user connection */
   lastConnectionDate: string
+  /** Boolean used to inform if user has seen the last analysis */
   haveSeenLastAnalysis: boolean
+  /** Boolean used to inform if user has seen the analysis notification */
   sendAnalysisNotification: boolean
+  isAnalysisReminderEnabled: boolean
+  /** Date of the last monthly analysis */
   monthlyAnalysisDate: string
   sendConsumptionAlert: boolean
   waterDailyConsumptionLimit: number
+  /** Check if a user has completed his consumption profile */
   isProfileTypeCompleted: boolean
   isProfileEcogestureCompleted: boolean
-  onboarding: Onboarding
+  onboarding: {
+    isWelcomeSeen: boolean
+  }
   mailToken: string
   partnersIssueSeenDate: {
     enedis?: string
diff --git a/src/models/userInstanceSettings.model.ts b/src/models/userInstanceSettings.model.ts
deleted file mode 100644
index 4202bb58fae14c72c0c7b7068bc306bd66821f26..0000000000000000000000000000000000000000
--- a/src/models/userInstanceSettings.model.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-/* eslint-disable camelcase */
-export interface UserInstanceSettingsAttributes {
-  auth_mode?: string
-  auto_update?: boolean
-  context?: string
-  email?: string
-  locale?: string
-  oidc_id?: string
-  onboarding_finished?: boolean
-  public_name: string
-  tos?: string
-  tos_latest?: string
-  uuid?: string
-}
-
-export interface UserInstanceSettings {
-  data: UserInstanceSettingsAttributes
-  fetchStatus: string
-}
diff --git a/src/notifications/monthlyReport.hbs b/src/notifications/monthlyReport.hbs
index bce1313b6182d34ed9da8b18b1962314be2458ec..e2030c55f045c7ba13c1ae869792f1d385df669f 100644
--- a/src/notifications/monthlyReport.hbs
+++ b/src/notifications/monthlyReport.hbs
@@ -24,6 +24,9 @@
     <mj-section background-color="#121212">
       <mj-column padding="0 32px" vertical-align="middle">
         <mj-image src={{consoImageUrl}} width="132px" align="center" alt="consommation"></mj-image>
+        {{#unless comparisonExist }}
+          <mj-text color="#E3B82A" font-weight="900" font-size="20px" align="center">Oups !</mj-text>
+        {{/unless}}
         <mj-text color="white" font-weight="900" font-size="24px">
           Bonjour {{username}},
         </mj-text>
@@ -42,12 +45,22 @@
             </mj-text>
           {{/if}}
         {{/if}}
-        <mj-text color="#A0A0A0" font-weight="400" font-size="18px" align="center">Retrouvez le détail de vos consommations et plus d’informations dans votre bilan Ecolyo.</mj-text>
-        <mj-social css-class="button-with-icon" icon-size="32px" mode="horizontal" font-size="20px" font-weight="700">
-          <mj-social-element src="{{baseUrl}}/assets/ecolyo-icon.png" name="ecolyo" padding="0 10px 0 0" href="{{clientUrl}}">
-            J’ouvre mon Ecolyo
-          </mj-social-element>
-        </mj-social>
+        {{#if comparisonExist }}
+          <mj-text color="#A0A0A0" font-weight="400" font-size="18px" align="center">Retrouvez le détail de vos consommations et plus d’informations dans votre bilan Ecolyo.</mj-text>
+          <mj-social css-class="button-with-icon" icon-size="32px" mode="horizontal" font-size="20px" font-weight="700">
+            <mj-social-element src="{{baseUrl}}/assets/ecolyo-icon.png" name="ecolyo" padding="0 10px 0 0" href="{{clientUrl}}">
+              J’ouvre mon Ecolyo
+            </mj-social-element>
+          </mj-social>
+        {{/if}}
+        {{#unless comparisonExist }}
+          <mj-text color="white" font-weight="400" font-size="18px">Nous avons constaté que vous n'avez aucun compteur connecté. Sans accès à vos données de consommation, Ecolyo ne peut pas établir de bilan individuel de celles-ci.</mj-text>
+          <mj-social css-class="button-with-icon" icon-size="32px" mode="horizontal" font-size="20px" font-weight="700">
+            <mj-social-element src="{{baseUrl}}/assets/ecolyo-icon.png" name="ecolyo" padding="0 10px 0 0" href="{{clientUrl}}">
+              Je connecte un compteur
+            </mj-social-element>
+          </mj-social>
+        {{/unless}}
       </mj-column>
     </mj-section>
     {{#if isContent}}
diff --git a/src/notifications/style.hbs b/src/notifications/style.hbs
index b1b78eb982639ca0ea1dcfda5871e2063e0c14be..542bdaceb0a1b503862cde676b64799520aa1ef3 100644
--- a/src/notifications/style.hbs
+++ b/src/notifications/style.hbs
@@ -17,10 +17,10 @@
   .button table { background-color: #F1C017 !important; margin: 10px !important;
   } .button-with-icon td { padding-right: 1px !important; } .button-with-icon
   table { background-color: #F1C017 !important; margin-left: 10px !important;
-  margin-right: 10px !important; } .button-with-icon span { vertical-align:
-  middle !important; } .button-with-icon a { vertical-align: middle !important;
-  padding-right: 10px !important;} .button-with-icon a img { padding-top: 20px
-  !important;}
+  margin-right: 10px !important; border-radius: 2px !important; }
+  .button-with-icon span { vertical-align: middle !important; }
+  .button-with-icon a { vertical-align: middle !important; padding-right: 10px
+  !important;} .button-with-icon a img { padding-top: 20px !important;}
 </mj-style>
 <mj-style>
   .custom-link a { color: #F1C017 !important; text-decoration: none !important;
diff --git a/src/services/account.service.ts b/src/services/account.service.ts
index 3f3c782df013c3a84d670bb751526369e09dd119..7fa566503377b5e606400e56d7b1c64ed32ee754 100644
--- a/src/services/account.service.ts
+++ b/src/services/account.service.ts
@@ -1,6 +1,6 @@
 /* eslint-disable camelcase */
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import {
   createAccount,
   deleteAccount,
@@ -36,7 +36,10 @@ export default class AccountService {
     konnector: Konnector,
     authData: AccountEGLData | AccountSgeData | AccountGRDFData
   ): Promise<Account> {
-    const accountAttributes: AccountAttributes = build(konnector, authData)
+    const accountAttributes: AccountAttributes = await build(
+      konnector,
+      authData
+    )
     return createAccount(this._client, konnector, accountAttributes)
   }
 
@@ -55,7 +58,7 @@ export default class AccountService {
 
   public async getAccountByType(type: string): Promise<Account | null> {
     try {
-      const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE).where({
+      const query = Q(ACCOUNTS_DOCTYPE).where({
         account_type: type,
       })
       // .indexFields(['account_type'])
@@ -70,7 +73,7 @@ export default class AccountService {
           )
         )
         // Keep the accountId which have the older trigger
-        let olderDate: DateTime = DateTime.now()
+        let olderDate = DateTime.now()
         let olderAccountId: string | null = null
         for (const _trigger of triggers) {
           if (
@@ -86,7 +89,7 @@ export default class AccountService {
           }
         }
         // Retrieve the accountId and return it
-        const filteredAccounts: Account[] = accounts.filter(
+        const filteredAccounts = accounts.filter(
           _account => _account._id === olderAccountId
         )
         return filteredAccounts[0] ? filteredAccounts[0] : null
@@ -104,7 +107,7 @@ export default class AccountService {
 
   public async getAccountsByType(type: string): Promise<Account[]> {
     try {
-      const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE).where({
+      const query = Q(ACCOUNTS_DOCTYPE).where({
         account_type: type,
       })
       // .indexFields(['account_type'])
@@ -147,7 +150,7 @@ export default class AccountService {
   }
 
   public async createIndexAccount(): Promise<[]> {
-    const query: QueryDefinition = Q(ACCOUNTS_DOCTYPE)
+    const query = Q(ACCOUNTS_DOCTYPE)
       .where({ account_type: 'index' })
       // .indexFields(['account_type'])
       .limitBy(1)
diff --git a/src/services/action.service.ts b/src/services/action.service.ts
index 644197d670f148d9f95189f18b40fdf3e03d2ec6..7e42a3e37a152a2cc000c478d99bd01e6d007136 100644
--- a/src/services/action.service.ts
+++ b/src/services/action.service.ts
@@ -27,10 +27,10 @@ export default class ActionService {
    * Get the list of available actions
    */
   public async getAvailableActionList(): Promise<Ecogesture[]> {
-    const userChallenges: UserChallenge[] =
+    const userChallenges =
       await this._challengeService.getAllUserChallengeEntities()
     const ecogestures = await this._ecogestureService.getAllEcogestures()
-    const actionsListIds: string[] = ecogestures
+    const actionsListIds = ecogestures
       .filter(ecogesture => ecogesture.action === true)
       .map(action => action._id)
 
@@ -165,10 +165,10 @@ export default class ActionService {
     return userAction
   }
   /**
-   * awaitNotificationAction
+   * Return userAction with updated state to UserActionState.NOTIFICATION
    * @returns {UserAction} updated user action
    */
-  public awaitNotificationAction(userAction: UserAction): UserAction {
+  public setNotificationAction(userAction: UserAction): UserAction {
     const updatedUserAction: UserAction = {
       ...userAction,
       state: UserActionState.NOTIFICATION,
@@ -196,16 +196,15 @@ export default class ActionService {
       currentChallenge.action.startDate &&
       currentChallenge.action.ecogesture
     ) {
-      const startDate: DateTime = currentChallenge.action.startDate
+      const startDate = currentChallenge.action.startDate
       const duration = currentChallenge.action.ecogesture.actionDuration
       const progress = -startDate.startOf('day').diffNow('days').days
       if (progress >= duration) {
         const challengeService = new ChallengeService(this._client)
-        const userChallenge: UserChallenge =
-          await challengeService.updateUserChallenge(
-            currentChallenge,
-            UserChallengeUpdateFlag.ACTION_NOTIFICATION
-          )
+        const userChallenge = await challengeService.updateUserChallenge(
+          currentChallenge,
+          UserChallengeUpdateFlag.ACTION_NOTIFICATION
+        )
         return userChallenge
       } else return null
     } else return null
diff --git a/src/services/challenge.service.spec.ts b/src/services/challenge.service.spec.ts
index 146d9121abe367e994c7e466661b2d5221eddd7b..68964b9d7545d9d1e87b41c2cddc69edbc920643 100644
--- a/src/services/challenge.service.spec.ts
+++ b/src/services/challenge.service.spec.ts
@@ -60,7 +60,7 @@ jest.mock('./exploration.service', () => {
     getExplorationEntityById: mockGetExplorationEntityById,
     parseExplorationEntityToUserExploration:
       mockParseExplorationEntityToUserExploration,
-    getUserExplorationfromExplorationEntities:
+    getUserExplorationFromExplorationEntities:
       mockGetUserExplorationFromExplorationEntities,
   }))
 })
@@ -474,14 +474,14 @@ describe('Challenge service', () => {
           ],
         },
       ]
-      it('should return isDone = true, isWin = true and isEmpty=false when userConsumption < threshold', async () => {
-        const result = await challengeService.isChallengeDone(
+      it('should return isDone = true, isWin = true and isEmpty=false when userConsumption < threshold', () => {
+        const result = challengeService.isChallengeDone(
           userChallenge,
           dataloads
         )
         expect(result).toEqual({ isDone: true, isWin: true })
       })
-      it('should return isDone = true, isWin = false when userConsumption >= threshold', async () => {
+      it('should return isDone = true, isWin = false when userConsumption >= threshold', () => {
         const updatedUserChallenge = {
           ...userChallenge,
           duel: {
@@ -490,7 +490,7 @@ describe('Challenge service', () => {
             userConsumption: 200,
           },
         }
-        const result = await challengeService.isChallengeDone(
+        const result = challengeService.isChallengeDone(
           updatedUserChallenge,
           dataloads
         )
@@ -559,15 +559,15 @@ describe('Challenge service', () => {
           ],
         },
       ]
-      it('should return isDone = true, isWin = true when all data are available and userConsumption < threshold', async () => {
-        const result = await challengeService.isChallengeDone(
+      it('should return isDone = true, isWin = true when all data are available and userConsumption < threshold', () => {
+        const result = challengeService.isChallengeDone(
           userChallenge,
           dataloads
         )
         expect(result).toEqual({ isDone: true, isWin: true })
       })
 
-      it('should return isDone = true and isWin = false when all data are available and userConsumption >= threshold', async () => {
+      it('should return isDone = true and isWin = false when all data are available and userConsumption >= threshold', () => {
         const updatedUserChallenge = {
           ...userChallenge,
           duel: {
@@ -576,30 +576,30 @@ describe('Challenge service', () => {
             userConsumption: 200,
           },
         }
-        const result = await challengeService.isChallengeDone(
+        const result = challengeService.isChallengeDone(
           updatedUserChallenge,
           dataloads
         )
         expect(result).toEqual({ isDone: true, isWin: false })
       })
-      it('should return isDone = false and isWin = false when last data is not available', async () => {
+      it('should return isDone = false and isWin = false when last data is not available', () => {
         const updatedDataloads = cloneDeep(dataloads)
         updatedDataloads[2].value = -1
         updatedDataloads[2].valueDetail = null
-        const result = await challengeService.isChallengeDone(
+        const result = challengeService.isChallengeDone(
           userChallenge,
           updatedDataloads
         )
         expect(result).toEqual({ isDone: false, isWin: false })
       })
-      it('should return isDone = false and isWin = false when data in the middle is not available', async () => {
+      it('should return isDone = false and isWin = false when data in the middle is not available', () => {
         const updatedDataloads = cloneDeep(dataloads)
         updatedDataloads[1].valueDetail = [
           { value: 20.0, state: DataloadState.VALID },
           { value: -1, state: DataloadState.MISSING },
           { value: 10.0, state: DataloadState.VALID },
         ]
-        const result = await challengeService.isChallengeDone(
+        const result = challengeService.isChallengeDone(
           userChallenge,
           updatedDataloads
         )
diff --git a/src/services/challenge.service.ts b/src/services/challenge.service.ts
index 516c73913b2e54bea6e268f8df0a5c7f5678c349..f6e37588a45e69972ef7fed8ad46a7b40674fbee 100644
--- a/src/services/challenge.service.ts
+++ b/src/services/challenge.service.ts
@@ -1,10 +1,9 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import { CHALLENGE_DOCTYPE, USERCHALLENGE_DOCTYPE } from 'doctypes'
 import {
   FluidState,
-  FluidType,
   TimeStep,
   UserActionState,
   UserChallengeState,
@@ -16,7 +15,6 @@ import {
 import { DateTime } from 'luxon'
 import {
   ChallengeEntity,
-  Datachart,
   Dataload,
   DuelEntity,
   Ecogesture,
@@ -26,7 +24,6 @@ import {
   Relation,
   RelationEntitiesObject,
   TimePeriod,
-  UserAction,
   UserChallenge,
   UserChallengeEntity,
   UserDuel,
@@ -153,12 +150,12 @@ export default class ChallengeService {
    * @param {UserExploration | ExplorationEntity} exploration - Exploration to be tested
    * @returns {boolean} isValid
    */
-  public async isExplorationConditionVerified(
+  public isExplorationConditionVerified(
     exploration: UserExploration | ExplorationEntity,
     fluidStatus: FluidStatus[]
-  ): Promise<boolean> {
+  ): boolean {
     let isValid = false
-    const fluidCondition: FluidType[] = exploration.fluid_condition
+    const fluidCondition = exploration.fluid_condition
     // check if the fluid is connected
     if (
       fluidStatus[fluidCondition[0]].status !==
@@ -171,15 +168,14 @@ export default class ChallengeService {
   }
 
   /**
-   *
    * @param {ChallengeEntity} challenge - get all relations entities of a challenge
    */
-  public async getRelationEntities(
+  public getRelationEntities(
     challenge: ChallengeEntity
-  ): Promise<RelationEntitiesObject> {
-    const duelEntityRelation: Relation = getRelationship(challenge, 'duel')
-    const quizEntityRelation: Relation = getRelationship(challenge, 'quiz')
-    const explorationEntityRelation: Relation[] = getRelationshipHasMany(
+  ): RelationEntitiesObject {
+    const duelEntityRelation = getRelationship(challenge, 'duel')
+    const quizEntityRelation = getRelationship(challenge, 'quiz')
+    const explorationEntityRelation = getRelationshipHasMany(
       challenge,
       'exploration'
     )
@@ -194,17 +190,17 @@ export default class ChallengeService {
   /**
    * Get a UserChallenge from its Entity and verify the exploration if there is a condition and if it's verified
    */
-  public async getUpdatedUserChallengeIfExplorationConditionIsValid(
+  public getUpdatedUserChallengeIfExplorationConditionIsValid(
     exploration: UserExploration,
     challenge: ChallengeEntity,
     duel: UserDuel,
     quiz: UserQuiz,
     fluidStatus: FluidStatus[]
-  ): Promise<UserChallenge | undefined> {
+  ): UserChallenge | undefined {
     let userChallenge: UserChallenge | null = null
     // Check if it's a conditional exploration
     if (exploration.fluid_condition.length > 0) {
-      const isConditionVerified = await this.isExplorationConditionVerified(
+      const isConditionVerified = this.isExplorationConditionVerified(
         exploration,
         fluidStatus
       )
@@ -234,7 +230,7 @@ export default class ChallengeService {
    * Exploration related to given challenge
    * @returns {UserChallenge[]} - buildList
    */
-  public async processExploration(
+  public processExploration(
     explorationEntities: ExplorationEntity[] | undefined,
     explorationEntityRelation: Relation[],
     challenge: ChallengeEntity,
@@ -242,16 +238,16 @@ export default class ChallengeService {
     quiz: UserQuiz,
     buildList: UserChallenge[],
     fluidStatus: FluidStatus[]
-  ): Promise<UserChallenge[]> {
+  ): UserChallenge[] {
     const explorationService = new ExplorationService(this._client)
     for (const explorationRelation of explorationEntityRelation) {
-      const exploration: UserExploration =
-        explorationService.getUserExplorationfromExplorationEntities(
+      const exploration =
+        explorationService.getUserExplorationFromExplorationEntities(
           explorationEntities || [],
           explorationRelation._id
         )
       const userChallenge =
-        await this.getUpdatedUserChallengeIfExplorationConditionIsValid(
+        this.getUpdatedUserChallengeIfExplorationConditionIsValid(
           exploration,
           challenge,
           duel,
@@ -283,12 +279,12 @@ export default class ChallengeService {
       for (const relation of relationsArray.data) {
         const newExploEntity =
           await explorationService.getExplorationEntityById(relation._id)
-        const newUserExplo: UserExploration =
+        const newUserExplo =
           explorationService.parseExplorationEntityToUserExploration(
             newExploEntity
           )
         if (newExploEntity.fluid_condition.length > 0) {
-          const isConditionValid = await this.isExplorationConditionVerified(
+          const isConditionValid = this.isExplorationConditionVerified(
             newExploEntity,
             fluidStatus
           )
@@ -318,15 +314,11 @@ export default class ChallengeService {
   public async buildUserChallengeList(
     fluidStatus: FluidStatus[]
   ): Promise<UserChallenge[]> {
-    const queryChallengeEntity: QueryDefinition = Q(CHALLENGE_DOCTYPE).include([
-      'duel',
+    const queryChallengeEntity = Q(CHALLENGE_DOCTYPE).include(['duel'])
+    const querySeasonEntityIncludeQuiz = Q(CHALLENGE_DOCTYPE).include(['quiz'])
+    const querySeasonEntityIncludeExploration = Q(CHALLENGE_DOCTYPE).include([
+      'exploration',
     ])
-    const querySeasonEntityIncludeQuiz: QueryDefinition = Q(
-      CHALLENGE_DOCTYPE
-    ).include(['quiz'])
-    const querySeasonEntityIncludeExploration: QueryDefinition = Q(
-      CHALLENGE_DOCTYPE
-    ).include(['exploration'])
     const {
       data: challengeEntityList,
       included: duelEntities,
@@ -341,8 +333,7 @@ export default class ChallengeService {
     }: QueryResult<ChallengeEntity[], QuizEntity[]> = await this._client.query(
       querySeasonEntityIncludeQuiz
     )
-    const userChallengeList: UserChallenge[] =
-      await this.getAllUserChallengeEntities()
+    const userChallengeList = await this.getAllUserChallengeEntities()
     const duelService = new DuelService(this._client)
     const quizService = new QuizService(this._client)
     const explorationService = new ExplorationService(this._client)
@@ -350,19 +341,19 @@ export default class ChallengeService {
     // Case UserChallengeList is empty
     if (challengeEntityList.length > 0 && userChallengeList.length === 0) {
       for (const challenge of challengeEntityList) {
-        const relationEntities = await this.getRelationEntities(challenge)
-        const duel: UserDuel = duelService.getDuelfromDuelEntities(
+        const relationEntities = this.getRelationEntities(challenge)
+        const duel = duelService.getDuelFromDuelEntities(
           duelEntities || [],
           relationEntities.duelEntityRelation._id
         )
-        const quiz: UserQuiz = quizService.getUserQuizfromQuizEntities(
+        const quiz = quizService.getUserQuizFromQuizEntities(
           quizEntities || [],
           relationEntities.quizEntityRelation._id
         )
         // Only one exploration relation
         if (relationEntities.explorationEntityRelation.length === 1) {
-          const exploration: UserExploration =
-            explorationService.getUserExplorationfromExplorationEntities(
+          const exploration =
+            explorationService.getUserExplorationFromExplorationEntities(
               explorationEntities || [],
               relationEntities.explorationEntityRelation[0]._id
             )
@@ -376,7 +367,7 @@ export default class ChallengeService {
         }
         // Several explorations with fluid condition
         else {
-          await this.processExploration(
+          this.processExploration(
             explorationEntities,
             relationEntities.explorationEntityRelation,
             challenge,
@@ -396,8 +387,7 @@ export default class ChallengeService {
           entity => entity.id === challenge.id
         )
         if (userChallengeIndex >= 0) {
-          let userChallenge: UserChallenge =
-            userChallengeList[userChallengeIndex]
+          let userChallenge = userChallengeList[userChallengeIndex]
           userChallenge = await this.loopVerificationExplorationCondition(
             userChallenge,
             challengeEntityList,
@@ -405,16 +395,16 @@ export default class ChallengeService {
           )
           buildList.push(userChallenge)
         } else {
-          const relationEntities = await this.getRelationEntities(challenge)
-          const duel: UserDuel = duelService.getDuelfromDuelEntities(
+          const relationEntities = this.getRelationEntities(challenge)
+          const duel = duelService.getDuelFromDuelEntities(
             duelEntities || [],
             relationEntities.duelEntityRelation._id
           )
-          const quiz: UserQuiz = quizService.getUserQuizfromQuizEntities(
+          const quiz = quizService.getUserQuizFromQuizEntities(
             quizEntities || [],
             relationEntities.quizEntityRelation._id
           )
-          await this.processExploration(
+          this.processExploration(
             explorationEntities,
             relationEntities.explorationEntityRelation,
             challenge,
@@ -434,7 +424,7 @@ export default class ChallengeService {
    * Retrieve all ChallengeEntities
    */
   public async getAllChallengeEntities(): Promise<ChallengeEntity[]> {
-    const query: QueryDefinition = Q(CHALLENGE_DOCTYPE)
+    const query = Q(CHALLENGE_DOCTYPE)
     const { data: challenges }: QueryResult<ChallengeEntity[]> =
       await this._client.query(query)
     return challenges
@@ -467,12 +457,11 @@ export default class ChallengeService {
    * Retrieve all UserChallengeEntities
    */
   public async getAllUserChallengeEntities(): Promise<UserChallenge[]> {
-    const query: QueryDefinition = Q(USERCHALLENGE_DOCTYPE)
+    const query = Q(USERCHALLENGE_DOCTYPE)
     const { data: userChallengeEntities }: QueryResult<UserChallengeEntity[]> =
       await this._client.query(query)
-    const userChallenges: UserChallenge[] = userChallengeEntities.map(
-      userChallengeEntity =>
-        this.parseUserChallengeEntityToUserChallenge(userChallengeEntity)
+    const userChallenges = userChallengeEntities.map(userChallengeEntity =>
+      this.parseUserChallengeEntityToUserChallenge(userChallengeEntity)
     )
     return userChallenges
   }
@@ -545,8 +534,9 @@ export default class ChallengeService {
         USERCHALLENGE_DOCTYPE,
         newChallenge
       )
-      const updatedUserChallenge: UserChallenge =
-        this.parseUserChallengeEntityToUserChallenge(updatedUserChallengeEntity)
+      const updatedUserChallenge = this.parseUserChallengeEntityToUserChallenge(
+        updatedUserChallengeEntity
+      )
       return updatedUserChallenge
     } catch (error) {
       const errorMessage = `Challenge service error on startUserChallenge: ${JSON.stringify(
@@ -570,7 +560,7 @@ export default class ChallengeService {
     userChallenge: UserChallenge,
     flag: UserChallengeUpdateFlag,
     quizWithUpdatedQuestions?: UserQuiz,
-    fluidStatus?: Array<FluidStatus>,
+    fluidStatus?: FluidStatus[],
     action?: Ecogesture
   ): Promise<UserChallenge> {
     let updatedUserChallenge: UserChallenge
@@ -588,7 +578,7 @@ export default class ChallengeService {
         updatedUserChallenge = userChallenge
         break
       case UserChallengeUpdateFlag.DUEL_UNLOCK:
-        updatedDuel = await duelService.unlockUserDuel(userChallenge.duel)
+        updatedDuel = duelService.unlockUserDuel(userChallenge.duel)
         updatedUserChallenge = {
           ...userChallenge,
           state: UserChallengeState.DUEL,
@@ -607,7 +597,7 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.DUEL_START:
-        updatedDuel = await duelService.startUserDuel(userChallenge.duel)
+        updatedDuel = duelService.startUserDuel(userChallenge.duel)
         updatedUserChallenge = {
           ...userChallenge,
           state: UserChallengeState.DUEL,
@@ -615,7 +605,7 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.DUEL_WIN:
-        updatedDuel = await duelService.endUserDuel(userChallenge.duel)
+        updatedDuel = duelService.endUserDuel(userChallenge.duel)
         updatedUserChallenge = {
           ...userChallenge,
           state: UserChallengeState.DONE,
@@ -629,7 +619,7 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.DUEL_LOSS:
-        updatedDuel = await duelService.endUserDuel(userChallenge.duel)
+        updatedDuel = duelService.endUserDuel(userChallenge.duel)
         updatedUserChallenge = {
           ...userChallenge,
           state: UserChallengeState.DONE,
@@ -643,7 +633,7 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.DUEL_RESET:
-        updatedDuel = await duelService.resetUserDuel(userChallenge.duel)
+        updatedDuel = duelService.resetUserDuel(userChallenge.duel)
         updatedUserChallenge = {
           ...userChallenge,
           state: UserChallengeState.DUEL,
@@ -652,7 +642,7 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.QUIZ_START:
-        updatedQuiz = await quizService.startUserQuiz(userChallenge.quiz)
+        updatedQuiz = quizService.startUserQuiz(userChallenge.quiz)
         updatedUserChallenge = {
           ...userChallenge,
           quiz: updatedQuiz,
@@ -660,7 +650,7 @@ export default class ChallengeService {
         break
       case UserChallengeUpdateFlag.QUIZ_DONE: {
         const updateQuizProgress = Math.min(userChallenge.quiz.result, 5)
-        updatedQuiz = await quizService.endUserQuiz(userChallenge.quiz)
+        updatedQuiz = quizService.endUserQuiz(userChallenge.quiz)
         updatedUserChallenge = {
           ...userChallenge,
           quiz: updatedQuiz,
@@ -680,14 +670,14 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.QUIZ_RESET:
-        updatedQuiz = await quizService.resetUserQuiz(userChallenge.quiz)
+        updatedQuiz = quizService.resetUserQuiz(userChallenge.quiz)
         updatedUserChallenge = {
           ...userChallenge,
           quiz: updatedQuiz,
         }
         break
       case UserChallengeUpdateFlag.EXPLORATION_START:
-        updatedExploration = await explorationService.startUserExploration(
+        updatedExploration = explorationService.startUserExploration(
           userChallenge.exploration
         )
         updatedUserChallenge = {
@@ -696,7 +686,7 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.EXPLORATION_UPDATE:
-        updatedExploration = await explorationService.updateUserExploration(
+        updatedExploration = explorationService.updateUserExploration(
           userChallenge.exploration
         )
         updatedUserChallenge = {
@@ -705,10 +695,9 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.EXPLORATION_NOTIFICATION:
-        updatedExploration =
-          await explorationService.awaitNotificationUserExploration(
-            userChallenge.exploration
-          )
+        updatedExploration = explorationService.setNotificationUserExploration(
+          userChallenge.exploration
+        )
         updatedUserChallenge = {
           ...userChallenge,
           exploration: updatedExploration,
@@ -728,17 +717,15 @@ export default class ChallengeService {
         }
         break
       case UserChallengeUpdateFlag.ACTION_START:
-        let userAction: UserAction = userChallenge.action
-        if (action) {
-          userAction = actionService.launchAction(action)
-        }
         updatedUserChallenge = {
           ...userChallenge,
-          action: userAction,
+          action: action
+            ? actionService.launchAction(action)
+            : userChallenge.action,
         }
         break
       case UserChallengeUpdateFlag.ACTION_NOTIFICATION:
-        updatedAction = actionService.awaitNotificationAction(
+        updatedAction = actionService.setNotificationAction(
           userChallenge.action
         )
         updatedUserChallenge = {
@@ -765,7 +752,7 @@ export default class ChallengeService {
     try {
       const { data: userChallengeEntity }: QueryResult<UserChallengeEntity> =
         await this._client.save(updatedUserChallenge)
-      const result: UserChallenge =
+      const result =
         this.parseUserChallengeEntityToUserChallenge(userChallengeEntity)
       return result
     } catch (error) {
@@ -782,7 +769,6 @@ export default class ChallengeService {
   /**
    * Retrieve the dataload for a UserChallenge with duel ongoing
    * @param {UserChallenge} userChallenge - userChallenge to update
-   * @param {UserChallengeUpdateFlag} flag - update flag
    */
   public async getUserChallengeDataload(
     userChallenge: UserChallenge
@@ -795,14 +781,12 @@ export default class ChallengeService {
           day: userChallenge.duel.duration.days - 1,
         }),
       }
-      const dataChart: Datachart | null = await consumptionService.getGraphData(
+      const dataChart = await consumptionService.getGraphData({
         timePeriod,
-        TimeStep.DAY,
-        userChallenge.duel.fluidTypes,
-        undefined,
-        undefined,
-        true
-      )
+        timeStep: TimeStep.DAY,
+        fluidTypes: userChallenge.duel.fluidTypes,
+        isHome: true,
+      })
       if (dataChart) {
         return dataChart.actualData
       }
@@ -815,13 +799,13 @@ export default class ChallengeService {
    * @param {UserChallenge} userChallenge - current userChallenge
    * @param {Dataload[]} dataloads - dataloads of current challenge
    */
-  public async isChallengeDone(
+  public isChallengeDone(
     userChallenge: UserChallenge,
     dataloads: Dataload[]
-  ): Promise<{
+  ): {
     isDone: boolean
     isWin: boolean
-  }> {
+  } {
     let isDone = false
     let isWin = false
     if (
@@ -861,7 +845,7 @@ export default class ChallengeService {
           dataloads[duration - 1].value !== -1
         ) {
           isDone = true
-          dataloads.forEach((d: Dataload) => {
+          dataloads.forEach(d => {
             if (
               d.value === -1 ||
               (d.valueDetail &&
diff --git a/src/services/consumption.service.spec.ts b/src/services/consumption.service.spec.ts
index ca2d8e95b09bbf47ca5c6ba09717109840ad0865..49815f316f32121d1995426a8ab1e8512b4119b8 100644
--- a/src/services/consumption.service.spec.ts
+++ b/src/services/consumption.service.spec.ts
@@ -10,6 +10,7 @@ import {
   FluidStatus,
   TimePeriod,
 } from 'models'
+import { mockAvgTemperature } from 'tests/__mocks__/avgTemperature.mock'
 import mockClient from 'tests/__mocks__/client.mock'
 import {
   fetchDayDataComplete,
@@ -20,6 +21,7 @@ import { fluidStatusConnectedData } from 'tests/__mocks__/fluidStatusData.mock'
 import { loadDayData } from 'tests/__mocks__/loadDayData.mock'
 import { allFluids } from 'utils/utils'
 import ConsumptionDataManager from './consumption.service'
+import ConsumptionValidatorService from './consumptionValidator.service'
 
 const mockFetchFluidData = jest.fn()
 const mockFetchFluidMaxData = jest.fn()
@@ -77,15 +79,15 @@ describe('Consumption service', () => {
   ]
 
   describe('getGraphData method', () => {
-    it('should return null', async () => {
-      const result = await consumptionDataManager.getGraphData(
-        mockTimePeriod,
-        TimeStep.DAY,
-        [],
-        [],
-        mockTimePeriodComparison,
-        false
-      )
+    it('should return null because input is invalid', async () => {
+      const result = await consumptionDataManager.getGraphData({
+        timePeriod: mockTimePeriod,
+        timeStep: TimeStep.DAY,
+        fluidTypes: [],
+        fluidStatus: [],
+        compareTimePeriod: mockTimePeriodComparison,
+        isHome: false,
+      })
       expect(result).toBeNull()
     })
     it('should return a mapped data for one fluid', async () => {
@@ -134,14 +136,14 @@ describe('Consumption service', () => {
           },
         ],
       }
-      const result = await consumptionDataManager.getGraphData(
-        mockTimePeriod,
-        TimeStep.DAY,
+      const result = await consumptionDataManager.getGraphData({
+        timePeriod: mockTimePeriod,
+        timeStep: TimeStep.DAY,
         fluidTypes,
         fluidStatus,
-        mockTimePeriodComparison,
-        false
-      )
+        compareTimePeriod: mockTimePeriodComparison,
+        isHome: false,
+      })
       expect(result).toEqual(mockResult)
     })
 
@@ -210,14 +212,14 @@ describe('Consumption service', () => {
           },
         ],
       }
-      const result = await consumptionDataManager.getGraphData(
-        mockTimePeriod,
-        TimeStep.DAY,
-        allFluids,
+      const result = await consumptionDataManager.getGraphData({
+        timePeriod: mockTimePeriod,
+        timeStep: TimeStep.DAY,
+        fluidTypes: allFluids,
         fluidStatus,
-        mockTimePeriodComparison,
-        true
-      )
+        compareTimePeriod: mockTimePeriodComparison,
+        isHome: true,
+      })
       expect(result).toEqual(mockResult)
     })
     it('should return a mapped data for multi fluid without comparison date', async () => {
@@ -252,41 +254,46 @@ describe('Consumption service', () => {
         ],
         comparisonData: [],
       }
-      mockFetchFluidData.mockResolvedValue(mockFetchDataActual)
-      const result = await consumptionDataManager.getGraphData(
-        mockTimePeriod,
-        TimeStep.DAY,
-        allFluids,
-        fluidStatus
-      )
+      mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual)
+      mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual)
+      mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual)
+      const result = await consumptionDataManager.getGraphData({
+        timePeriod: mockTimePeriod,
+        timeStep: TimeStep.DAY,
+        fluidTypes: allFluids,
+        fluidStatus,
+      })
       expect(result).toEqual(mockResult)
     })
     it('should return null because of wrong parameters', async () => {
       const fluidTypes = [FluidType.WATER]
-      const result = await consumptionDataManager.getGraphData(
-        mockTimePeriod,
-        TimeStep.HALF_AN_HOUR,
+      const result = await consumptionDataManager.getGraphData({
+        timePeriod: mockTimePeriod,
+        timeStep: TimeStep.HALF_AN_HOUR,
         fluidTypes,
         fluidStatus,
-        mockTimePeriodComparison,
-        true
-      )
+        compareTimePeriod: mockTimePeriodComparison,
+        isHome: true,
+      })
       expect(result).toBeNull()
     })
-    it('should return null because of timePeriod and comparaison', async () => {
-      const fluidTypes: FluidType[] = [FluidType.ELECTRICITY]
+    it('should return null when not matching both cases', async () => {
+      const fluidTypes: FluidType[] = []
       const wrongTimePeriod = {
         startDate: DateTime.fromISO('2020-08-03T23:59:59.999Z'),
         endDate: DateTime.fromISO('2020-08-01T00:00:00.000Z'),
       }
-      const result = await consumptionDataManager.getGraphData(
-        wrongTimePeriod,
-        TimeStep.DAY,
+      jest
+        .spyOn(ConsumptionValidatorService.prototype, 'ValidateGetGraphData')
+        .mockReturnValueOnce(true)
+      const result = await consumptionDataManager.getGraphData({
+        timePeriod: wrongTimePeriod,
+        timeStep: TimeStep.DAY,
         fluidTypes,
         fluidStatus,
-        mockTimePeriodComparison,
-        true
-      )
+        compareTimePeriod: mockTimePeriodComparison,
+        isHome: false,
+      })
       expect(result).toBeNull()
     })
   })
@@ -299,30 +306,37 @@ describe('Consumption service', () => {
         mockFetchFluidData.mockResolvedValueOnce(mockFetchDataComparison)
       }
       const expectedResult = 84.44375099999999
-      const result = await consumptionDataManager.getMaxLoad(
-        mockTimePeriod,
-        TimeStep.DAY,
-        allFluids,
-        mockTimePeriodComparison,
-        true
-      )
+      const result = await consumptionDataManager.getMaxLoad({
+        maxTimePeriod: mockTimePeriod,
+        timeStep: TimeStep.DAY,
+        fluidTypes: allFluids,
+        compareMaxTimePeriod: mockTimePeriodComparison,
+        isHome: true,
+      })
       expect(result).toEqual(expectedResult)
     })
     it('should return the maxed value for a time period', async () => {
       const fluidTypes: FluidType[] = [FluidType.ELECTRICITY]
       const expectedResult = 63.1254
       mockFetchFluidMaxData.mockResolvedValueOnce(expectedResult)
-      const result = await consumptionDataManager.getMaxLoad(
-        mockTimePeriod,
-        TimeStep.DAY,
+      const result = await consumptionDataManager.getMaxLoad({
+        maxTimePeriod: mockTimePeriod,
+        timeStep: TimeStep.DAY,
         fluidTypes,
-        mockTimePeriodComparison,
-        false
-      )
+        compareMaxTimePeriod: mockTimePeriodComparison,
+      })
       expect(result).toEqual(expectedResult)
     })
   })
 
+  describe('getLastDataload method', () => {
+    it('should return the last dataload', async () => {
+      mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual)
+      const result = await consumptionDataManager.getLastDataload(0)
+      expect(result).toEqual(mockFetchDataActual)
+    })
+  })
+
   describe('getPerformanceIndicators method', () => {
     it('should return the performance indicator', async () => {
       mockFetchFluidData.mockResolvedValueOnce(mockFetchDataActual)
@@ -513,6 +527,24 @@ describe('Consumption service', () => {
     })
   })
 
+  describe('fetchAvgTemperature', () => {
+    it('should return the average temperature when data is available', async () => {
+      mockClient
+        .getStackClient()
+        .fetchJSON.mockResolvedValueOnce(mockAvgTemperature)
+      const result = await consumptionDataManager.fetchAvgTemperature(2023, 5)
+      expect(result).toBe(mockAvgTemperature.values[0].average_measurement)
+    })
+    it('should throw an error when no data is available', async () => {
+      mockClient
+        .getStackClient()
+        // eslint-disable-next-line camelcase
+        .fetchJSON.mockResolvedValueOnce({ nb_results: 0 })
+      const result = await consumptionDataManager.fetchAvgTemperature(2023, 5)
+      expect(result).toBe(null)
+    })
+  })
+
   describe('saveDoc & saveDocs', () => {
     it('should saveDoc', async () => {
       const mockQueryResult: QueryResult<DataloadEntity> = {
diff --git a/src/services/consumption.service.ts b/src/services/consumption.service.ts
index 68551b7a800a16515f6ff630bf7b989f3b86ce8b..b9203bbb34d28a2f30ced50892a315bf0c789fb4 100644
--- a/src/services/consumption.service.ts
+++ b/src/services/consumption.service.ts
@@ -1,9 +1,9 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { Doctype } from 'cozy-client/types/types'
 import logger from 'cozy-logger'
 import { ENEDIS_MINUTE_DOCTYPE } from 'doctypes'
-import { REMOTE_ORG_ECOLYO_AVG_TEMPERATURE } from 'doctypes/remote/org.ecolyo.avg-temperature'
+import { REMOTE_ORG_ECOLYO_AVG_TEMPERATURE } from 'doctypes/remote/org.ecolyo.avg_temperature'
 import { DataloadState, FluidType, TimeStep } from 'enums'
 import { DateTime } from 'luxon'
 import {
@@ -45,25 +45,34 @@ export default class ConsumptionDataManager {
   }
 
   /** Get graph data according on timeStep and fluidType */
-  public async getGraphData(
-    timePeriod: TimePeriod,
-    timeStep: TimeStep,
-    fluidTypes: FluidType[],
-    fluidStatus?: FluidStatus[],
-    compareTimePeriod?: TimePeriod,
-    isHome?: boolean,
+  public async getGraphData({
+    timePeriod,
+    timeStep,
+    fluidTypes,
+    fluidStatus,
+    compareTimePeriod,
+    isHome,
+    isExport,
+  }: {
+    timePeriod: TimePeriod
+    timeStep: TimeStep
+    fluidTypes: FluidType[]
+    fluidStatus?: FluidStatus[]
+    compareTimePeriod?: TimePeriod
+    isHome?: boolean
+    /** bypass TimePeriodLength validation to be able to export more than 12 months of data */
     isExport?: boolean
-  ): Promise<Datachart | null> {
-    const InputIsValid = this._consumptionValidatorService.ValidateGetGraphData(
+  }): Promise<Datachart | null> {
+    const isInputValid = this._consumptionValidatorService.ValidateGetGraphData(
       timePeriod,
       timeStep,
       fluidTypes,
       compareTimePeriod,
       isExport
     )
-    if (!InputIsValid) return null
+    if (!isInputValid) return null
     if (fluidTypes.length === 1 && !isHome) {
-      const fluidType: FluidType = fluidTypes[0]
+      const fluidType = fluidTypes[0]
       const fetchedData = await this.fetchSingleFluidGraphData(
         timePeriod,
         timeStep,
@@ -89,7 +98,6 @@ export default class ConsumptionDataManager {
           fluidType,
           compareTimePeriod
         )
-        // formatting data
         const formattedData = this.formatGraphDataManager(
           fetchedData,
           timeStep,
@@ -106,27 +114,33 @@ export default class ConsumptionDataManager {
       }
       const aggregatedData = this.aggregateGraphData(toBeAggregatedData)
       return aggregatedData
-    } else return null
+    }
+    return null
   }
 
-  public async getMaxLoad(
-    maxTimePeriod: TimePeriod,
-    timeStep: TimeStep,
-    fluidTypes: FluidType[],
-    compareMaxTimePeriod?: TimePeriod,
-    isHome?: boolean,
+  public async getMaxLoad({
+    maxTimePeriod,
+    timeStep,
+    fluidTypes,
+    compareMaxTimePeriod,
+    isHome,
+    withDate,
+  }: {
+    maxTimePeriod: TimePeriod
+    timeStep: TimeStep
+    fluidTypes: FluidType[]
+    compareMaxTimePeriod?: TimePeriod
+    isHome?: boolean
     withDate?: boolean
-  ): Promise<number | null | Dataload> {
-    let allData
+  }): Promise<number | null | Dataload> {
     if (isHome) {
-      allData = await this.getGraphData(
-        maxTimePeriod,
+      const allData = await this.getGraphData({
+        timePeriod: maxTimePeriod,
         timeStep,
         fluidTypes,
-        undefined,
-        compareMaxTimePeriod,
-        isHome
-      )
+        compareTimePeriod: compareMaxTimePeriod,
+        isHome,
+      })
       return allData?.actualData
         ? Math.max(...allData.actualData.map(d => d.value))
         : 0
@@ -143,7 +157,7 @@ export default class ConsumptionDataManager {
 
   /** get last dataload available for a given fluid - return the daily data  */
   public async getLastDataload(
-    fluidTypes: FluidType
+    fluidType: FluidType
   ): Promise<Dataload[] | null> {
     const timePeriod = {
       startDate: DateTime.now().plus({ days: -3 }).startOf('day'),
@@ -153,7 +167,7 @@ export default class ConsumptionDataManager {
     const data = await this._queryRunnerService.fetchFluidData(
       timePeriod,
       TimeStep.DAY,
-      fluidTypes
+      fluidType
     )
     return data
   }
@@ -166,13 +180,12 @@ export default class ConsumptionDataManager {
   ): Promise<PerformanceIndicator[]> {
     const performanceIndicators: PerformanceIndicator[] = []
     for (const fluidType of fluidTypes) {
-      const graphData: Datachart | null = await this.getGraphData(
+      const graphData = await this.getGraphData({
         timePeriod,
         timeStep,
-        [fluidType],
-        undefined,
-        compareTimePeriod
-      )
+        fluidTypes: [fluidType],
+        compareTimePeriod,
+      })
 
       if (graphData) {
         const performanceIndicator: PerformanceIndicator = {
@@ -294,7 +307,7 @@ export default class ConsumptionDataManager {
   ): Datachart | null {
     if (!data) return null
 
-    const formattedActualData: Dataload[] =
+    const formattedActualData =
       this._consumptionFormatterService.formatGraphData(
         data.actualData,
         timePeriod,
@@ -393,11 +406,10 @@ export default class ConsumptionDataManager {
     let firstDay = null
     const firstDays = []
     for (const fluidType of fluidTypes) {
-      firstDay =
-        (await this._queryRunnerService.getFirstDateData(
-          fluidType,
-          timeStep
-        )) || null
+      firstDay = await this._queryRunnerService.getFirstDateData(
+        fluidType,
+        timeStep
+      )
       firstDays.push(firstDay)
     }
     return firstDays
@@ -410,19 +422,17 @@ export default class ConsumptionDataManager {
     let lastDay = null
     const lastDays = []
     if (fluidTypes.length === 1) {
-      lastDay =
-        (await this._queryRunnerService.getLastDateData(
-          fluidTypes[0],
-          timeStep
-        )) || null
+      lastDay = await this._queryRunnerService.getLastDateData(
+        fluidTypes[0],
+        timeStep
+      )
       lastDays.push(lastDay)
     } else if (fluidTypes.length > 1) {
       for (const fluidType of fluidTypes) {
-        lastDay =
-          (await this._queryRunnerService.getLastDateData(
-            fluidType,
-            timeStep
-          )) || null
+        lastDay = await this._queryRunnerService.getLastDateData(
+          fluidType,
+          timeStep
+        )
         lastDays.push(lastDay)
       }
     }
@@ -530,7 +540,7 @@ export default class ConsumptionDataManager {
 
         if (singleFluidCharts[0].chartData.actualData[i]) {
           // Define the aggregated state
-          const aggregatedDataloadState: DataloadState =
+          const aggregatedDataloadState =
             this._consumptionFormatterService.defineAggregatedDataloadState(
               tempAggregatedState
             )
@@ -550,7 +560,7 @@ export default class ConsumptionDataManager {
           singleFluidCharts[0].chartData.comparisonData[i]
         ) {
           // Define the aggregated state
-          const aggregatedComparisonDataloadState: DataloadState =
+          const aggregatedComparisonDataloadState =
             this._consumptionFormatterService.defineAggregatedDataloadState(
               tempComparisonAggregatedState
             )
@@ -576,7 +586,7 @@ export default class ConsumptionDataManager {
     client: Client,
     month: number
   ): Promise<DataloadEntity[]> {
-    const query: QueryDefinition = Q(ENEDIS_MINUTE_DOCTYPE)
+    const query = Q(ENEDIS_MINUTE_DOCTYPE)
       .where({
         month: {
           $eq: month,
@@ -592,10 +602,10 @@ export default class ConsumptionDataManager {
   /**
    * Get the first entry of a given data doctype (enedis, grdf, egl)
    */
-  public async getFirsDataDateFromDoctype(
+  public async getFirstDataDateFromDoctype(
     doctype: Doctype
   ): Promise<DataloadEntity[] | EnedisMonthlyAnalysisData[] | null> {
-    const query: QueryDefinition = Q(doctype)
+    const query = Q(doctype)
       .where({})
       .indexFields(['year', 'month'])
       .sortBy([{ year: 'asc' }, { month: 'asc' }])
@@ -607,7 +617,7 @@ export default class ConsumptionDataManager {
   public async getFirstDataDateFromDoctypeWithPrice(
     doctype: Doctype
   ): Promise<DataloadEntity | null> {
-    const query: QueryDefinition = Q(doctype)
+    const query = Q(doctype)
       .where({
         year: {
           $gt: null,
@@ -636,22 +646,19 @@ export default class ConsumptionDataManager {
     year: number,
     month: number
   ): Promise<number | null> => {
-    const bronStationId = '69123002'
+    const BronStationId = '69123002'
     const avgTemperatureDate = `${year}-${formatTwoDigits(month)}`
     try {
       const result: AvgTemperatureResult = await this._client
         .getStackClient()
         .fetchJSON(
           'GET',
-          `${REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${bronStationId}&month=${avgTemperatureDate}`
+          `${REMOTE_ORG_ECOLYO_AVG_TEMPERATURE}?identifiant=${BronStationId}&month=${avgTemperatureDate}`
         )
       if (result && result.nb_results !== 0) {
         return result.values[0].average_measurement
-      } else {
-        throw new Error(
-          `No average temperature found for ${avgTemperatureDate}`
-        )
       }
+      throw new Error(`No average temperature found for ${avgTemperatureDate}`)
     } catch (error) {
       const errorMessage = `fetchAvgTemperature error : ${error}`
       logStack('error', errorMessage)
@@ -684,7 +691,6 @@ export default class ConsumptionDataManager {
   ): Promise<DataloadEntity[]> {
     const { data: savedDocs }: QueryResult<DataloadEntity[]> =
       await this._client.saveAll(consumptionDocs)
-
     return savedDocs
   }
 }
diff --git a/src/services/consumptionFormatter.service.spec.ts b/src/services/consumptionFormatter.service.spec.ts
index 2c07788f299d6ea224d3b7d0bb93a5f43c52a2c5..f73ee0939489837f11662a6e7089bd09d0e9fd84 100644
--- a/src/services/consumptionFormatter.service.spec.ts
+++ b/src/services/consumptionFormatter.service.spec.ts
@@ -251,7 +251,7 @@ describe('ConsumptionFormatter service', () => {
       expect(result).toEqual(mockResult)
     })
     it('should return an error because of unknown TimeStep', async () => {
-      const error = await getError(async () =>
+      const error = await getError(() =>
         consumptionFormatterService.formatGraphData(
           mockDataLoad,
           mockTimePeriod,
diff --git a/src/services/consumptionFormatter.service.ts b/src/services/consumptionFormatter.service.ts
index cc05206889191b517bd1936f52ad0cffb046420e..92a7b44ebea7f21eca1de59c69d1d6b4f41532fd 100644
--- a/src/services/consumptionFormatter.service.ts
+++ b/src/services/consumptionFormatter.service.ts
@@ -25,12 +25,12 @@ export default class ConsumptionFormatterService {
     }
     const dateChartService = new DateChartService()
     while (parsingDate <= endDate) {
-      const filtereddata = data.filter(dt =>
+      const filteredData = data.filter(dt =>
         dateChartService.compareStepDate(timeStep, dt.date, parsingDate)
       )
-      const newElement: Dataload = this.defineDataloadState(
-        filtereddata[0]
-          ? filtereddata[0]
+      const newElement = this.defineDataloadState(
+        filteredData[0]
+          ? filteredData[0]
           : {
               date: parsingDate,
               value: -1,
@@ -92,7 +92,7 @@ export default class ConsumptionFormatterService {
       return { ...data, state: DataloadState.EMPTY }
     }
     if (fluidStatus.lastDataDate && data.date > fluidStatus.lastDataDate) {
-      const isDataToCome: boolean = this.isDataToCome(data, fluidType)
+      const isDataToCome = this.isDataToCome(data, fluidType)
       return {
         ...data,
         state: isDataToCome ? DataloadState.COMING : DataloadState.MISSING,
diff --git a/src/services/consumptionValidator.service.spec.ts b/src/services/consumptionValidator.service.spec.ts
index 819a9724a39ae7e4890842d11e10a988f28eb9c0..5f0558d47a67c008f871548c509925e074f5a7fa 100644
--- a/src/services/consumptionValidator.service.spec.ts
+++ b/src/services/consumptionValidator.service.spec.ts
@@ -11,7 +11,13 @@ const mockTimePeriodComparison: TimePeriod = {
   startDate: DateTime.fromISO('2020-09-01T00:00:00.000Z', { zone: 'utc' }),
   endDate: DateTime.fromISO('2020-09-03T23:59:59.999Z', { zone: 'utc' }),
 }
-let allFluids: FluidType[] = [0, 1, 2]
+const wrongTimePeriodComparison: TimePeriod = {
+  startDate: DateTime.fromISO('2020-09-05T00:00:00.000Z', {
+    zone: 'utc',
+  }),
+  endDate: DateTime.fromISO('2020-09-03T23:59:59.999Z', { zone: 'utc' }),
+}
+const allFluids: FluidType[] = [0, 1, 2]
 describe('ConsumptionFormatter service', () => {
   const consumptionValidatorService = new ConsumptionValidatorService()
   describe('ValidateGetGraphData method', () => {
@@ -33,12 +39,6 @@ describe('ConsumptionFormatter service', () => {
       expect(result).toBeTruthy()
     })
     it('should return false with comparison Date', () => {
-      const wrongTimePeriodComparison: TimePeriod = {
-        startDate: DateTime.fromISO('2020-09-05T00:00:00.000Z', {
-          zone: 'utc',
-        }),
-        endDate: DateTime.fromISO('2020-09-03T23:59:59.999Z', { zone: 'utc' }),
-      }
       const result = consumptionValidatorService.ValidateGetGraphData(
         mockTimePeriod,
         TimeStep.DAY,
@@ -47,13 +47,16 @@ describe('ConsumptionFormatter service', () => {
       )
       expect(result).toBeFalsy()
     })
+    it('should return false with comparison Date and incompatible timeStep', () => {
+      const result = consumptionValidatorService.ValidateGetGraphData(
+        mockTimePeriod,
+        TimeStep.YEAR,
+        allFluids,
+        wrongTimePeriodComparison
+      )
+      expect(result).toBeFalsy()
+    })
     it('should return false with comparison Date for elec', () => {
-      const wrongTimePeriodComparison: TimePeriod = {
-        startDate: DateTime.fromISO('2020-09-05T00:00:00.000Z', {
-          zone: 'utc',
-        }),
-        endDate: DateTime.fromISO('2020-09-07T23:59:59.999Z', { zone: 'utc' }),
-      }
       const result = consumptionValidatorService.ValidateGetGraphData(
         mockTimePeriod,
         TimeStep.HALF_AN_HOUR,
@@ -94,7 +97,7 @@ describe('ConsumptionFormatter service', () => {
       expect(result).toBeFalsy()
     })
     it('should return false because of HALF_AN_HOUR and ValidateTimePeriodLength', () => {
-      allFluids = [0] // Only fluid without TimeStep incompatibilty
+      const fluids = [0] // Only fluid without TimeStep incompatibility
       const mockTimePeriodTooLong: TimePeriod = {
         startDate: DateTime.fromISO('2020-10-01T00:00:00.000Z', {
           zone: 'utc',
@@ -104,7 +107,7 @@ describe('ConsumptionFormatter service', () => {
       const result = consumptionValidatorService.ValidateGetGraphData(
         mockTimePeriodTooLong,
         TimeStep.HALF_AN_HOUR,
-        allFluids
+        fluids
       )
       expect(result).toBeFalsy()
     })
diff --git a/src/services/converter.service.spec.ts b/src/services/converter.service.spec.ts
index 85868150ad91496b08e9f260e0e915abd2e52b6b..133988768f9b9dff8288c9caab381ce930b0ed22 100644
--- a/src/services/converter.service.spec.ts
+++ b/src/services/converter.service.spec.ts
@@ -39,7 +39,7 @@ describe('Converter service', () => {
       expect(result).toEqual(expectedConversion)
     })
 
-    it('should return 1.2 beacause there is a price of 1.2 set for doctype', () => {
+    it('should return 1.2 because there is a price of 1.2 set for doctype', () => {
       const expectedConversion = 1.2
       const result = converterService.LoadToEuro(0.002, FluidType.WATER, 1.2)
       expect(result).toEqual(expectedConversion)
diff --git a/src/services/converter.service.ts b/src/services/converter.service.ts
index d283508b42a1d209dc5e51885365c43f10975d97..aeee1ea2dc4b8b96a4ab97a10ac477366028b438 100644
--- a/src/services/converter.service.ts
+++ b/src/services/converter.service.ts
@@ -19,7 +19,11 @@ export default class ConverterService {
     if (fluidType === FluidType.MULTIFLUID) {
       convertedLoad = load
     } else {
-      convertedLoad = this.applyPrice(this._fluidConfig[fluidType], load, price)
+      convertedLoad = this.computePrice(
+        this._fluidConfig[fluidType],
+        load,
+        price
+      )
     }
 
     // Prevent round 0 case when the actual value is not 0
@@ -30,20 +34,18 @@ export default class ConverterService {
   }
 
   /**
-   * Return calculated price
+   * Compute calculated price
+   * If a price is provided, return the price
    * @param {FluidConfig} fluidConfig - Fluid configuration
    * @param {number} load - Load value
    * @param {number} [price] - Price if exist
    */
-  private applyPrice(
+  private computePrice(
     fluidConfig: FluidConfig,
     load: number,
     price?: number | null
   ): number {
-    if (price) {
-      return price
-    } else {
-      return load * fluidConfig.coefficient
-    }
+    if (price) return price
+    return load * fluidConfig.coefficient
   }
 }
diff --git a/src/services/dateChart.service.spec.ts b/src/services/dateChart.service.spec.ts
index 59c9d2d5b8cad3a3e4f8b7e347809c057cc24a2c..d799abd280316dafccc2756fe95cc660db705535 100644
--- a/src/services/dateChart.service.spec.ts
+++ b/src/services/dateChart.service.spec.ts
@@ -296,7 +296,7 @@ describe('dateChart service', () => {
     })
 
     it('should throw error for unknown TimeStep', async () => {
-      const error = await getError(async () =>
+      const error = await getError(() =>
         dateChartService.defineTimePeriod(refDate, unknownTimeStep, -1)
       )
       expect(error).toEqual(new Error('TimeStep unknown'))
@@ -693,7 +693,7 @@ describe('dateChart service', () => {
       const secondDate = DateTime.fromISO('2020-10-31T00:30:00.000Z', {
         zone: 'utc',
       })
-      const error = await getError(async () =>
+      const error = await getError(() =>
         dateChartService.compareStepDate(unknownTimeStep, firstDate, secondDate)
       )
       expect(error).toEqual(new Error('TimeStep unknown'))
diff --git a/src/services/dateChart.service.ts b/src/services/dateChart.service.ts
index 1a5ac296b4322b29a324126e36d9f6a043a68256..47d5266cbc0ad09bc1d126738db037018322add9 100644
--- a/src/services/dateChart.service.ts
+++ b/src/services/dateChart.service.ts
@@ -1,6 +1,6 @@
 import { FluidType, TimeStep } from 'enums'
 import { DateTime, Interval } from 'luxon'
-import { FluidConfig, TimePeriod } from 'models'
+import { TimePeriod } from 'models'
 import ConfigService from './fluidConfig.service'
 
 export default class DateChartService {
@@ -294,8 +294,7 @@ export default class DateChartService {
     fluidType: FluidType
   ): number | null {
     if (date && fluidType !== FluidType.MULTIFLUID) {
-      const fluidConfig: Array<FluidConfig> =
-        new ConfigService().getFluidConfig()
+      const fluidConfig = new ConfigService().getFluidConfig()
       const today = DateTime.local().setZone('utc', {
         keepLocalTime: true,
       })
diff --git a/src/services/duel.service.spec.ts b/src/services/duel.service.spec.ts
index 93cd9552abc03d91449dc2814d1bbb00aade13ac..bb67cbeab4b2bdf8ba5859952a5a9ef62124ad7b 100644
--- a/src/services/duel.service.spec.ts
+++ b/src/services/duel.service.spec.ts
@@ -96,13 +96,13 @@ describe('Duel service', () => {
   })
 
   describe('startUserDuel method', () => {
-    it('should return the userDuel with onGoing state', async () => {
+    it('should return the userDuel with onGoing state', () => {
       jest
         .spyOn(DateTime, 'local')
         .mockReturnValue(
           DateTime.fromISO('2020-10-01T00:00:00.000Z', { zone: 'utc' })
         )
-      const result = await duelService.startUserDuel(duelData)
+      const result = duelService.startUserDuel(duelData)
 
       const mockUpdatedDuel: UserDuel = {
         ...duelData,
@@ -116,8 +116,8 @@ describe('Duel service', () => {
   })
 
   describe('resetUserDuel method', () => {
-    it('should return the userDuel with unlocked state', async () => {
-      const result = await duelService.resetUserDuel(duelData)
+    it('should return the userDuel with unlocked state', () => {
+      const result = duelService.resetUserDuel(duelData)
       const mockUpdatedDuel: UserDuel = {
         ...duelData,
         startDate: null,
@@ -197,11 +197,11 @@ describe('Duel service', () => {
     })
   })
 
-  describe('getDuelfromDuelEntities method', () => {
+  describe('getDuelFromDuelEntities method', () => {
     it('should return the userDuel from a duelEntity', () => {
       const searchId = 'DUEL001'
 
-      const result = duelService.getDuelfromDuelEntities(allDuelData, searchId)
+      const result = duelService.getDuelFromDuelEntities(allDuelData, searchId)
       expect(result).toEqual(duelData)
     })
   })
diff --git a/src/services/duel.service.ts b/src/services/duel.service.ts
index f721543a6fe7ca02e60cf59567fc99eca63c69a9..747f588f629f203f9d7971316c2b933ad7d96adb 100644
--- a/src/services/duel.service.ts
+++ b/src/services/duel.service.ts
@@ -1,18 +1,10 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import { DUEL_DOCTYPE } from 'doctypes'
 import { FluidState, FluidType, TimeStep, UserDuelState } from 'enums'
 import { DateTime, Duration } from 'luxon'
-import {
-  Datachart,
-  Dataload,
-  DuelEntity,
-  FluidStatus,
-  PerformanceIndicator,
-  TimePeriod,
-  UserDuel,
-} from 'models'
+import { DuelEntity, FluidStatus, TimePeriod, UserDuel } from 'models'
 import logApp from 'utils/logger'
 import { getRoundFloat } from 'utils/math'
 import ConsumptionService from './consumption.service'
@@ -37,7 +29,7 @@ export default class DuelService {
     fluidTypes: FluidType[],
     userDuel: UserDuel
   ): Promise<TimePeriod | false> {
-    let lastDate: DateTime = DateTime.local().setZone('utc', {
+    let lastDate = DateTime.local().setZone('utc', {
       keepLocalTime: true,
     })
     fluidStatus.forEach(fluid => {
@@ -69,31 +61,28 @@ export default class DuelService {
    */
   private async isPeriodComplete(
     period: TimePeriod,
-    fluidType: FluidType[],
+    fluidTypes: FluidType[],
     duration: Duration
   ): Promise<false | TimePeriod> {
-    const maxDiffperiod: Duration = Duration.fromObject({
-      months: 6,
-    })
-    const maxDiffperiodMilli: number = maxDiffperiod.as('milliseconds')
+    const maxDiffPeriod = Duration.fromObject({ months: 6 })
+    const maxDiffPeriodMilli = maxDiffPeriod.as('milliseconds')
     let isComplete = true
     const newPeriod: TimePeriod = {
       startDate: period.startDate.minus(duration),
       endDate: period.endDate.minus(duration),
     }
-    let diffFromNow = newPeriod.endDate.diffNow().toObject().milliseconds
-    diffFromNow = diffFromNow ? Math.abs(diffFromNow) : 0
-    const consumptionService = new ConsumptionService(this._client)
-    const dataLoad: Datachart | null = await consumptionService.getGraphData(
-      period,
-      TimeStep.DAY,
-      fluidType,
-      undefined,
-      undefined,
-      true
+    const diffFromNow = Math.abs(
+      newPeriod.endDate.diffNow().toObject().milliseconds || 0
     )
+    const consumptionService = new ConsumptionService(this._client)
+    const dataLoad = await consumptionService.getGraphData({
+      timePeriod: period,
+      timeStep: TimeStep.DAY,
+      fluidTypes,
+      isHome: true,
+    })
     if (dataLoad?.actualData) {
-      dataLoad.actualData.forEach((d: Dataload) => {
+      dataLoad.actualData.forEach(d => {
         if (
           d.value === -1 ||
           (d.valueDetail &&
@@ -102,21 +91,21 @@ export default class DuelService {
           isComplete = false
       })
     }
-    if (diffFromNow && !isComplete && diffFromNow > maxDiffperiodMilli)
+    if (diffFromNow && !isComplete && diffFromNow > maxDiffPeriodMilli)
       return false
 
     return isComplete
       ? period
-      : await this.isPeriodComplete(newPeriod, fluidType, duration)
+      : await this.isPeriodComplete(newPeriod, fluidTypes, duration)
   }
   /**
    * Retrieve all duel entities from db
    */
   public async getAllDuelEntities(): Promise<DuelEntity[]> {
-    const query: QueryDefinition = Q(DUEL_DOCTYPE)
-    const { data: dueles }: QueryResult<DuelEntity[]> =
+    const query = Q(DUEL_DOCTYPE)
+    const { data: duels }: QueryResult<DuelEntity[]> =
       await this._client.query(query)
-    return dueles
+    return duels
   }
 
   /**
@@ -124,9 +113,7 @@ export default class DuelService {
    * @param {string} duelId - ID of the searched duel
    */
   public async getDuelEntityById(duelId: string): Promise<DuelEntity> {
-    const query: QueryDefinition = Q(DUEL_DOCTYPE)
-      .where({ _id: duelId })
-      .limitBy(1)
+    const query = Q(DUEL_DOCTYPE).where({ _id: duelId }).limitBy(1)
     const { data }: QueryResult<DuelEntity[]> = await this._client.query(query)
     return data?.[0]
   }
@@ -157,13 +144,13 @@ export default class DuelService {
    * Return duel with updated state to UserDuelState.UNLOCKED
    * @param {UserDuel} userDuel - userDuel to unlock
    */
-  public async unlockUserDuel(userDuel: UserDuel): Promise<UserDuel> {
-    const updatedUserDuel: UserDuel = {
+  public unlockUserDuel(userDuel: UserDuel): UserDuel {
+    return {
       ...userDuel,
       state: UserDuelState.UNLOCKED,
     }
-    return updatedUserDuel
   }
+
   private getFluidTypesFromStatus(fluidStatus: FluidStatus[]): FluidType[] {
     const fluidTypes: FluidType[] = []
     fluidStatus.forEach(fluid => {
@@ -183,27 +170,22 @@ export default class DuelService {
    */
   public async updateUserDuelThreshold(
     userDuel: UserDuel,
-    fluidStatus: Array<FluidStatus> = []
+    fluidStatus: FluidStatus[] = []
   ): Promise<UserDuel> {
     const consumptionService = new ConsumptionService(this._client)
     const performanceService = new PerformanceService()
-    const fluidTypes: Array<FluidType> =
-      this.getFluidTypesFromStatus(fluidStatus)
+    const fluidTypes = this.getFluidTypesFromStatus(fluidStatus)
     // Get last period with all days known
-    const period: TimePeriod | false = await this.getValidPeriod(
-      fluidStatus,
-      fluidTypes,
-      userDuel
-    )
+    const period = await this.getValidPeriod(fluidStatus, fluidTypes, userDuel)
     if (period !== false) {
       // Fetch performance data
-      const fetchLastValidData: Array<PerformanceIndicator> =
+      const fetchLastValidData =
         await consumptionService.getPerformanceIndicators(
           period,
           TimeStep.DAY,
           fluidTypes
         )
-      const maxData: PerformanceIndicator =
+      const maxData =
         performanceService.aggregatePerformanceIndicators(fetchLastValidData)
       // Set the threshold
       let updatedThreshold: number
@@ -232,34 +214,32 @@ export default class DuelService {
    * Return duel with updated state to UserDuelState.ONGOING and startDate
    * @param {UserDuel} userDuel - userDuel to update
    */
-  public async startUserDuel(userDuel: UserDuel): Promise<UserDuel> {
-    const updatedUserDuel: UserDuel = {
+  public startUserDuel(userDuel: UserDuel): UserDuel {
+    return {
       ...userDuel,
       state: UserDuelState.ONGOING,
       startDate: DateTime.local()
         .setZone('utc', { keepLocalTime: true })
         .startOf('day'),
     }
-    return updatedUserDuel
   }
 
   /**
    * Return duel with updated state to UserDuelState.DONE
    * @param {UserDuel} userDuel - userDuel to update
    */
-  public async endUserDuel(userDuel: UserDuel): Promise<UserDuel> {
-    const updatedUserDuel: UserDuel = {
+  public endUserDuel(userDuel: UserDuel): UserDuel {
+    return {
       ...userDuel,
       state: UserDuelState.DONE,
     }
-    return updatedUserDuel
   }
 
   /**
    * Return duel with updated state to UserDuelState.UNLOCKED
    * @param {UserDuel} userDuel - userDuel to reset
    */
-  public async resetUserDuel(userDuel: UserDuel): Promise<UserDuel> {
+  public resetUserDuel(userDuel: UserDuel): UserDuel {
     return {
       ...userDuel,
       startDate: null,
@@ -274,7 +254,7 @@ export default class DuelService {
    * @param {DuelEntity} duel - userDuel to update
    */
   public parseDuelEntityToDuel(duel: DuelEntity): UserDuel {
-    const userDuel: UserDuel = {
+    return {
       id: duel.id,
       title: duel.title,
       description: duel.description,
@@ -285,7 +265,6 @@ export default class DuelService {
       fluidTypes: [],
       userConsumption: 0,
     }
-    return userDuel
   }
 
   /**
@@ -293,7 +272,7 @@ export default class DuelService {
    * @param {DuelEntity[]} duelEntityList - userDuel to update
    * @param {string} searchId - userDuel to update
    */
-  public getDuelfromDuelEntities(
+  public getDuelFromDuelEntities(
     duelEntityList: DuelEntity[],
     searchId: string
   ): UserDuel {
diff --git a/src/services/ecogesture.service.spec.ts b/src/services/ecogesture.service.spec.ts
index d002f5f570f4570d153231970d9bd059ea4f9de7..8511c0c081d43b60f88a85aa840923031a7f6fa0 100644
--- a/src/services/ecogesture.service.spec.ts
+++ b/src/services/ecogesture.service.spec.ts
@@ -91,29 +91,29 @@ describe('Ecogesture service', () => {
       )
     })
   })
-  describe('reinitAllEcogestures', () => {
+  describe('resetAllEcogestures', () => {
     it('should return true when 3 ecogestures stored', async () => {
       mockClient.query.mockResolvedValueOnce(mockQueryResultMockedEcogestures)
-      const result = await ecogestureService.reinitAllEcogestures()
+      const result = await ecogestureService.resetAllEcogestures()
       expect(mockClient.save).toHaveBeenCalledTimes(3)
       expect(result).toBe(true)
     })
     it('should return true when no ecogestures stored', async () => {
       mockClient.query.mockResolvedValueOnce(mockQueryResultEmpty)
-      const result = await ecogestureService.reinitAllEcogestures()
+      const result = await ecogestureService.resetAllEcogestures()
       expect(result).toBe(true)
     })
-    it('should throw exception when error happened on reinit', async () => {
+    it('should throw exception when error happened on reset', async () => {
       mockClient.save.mockRejectedValue(new Error())
       mockClient.query.mockResolvedValueOnce(mockQueryResultMockedEcogestures)
-      await expect(ecogestureService.reinitAllEcogestures()).rejects.toThrow(
+      await expect(ecogestureService.resetAllEcogestures()).rejects.toThrow(
         new Error()
       )
     })
   })
 
   describe('filterByUsage', () => {
-    it('should return ecogesture list including ECS ecogestures', async () => {
+    it('should return ecogesture list including ECS ecogestures', () => {
       const mockEcogestureList: Ecogesture[] = ecogesturesECSData
       const mockProfileEcogesture1: ProfileEcogesture = {
         ...mockProfileEcogesture,
@@ -125,7 +125,7 @@ describe('Ecogesture service', () => {
       )
       expect(result.includes(ecogesturesECSData[0])).toBeTruthy()
     })
-    it('should return ecogesture list excluding ECS ecogestures', async () => {
+    it('should return ecogesture list excluding ECS ecogestures', () => {
       const mockEcogestureList: Ecogesture[] = ecogesturesECSData
       const mockProfileEcogesture1: ProfileEcogesture = {
         ...mockProfileEcogesture,
@@ -137,7 +137,7 @@ describe('Ecogesture service', () => {
       )
       expect(result.includes(ecogesturesECSData[1])).toBeFalsy()
     })
-    it('should return ecogesture list including HEATING ecogestures', async () => {
+    it('should return ecogesture list including HEATING ecogestures', () => {
       const mockEcogestureList: Ecogesture[] = ecogesturesHeatingData
       const mockProfileEcogesture2: ProfileEcogesture = {
         ...mockProfileEcogesture,
@@ -150,7 +150,7 @@ describe('Ecogesture service', () => {
       )
       expect(result.includes(ecogesturesHeatingData[0])).toBeTruthy()
     })
-    it('should return ecogesture list excluding HEATING ecogestures', async () => {
+    it('should return ecogesture list excluding HEATING ecogestures', () => {
       const mockEcogestureList: Ecogesture[] = ecogesturesHeatingData
       const mockProfileEcogesture2: ProfileEcogesture = {
         ...mockProfileEcogesture,
@@ -164,7 +164,7 @@ describe('Ecogesture service', () => {
     })
   })
   describe('filterByEquipment', () => {
-    it('should return ecogesture list including BOILER equipment and equipment verification to true', async () => {
+    it('should return ecogesture list including BOILER equipment and equipment verification to true', () => {
       const mockProfileEcogestureBOILER: ProfileEcogesture = {
         ...mockProfileEcogesture,
         equipments: [EquipmentType.BOILER],
@@ -175,7 +175,7 @@ describe('Ecogesture service', () => {
       )
       expect(result.includes(BoilerEcogesture[0])).toBeTruthy()
     })
-    it('should return ecogesture list excluding BOILER equipment and equipment verification to true', async () => {
+    it('should return ecogesture list excluding BOILER equipment and equipment verification to true', () => {
       const mockProfileEcogestureBOILER: ProfileEcogesture = {
         ...mockProfileEcogesture,
       }
@@ -185,7 +185,7 @@ describe('Ecogesture service', () => {
       )
       expect(result.includes(BoilerEcogesture[0])).toBeFalsy()
     })
-    it('should return ecogesture list including BOILER equipment with equipment verification to false but equipment to BOILER', async () => {
+    it('should return ecogesture list including BOILER equipment with equipment verification to false but equipment to BOILER', () => {
       const mockProfileEcogestureBOILER: ProfileEcogesture = {
         ...mockProfileEcogesture,
         equipments: [EquipmentType.BOILER],
diff --git a/src/services/ecogesture.service.ts b/src/services/ecogesture.service.ts
index 819959ca2fe0ba3a17142f7c3541d203c1e959ab..f6ad90a8aeb44676a840a6c4c736b1dcded923cc 100644
--- a/src/services/ecogesture.service.ts
+++ b/src/services/ecogesture.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import ecogestureData from 'db/ecogestureData.json'
 import { ECOGESTURE_DOCTYPE } from 'doctypes'
@@ -143,7 +143,7 @@ export default class EcogestureService {
   }
 
   public async getAllEcogestures(orderByID?: boolean): Promise<Ecogesture[]> {
-    let query: QueryDefinition = Q(ECOGESTURE_DOCTYPE)
+    let query = Q(ECOGESTURE_DOCTYPE)
 
     if (orderByID) {
       query = query
@@ -173,7 +173,7 @@ export default class EcogestureService {
    * @param {string} ids - ecogestures ids
    */
   public async getEcogesturesByIds(ids: string[]): Promise<Ecogesture[]> {
-    const query: QueryDefinition = Q(ECOGESTURE_DOCTYPE).getByIds(ids)
+    const query = Q(ECOGESTURE_DOCTYPE).getByIds(ids)
     const { data: ecogestures }: QueryResult<Ecogesture[]> =
       await this._client.query(query)
     return ecogestures
@@ -197,7 +197,7 @@ export default class EcogestureService {
     }
   }
 
-  public async reinitAllEcogestures(): Promise<boolean> {
+  public async resetAllEcogestures(): Promise<boolean> {
     const ecogestures = await this.getAllEcogestures()
     try {
       for (const ecogesture of ecogestures) {
@@ -210,9 +210,7 @@ export default class EcogestureService {
       }
       return true
     } catch (error) {
-      const errorMessage = `Error reinitAllEcogestures: ${JSON.stringify(
-        error
-      )}`
+      const errorMessage = `Error resetAllEcogestures: ${JSON.stringify(error)}`
       logStack('error', errorMessage)
       logApp.error(errorMessage)
       Sentry.captureException(error)
diff --git a/src/services/enedisMonthlyAnalysisData.service.ts b/src/services/enedisMonthlyAnalysisData.service.ts
index ef34a3e33c3aba8fdebc6a301bd6104864f6b34b..136d298dd6e685505947d142ebf526419c4e1387 100644
--- a/src/services/enedisMonthlyAnalysisData.service.ts
+++ b/src/services/enedisMonthlyAnalysisData.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import {
   ENEDIS_MAXPOWER_DOCTYPE,
@@ -39,7 +39,7 @@ export default class EnedisMonthlyAnalysisDataService {
   public async getLastEnedisMonthlyAnalysis(): Promise<
     EnedisMonthlyAnalysisData[]
   > {
-    const query: QueryDefinition = Q(ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE)
+    const query = Q(ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE)
       .where({})
       .indexFields(['year', 'month'])
       .sortBy([{ year: 'desc' }, { month: 'desc' }])
@@ -101,7 +101,7 @@ export default class EnedisMonthlyAnalysisDataService {
     year: number,
     month: number
   ): Promise<EnedisMonthlyAnalysisData[]> {
-    const query: QueryDefinition = Q(ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE)
+    const query = Q(ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE)
       .where({ year: year, month: month })
       .indexFields(['year', 'month'])
       .sortBy([{ year: 'desc' }, { month: 'desc' }])
@@ -143,7 +143,7 @@ export default class EnedisMonthlyAnalysisDataService {
     year: number,
     month: number
   ): Promise<MaxPowerEntity[]> {
-    const query: QueryDefinition = Q(ENEDIS_MAXPOWER_DOCTYPE)
+    const query = Q(ENEDIS_MAXPOWER_DOCTYPE)
       .where({ year: year, month: month })
       .indexFields(['year', 'month'])
       .sortBy([{ year: 'desc' }, { month: 'desc' }])
@@ -183,7 +183,7 @@ export default class EnedisMonthlyAnalysisDataService {
       month
     )
 
-    const monthQuery: QueryDefinition = Q(ENEDIS_MONTH_DOCTYPE)
+    const monthQuery = Q(ENEDIS_MONTH_DOCTYPE)
       .where({ year: year, month: month })
       .indexFields(['year', 'month'])
       .limitBy(1)
@@ -200,7 +200,7 @@ export default class EnedisMonthlyAnalysisDataService {
 
     for (const range of offPeakHours) {
       const { start, end } = range
-      const minuteQuery: QueryDefinition = Q(ENEDIS_MINUTE_DOCTYPE)
+      const minuteQuery = Q(ENEDIS_MINUTE_DOCTYPE)
         .where({
           year: year,
           month: month,
@@ -234,9 +234,7 @@ export default class EnedisMonthlyAnalysisDataService {
 
       // if the half-hour 23H30-0H00 is required, add the 0H00-0H30 consumption because the data is shifted in DB
       if (end.hour === 23 && end.minute === 59) {
-        const firstHalfHourQuery: QueryDefinition = Q(
-          ENEDIS_MINUTE_DOCTYPE
-        ).where({
+        const firstHalfHourQuery = Q(ENEDIS_MINUTE_DOCTYPE).where({
           year: year,
           month: month,
           hour: 0,
@@ -249,7 +247,7 @@ export default class EnedisMonthlyAnalysisDataService {
       }
     }
     logStack('debug', `Found ${minuteDocs.length} documents`)
-    const offPeakHoursConsumption = minuteDocs.reduce((sum: number, doc) => {
+    const offPeakHoursConsumption = minuteDocs.reduce((sum, doc) => {
       return sum + doc.load
     }, 0)
     return offPeakHoursConsumption
diff --git a/src/services/environement.service.spec.ts b/src/services/environement.service.spec.ts
index 4b747400619f7c59534ccfaf0cb749a3a3610ea8..7dc4afb27efb7c1570dd7823f5e8f1ca668b2779 100644
--- a/src/services/environement.service.spec.ts
+++ b/src/services/environement.service.spec.ts
@@ -5,11 +5,11 @@ declare const global: {
   __DEVELOPMENT__: boolean
 }
 
-describe('Environement service', () => {
+describe('Environment service', () => {
   const environmentService = new EnvironmentService()
 
   describe('isProduction()', () => {
-    it('should return true and prod url', async () => {
+    it('should return true and prod url', () => {
       global.__IS_ALPHA__ = false
       const result = environmentService.isProduction()
       expect(result).toEqual(true)
@@ -17,7 +17,7 @@ describe('Environement service', () => {
       expect(url).toEqual('https://ecolyo-agent.apps.grandlyon.com')
     })
 
-    it('should return false and rec url, alpha case', async () => {
+    it('should return false and rec url, alpha case', () => {
       global.__IS_ALPHA__ = true
       const result = environmentService.isProduction()
       expect(result).toEqual(false)
diff --git a/src/services/exploration.service.spec.ts b/src/services/exploration.service.spec.ts
index cb9ed9de840f7052200cf950decdbb4614b4a420..1a4fe2acb0a5e4035e2c4270cafce140efc2a69b 100644
--- a/src/services/exploration.service.spec.ts
+++ b/src/services/exploration.service.spec.ts
@@ -94,11 +94,11 @@ describe('Exploration service', () => {
     })
   })
 
-  describe('getUserExplorationfromExplorationEntities method', () => {
+  describe('getUserExplorationFromExplorationEntities method', () => {
     it('should return the userExploration from a explorationEntity', () => {
       const searchId = 'EXPLORATION001'
       const result =
-        explorationService.getUserExplorationfromExplorationEntities(
+        explorationService.getUserExplorationFromExplorationEntities(
           allExplorationEntities,
           searchId
         )
@@ -110,15 +110,15 @@ describe('Exploration service', () => {
     })
   })
   describe('startUserExploration Method', () => {
-    it('should return the started userExploration', async () => {
-      const result = await explorationService.startUserExploration(
+    it('should return the started userExploration', () => {
+      const result = explorationService.startUserExploration(
         userExplorationUnlocked
       )
       expect(result).toEqual(userExplorationStarted)
     })
   })
   describe('endUserExploration Method', () => {
-    it('should return the finished userExploration', async () => {
+    it('should return the finished userExploration', () => {
       const result = explorationService.endUserExploration(
         userExplorationStarted
       )
diff --git a/src/services/exploration.service.ts b/src/services/exploration.service.ts
index 605b9f54cb09d1db617559d8650d09b55321274d..446f58adf11b6ecd49f4475dc7ce7f3cb1ccefeb 100644
--- a/src/services/exploration.service.ts
+++ b/src/services/exploration.service.ts
@@ -1,4 +1,4 @@
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { EXPLORATION_DOCTYPE } from 'doctypes'
 import {
   UserChallengeUpdateFlag,
@@ -21,7 +21,7 @@ export default class ExplorationService {
    * Retrieve all exploration entities from db
    */
   public async getAllExplorationEntities(): Promise<ExplorationEntity[]> {
-    const query: QueryDefinition = Q(EXPLORATION_DOCTYPE)
+    const query = Q(EXPLORATION_DOCTYPE)
     const { data: explorations }: QueryResult<ExplorationEntity[]> =
       await this._client.query(query)
     return explorations
@@ -34,7 +34,7 @@ export default class ExplorationService {
   public async getExplorationEntityById(
     explorationId: string
   ): Promise<ExplorationEntity> {
-    const query: QueryDefinition = Q(EXPLORATION_DOCTYPE)
+    const query = Q(EXPLORATION_DOCTYPE)
       .where({ _id: explorationId })
       .limitBy(1)
     const {
@@ -63,7 +63,7 @@ export default class ExplorationService {
    * @param {ExplorationEntity[]} explorationEntityList - userExploration to update
    * @param {string} searchId - userExploration to update
    */
-  public getUserExplorationfromExplorationEntities(
+  public getUserExplorationFromExplorationEntities(
     explorationEntityList: ExplorationEntity[],
     searchId: string
   ): UserExploration {
@@ -87,8 +87,7 @@ export default class ExplorationService {
         entity => entity.id === searchId
       )
       if (explorationEntityIndex >= 0) {
-        const explorationEntity: ExplorationEntity =
-          explorationEntityList[explorationEntityIndex]
+        const explorationEntity = explorationEntityList[explorationEntityIndex]
         exploration =
           this.parseExplorationEntityToUserExploration(explorationEntity)
       }
@@ -116,57 +115,51 @@ export default class ExplorationService {
    * Return exploration with updated state to UserExplorationState.ONGOING
    * @param {UserExploration} userExploration - userExploration to update
    */
-  public async startUserExploration(
+  public startUserExploration(
     userExploration: UserExploration
-  ): Promise<UserExploration> {
-    const updatedUserExploration: UserExploration = {
+  ): UserExploration {
+    return {
       ...userExploration,
       state: UserExplorationState.ONGOING,
     }
-    return updatedUserExploration
   }
 
   /**
    * Return exploration with updated state to UserExplorationState.NOTIFICATION
    * @param {UserExploration} userExploration - userExploration to update
    */
-  public async awaitNotificationUserExploration(
+  public setNotificationUserExploration(
     userExploration: UserExploration
-  ): Promise<UserExploration> {
-    const updatedUserExploration: UserExploration = {
+  ): UserExploration {
+    return {
       ...userExploration,
       state: UserExplorationState.NOTIFICATION,
       progress: 5, // userExploration.type === UserExplorationType.ACTION ? 3 : 1,
     }
-    return updatedUserExploration
   }
   /**
    * Return exploration with updated state to UserExplorationState.DONE
    * @param {UserExploration} userExploration - userExploration to update
    */
   public endUserExploration(userExploration: UserExploration): UserExploration {
-    const updatedUserExploration: UserExploration = {
+    return {
       ...userExploration,
       state: UserExplorationState.DONE,
       progress: 5, // userExploration.type === UserExplorationType.ACTION ? 3 : 1,
     }
-    return updatedUserExploration
   }
 
   /**
    * Return updated exploration
    * @param {UserExploration} userExploration - userExploration to update
    */
-  public async updateUserExploration(
+  public updateUserExploration(
     userExploration: UserExploration
-  ): Promise<UserExploration> {
-    const updatedProgress = userExploration.progress + 1
-
-    const updatedUserExploration: UserExploration = {
+  ): UserExploration {
+    return {
       ...userExploration,
-      progress: updatedProgress,
+      progress: userExploration.progress + 1,
     }
-    return updatedUserExploration
   }
 
   /**
diff --git a/src/services/fluid.service.spec.ts b/src/services/fluid.service.spec.ts
index 8de4bf3ba466ab01c64883ba3becd9418b7ff858..5428343428c42cb7c021d6d33874de4ffb9330e4 100644
--- a/src/services/fluid.service.spec.ts
+++ b/src/services/fluid.service.spec.ts
@@ -529,145 +529,4 @@ describe('Fluid service', () => {
       expect(fluidStatus[2].maintenance).toBeTruthy()
     })
   })
-
-  describe('getOldFluidData method', () => {
-    it('should return Electricity as old fluid', async () => {
-      const mockFluidStatus: FluidStatus[] = [
-        {
-          fluidType: FluidType.ELECTRICITY,
-          status: FluidState.DONE,
-          maintenance: false,
-          firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', {
-            keepLocalTime: true,
-          }),
-          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
-            keepLocalTime: true,
-          }),
-          connection: {
-            konnector: konnectorsData[0],
-            account: accountsData[0],
-            trigger: triggersData[0],
-            triggerState: triggerStateData,
-            shouldLaunchKonnector: false,
-            isUpdating: false,
-            konnectorConfig: {
-              name: 'Enedis',
-              oauth: false,
-              slug: FluidSlugType.ELECTRICITY,
-              siteLink: 'https://mon-compte-client.enedis.fr/',
-              activation: 'https://mon-compte-particulier.enedis.fr/donnees/',
-            },
-          },
-        },
-      ]
-      const result = await FluidService.getOldFluidData(mockFluidStatus)
-      expect(result).toEqual([FluidType.ELECTRICITY])
-    })
-
-    it('should return empty array as lastdatadate < 5 days', async () => {
-      const mockFluidStatus: FluidStatus[] = [
-        {
-          fluidType: FluidType.ELECTRICITY,
-          status: FluidState.DONE,
-          maintenance: false,
-          firstDataDate: DateTime.local().minus({ day: 31 }).setZone('utc', {
-            keepLocalTime: true,
-          }),
-          lastDataDate: DateTime.local().minus({ day: 1 }).setZone('utc', {
-            keepLocalTime: true,
-          }),
-          connection: {
-            konnector: konnectorsData[0],
-            account: accountsData[0],
-            trigger: triggersData[0],
-            triggerState: triggerStateData,
-            shouldLaunchKonnector: false,
-            isUpdating: false,
-            konnectorConfig: {
-              name: 'Enedis',
-              oauth: false,
-              slug: FluidSlugType.ELECTRICITY,
-              siteLink: 'https://mon-compte-client.enedis.fr/',
-              activation: 'https://mon-compte-particulier.enedis.fr/donnees/',
-            },
-          },
-        },
-      ]
-      const result = await FluidService.getOldFluidData(mockFluidStatus)
-      expect(result).toEqual([])
-    })
-
-    it('should return empty array as status is NOT_CONNECTED', async () => {
-      const mockFluidStatus: FluidStatus[] = [
-        {
-          fluidType: FluidType.ELECTRICITY,
-          status: FluidState.NOT_CONNECTED,
-          maintenance: false,
-          firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', {
-            keepLocalTime: true,
-          }),
-          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
-            keepLocalTime: true,
-          }),
-          connection: {
-            konnector: konnectorsData[0],
-            account: accountsData[0],
-            trigger: triggersData[0],
-            triggerState: triggerStateData,
-            shouldLaunchKonnector: false,
-            isUpdating: false,
-            konnectorConfig: {
-              name: 'Enedis',
-              oauth: false,
-              slug: FluidSlugType.ELECTRICITY,
-              siteLink: 'https://mon-compte-client.enedis.fr/',
-              activation: 'https://mon-compte-particulier.enedis.fr/donnees/',
-            },
-          },
-        },
-      ]
-      const result: FluidType[] =
-        await FluidService.getOldFluidData(mockFluidStatus)
-      expect(result).toEqual([])
-    })
-
-    it('should return empty array as status is KONNECTOR_NOT_FOUND', async () => {
-      const mockFluidStatus: FluidStatus[] = [
-        {
-          fluidType: FluidType.ELECTRICITY,
-          status: FluidState.KONNECTOR_NOT_FOUND,
-          maintenance: false,
-          firstDataDate: DateTime.fromISO('2019-01-01').setZone('utc', {
-            keepLocalTime: true,
-          }),
-          lastDataDate: DateTime.fromISO('2020-01-01').setZone('utc', {
-            keepLocalTime: true,
-          }),
-          connection: {
-            konnector: konnectorsData[0],
-            account: accountsData[0],
-            trigger: triggersData[0],
-            triggerState: triggerStateData,
-            shouldLaunchKonnector: false,
-            isUpdating: false,
-            konnectorConfig: {
-              name: 'Enedis',
-              oauth: false,
-              slug: FluidSlugType.ELECTRICITY,
-              siteLink: 'https://mon-compte-client.enedis.fr/',
-              activation: 'https://mon-compte-particulier.enedis.fr/donnees/',
-            },
-          },
-        },
-      ]
-      const result: FluidType[] =
-        await FluidService.getOldFluidData(mockFluidStatus)
-      expect(result).toEqual([])
-    })
-
-    it('should return empty array', async () => {
-      const result: FluidType[] = await FluidService.getOldFluidData([])
-      expect(result).toEqual([])
-    })
-  })
 })
diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts
index f22c17dc550c959396a9838018e09139865a5837..4cf603519df382e60d464e71951e6b7689b00a34 100644
--- a/src/services/fluid.service.ts
+++ b/src/services/fluid.service.ts
@@ -157,31 +157,4 @@ export default class FluidService {
     ]
     return result
   }
-
-  /**
-   * Return fluids with data older than 5 days
-   */
-  static getOldFluidData = async (
-    fluidStatus: FluidStatus[]
-  ): Promise<FluidType[]> => {
-    const fluidOldData: FluidType[] = []
-    if (fluidStatus.length > 0) {
-      for (const fluid of fluidStatus) {
-        let diffInDays = 0
-        if (fluid?.lastDataDate) {
-          const dateToCompare = fluid.lastDataDate
-          diffInDays = dateToCompare.diffNow('days').toObject().days || 0
-          if (
-            diffInDays < -5 &&
-            fluid.status !== FluidState.KONNECTOR_NOT_FOUND &&
-            fluid.status !== FluidState.NOT_CONNECTED
-          ) {
-            !fluidOldData.includes(fluid.fluidType) &&
-              fluidOldData.push(fluid.fluidType)
-          }
-        }
-      }
-    }
-    return fluidOldData
-  }
 }
diff --git a/src/services/fluidsPrices.service.spec.ts b/src/services/fluidsPrices.service.spec.ts
index bd7361028194e3421771feb24cb87867daaa8849..183f485b690fe2918ece4034f15f8c9a8c5bbbb5 100644
--- a/src/services/fluidsPrices.service.spec.ts
+++ b/src/services/fluidsPrices.service.spec.ts
@@ -13,21 +13,6 @@ import FluidPricesService from './fluidsPrices.service'
 describe('FluidPrices service', () => {
   const fluidPricesService = new FluidPricesService(mockClient)
 
-  describe('Fluid Prices - getAllPrices', () => {
-    it('should getAllPrices', async () => {
-      const mockQueryResult: QueryResult<FluidPrice[]> = {
-        data: fluidPrices,
-        bookmark: '',
-        next: false,
-        skip: 0,
-      }
-      mockClient.query.mockResolvedValueOnce(mockQueryResult)
-      const prices = await fluidPricesService.getAllPrices()
-      expect(prices).toBe(fluidPrices)
-      expect(mockClient.query).toHaveBeenCalled()
-    })
-  })
-
   describe('Fluid Prices - getPrices', () => {
     it('should getPrices for elec', async () => {
       const mockQueryResult: QueryResult<FluidPrice[]> = {
@@ -80,43 +65,6 @@ describe('FluidPrices service', () => {
     })
   })
 
-  describe('Fluid Prices - deleteAllFluidsPrices', () => {
-    it('should return true when fluidsPrices stored', async () => {
-      const mockQueryResult: QueryResult<FluidPrice[]> = {
-        data: fluidPrices,
-        bookmark: '',
-        next: false,
-        skip: 0,
-      }
-      mockClient.query.mockResolvedValueOnce(mockQueryResult)
-      const result = await fluidPricesService.deleteAllFluidsPrices()
-      expect(mockClient.destroy).toHaveBeenCalledTimes(6)
-      expect(result).toBe(true)
-    })
-    it('should return true when no fluidsPrices stored', async () => {
-      const mockQueryResult: QueryResult<FluidPrice[]> = {
-        data: [],
-        bookmark: '',
-        next: false,
-        skip: 0,
-      }
-      mockClient.query.mockResolvedValueOnce(mockQueryResult)
-      const result = await fluidPricesService.deleteAllFluidsPrices()
-      expect(result).toBe(true)
-    })
-    it('should return false when error happened on deletion', async () => {
-      const mockQueryResult: QueryResult<FluidPrice[]> = {
-        data: fluidPrices,
-        bookmark: '',
-        next: false,
-        skip: 0,
-      }
-      mockClient.destroy.mockRejectedValue(new Error())
-      mockClient.query.mockResolvedValueOnce(mockQueryResult)
-      const result = await fluidPricesService.deleteAllFluidsPrices()
-      expect(result).toBe(false)
-    })
-  })
   it('should checkIfPriceExists and return it', async () => {
     const mockQueryResult: QueryResult<FluidPrice[]> = {
       data: [fluidPrices[0]],
diff --git a/src/services/fluidsPrices.service.ts b/src/services/fluidsPrices.service.ts
index 5a16cf3ae4ac94748ffb5130c05ba5a73f5a531f..3309a9a795f5e9ca523057a2ff8c5b0b74420570 100644
--- a/src/services/fluidsPrices.service.ts
+++ b/src/services/fluidsPrices.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import { FLUIDSPRICES_DOCTYPE } from 'doctypes'
 import { FluidType } from 'enums'
@@ -17,17 +17,6 @@ export default class FluidPricesService {
     this._client = _client
   }
 
-  /**
-   * Get all prices available in database
-   */
-  public async getAllPrices(): Promise<FluidPrice[]> {
-    const query: QueryDefinition = Q(FLUIDSPRICES_DOCTYPE).limitBy(900)
-    // TODO : handle case of 1000+ entries in doctype
-    const { data: fluidsPrices }: QueryResult<FluidPrice[]> =
-      await this._client.query(query)
-    return fluidsPrices
-  }
-
   /**
    * Get a price according to a fluidType and a data. This method return the nearest and valid price for the given date.
    */
@@ -35,7 +24,7 @@ export default class FluidPricesService {
     fluidType: FluidType,
     date: DateTime
   ): Promise<FluidPrice> {
-    const query: QueryDefinition = Q(FLUIDSPRICES_DOCTYPE)
+    const query = Q(FLUIDSPRICES_DOCTYPE)
       .where({
         startDate: {
           $lte: date.toISO({ suppressMilliseconds: true }).toString(),
@@ -55,7 +44,7 @@ export default class FluidPricesService {
    * Get current prices for all fluidTypes.
    */
   public async getAllLastPrices(): Promise<FluidPrice[]> {
-    const query: QueryDefinition = Q(FLUIDSPRICES_DOCTYPE)
+    const query = Q(FLUIDSPRICES_DOCTYPE)
       .where({ endDate: { $eq: '' } })
       .indexFields(['fluidType'])
       .sortBy([{ fluidType: 'asc' }])
@@ -94,34 +83,13 @@ export default class FluidPricesService {
   }
 
   /**
-   * Delete all fluidPrices entities from the db
-   * @returns {boolean} - true when deleted with success
-   * @throws {Error}
-   */
-  public async deleteAllFluidsPrices(): Promise<boolean> {
-    const fluidsPrices = await this.getAllPrices()
-    try {
-      for (const price of fluidsPrices) {
-        await this._client.destroy(price)
-      }
-      return true
-    } catch (error) {
-      const errorMessage = `deleteAllFluidsPrices: ${JSON.stringify(error)}`
-      logStack('error', errorMessage)
-      logApp.error(errorMessage)
-      Sentry.captureException(error)
-      return false
-    }
-  }
-
-  /**
-   * Check if a fluidprice exists in db
+   * Check if a fluidPrice exists in db
    * @returns {Promise<FluidPrice | null>} price or null
    */
   public async checkIfPriceExists(
     fluidPrice: FluidPrice
   ): Promise<FluidPrice | null> {
-    const query: QueryDefinition = Q(FLUIDSPRICES_DOCTYPE).where({
+    const query = Q(FLUIDSPRICES_DOCTYPE).where({
       startDate: { $eq: fluidPrice.startDate },
       fluidType: { $eq: fluidPrice.fluidType },
     })
@@ -129,7 +97,7 @@ export default class FluidPricesService {
       data: [price],
     }: QueryResult<FluidPrice[]> = await this._client.query(query)
     if (price) return price
-    else return null
+    return null
   }
 
   /**
@@ -164,9 +132,7 @@ export default class FluidPricesService {
         ...doc,
         ...attributes,
       })
-    if (fluidPrice) {
-      return fluidPrice
-    }
+    if (fluidPrice) return fluidPrice
     return null
   }
 }
diff --git a/src/services/initialization.service.spec.ts b/src/services/initialization.service.spec.ts
index db73da151c8d89785cd6f1ce3b942864e3c76c6a..197d51023cacef93cc648702912fc9da00883446 100644
--- a/src/services/initialization.service.spec.ts
+++ b/src/services/initialization.service.spec.ts
@@ -63,15 +63,6 @@ jest.mock('./challenge.service', () => {
   }))
 })
 
-const mockGetAllPrices = jest.fn()
-const mockDeleteAllFluidsPrices = jest.fn()
-jest.mock('./fluidsPrices.service', () => {
-  return jest.fn(() => ({
-    getAllPrices: mockGetAllPrices,
-    deleteAllFluidsPrices: mockDeleteAllFluidsPrices,
-  }))
-})
-
 const mockGetAllDuelEntities = jest.fn()
 const mockDeleteAllDuelEntities = jest.fn()
 jest.mock('./duel.service', () => {
@@ -127,11 +118,7 @@ jest.mock('./terms.service', () => {
 })
 
 describe('Initialization service', () => {
-  const initializationService = new InitializationService(
-    mockClient,
-    jest.fn(),
-    jest.fn()
-  )
+  const initializationService = new InitializationService(mockClient, jest.fn())
   beforeEach(() => {
     jest.clearAllMocks()
   })
@@ -603,19 +590,18 @@ describe('Initialization service', () => {
   })
 
   describe('initAnalysis method', () => {
-    it('should return monthlyAnalysisDate and haveSeenLastAnalysis when analysis is up to date', async () => {
+    it('should return monthlyAnalysisDate and haveSeenLastAnalysis when analysis is up to date', () => {
       const profile: Profile = {
         ...mockProfileState,
         monthlyAnalysisDate: getActualAnalysisDate(),
       }
-      await expect(
-        initializationService.initAnalysis(profile)
-      ).resolves.toEqual({
+      const result = initializationService.initAnalysis(profile)
+      expect(result).toEqual({
         monthlyAnalysisDate: getActualAnalysisDate(),
         haveSeenLastAnalysis: profile.haveSeenLastAnalysis,
       })
     })
-    it('should return updated monthlyAnalysisDate and haveSeenLastAnalysis=true when analysis is not up to date and isFirstConnection', async () => {
+    it('should return updated monthlyAnalysisDate and haveSeenLastAnalysis=true when analysis is not up to date and isFirstConnection', () => {
       const profile: Profile = {
         ...mockProfileState,
         monthlyAnalysisDate: DateTime.fromISO('2000-10-02T00:00:00.000Z', {
@@ -624,14 +610,13 @@ describe('Initialization service', () => {
         haveSeenLastAnalysis: true,
         isFirstConnection: true,
       }
-      await expect(
-        initializationService.initAnalysis(profile)
-      ).resolves.toEqual({
+      const result = initializationService.initAnalysis(profile)
+      expect(result).toEqual({
         monthlyAnalysisDate: getActualAnalysisDate(),
         haveSeenLastAnalysis: true,
       })
     })
-    it('should return updated monthlyAnalysisDate and haveSeenLastAnalysis=false when analysis is not up to date and isFirstConnection is false', async () => {
+    it('should return updated monthlyAnalysisDate and haveSeenLastAnalysis=false when analysis is not up to date and isFirstConnection is false', () => {
       const profile: Profile = {
         ...mockProfileState,
         isFirstConnection: false,
@@ -640,9 +625,8 @@ describe('Initialization service', () => {
         }),
         haveSeenLastAnalysis: true,
       }
-      await expect(
-        initializationService.initAnalysis(profile)
-      ).resolves.toEqual({
+      const result = initializationService.initAnalysis(profile)
+      expect(result).toEqual({
         monthlyAnalysisDate: getActualAnalysisDate(),
         haveSeenLastAnalysis: false,
       })
diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts
index b30bb683aa36206da0c133acd1404a47d2c643d6..09ee0f4a2baf2c9a6ffb919f39ffa809f9710255 100644
--- a/src/services/initialization.service.ts
+++ b/src/services/initialization.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import challengeEntityData from 'db/challengeEntity.json'
 import duelEntityData from 'db/duelEntity.json'
@@ -21,7 +21,6 @@ import { migrations } from 'migrations/migration.data'
 import {
   Dataload,
   FluidStatus,
-  InitSteps,
   InitStepsErrors,
   Profile,
   ProfileEcogesture,
@@ -50,20 +49,17 @@ const logStack = logger.namespace('initializationService')
 
 export default class InitializationService {
   private readonly _client: Client
-  private readonly _setInitStep: React.Dispatch<React.SetStateAction<InitSteps>>
   private readonly _setInitStepError: React.Dispatch<
     React.SetStateAction<InitStepsErrors | null>
   >
 
   constructor(
     _client: Client,
-    _setInitStep: React.Dispatch<React.SetStateAction<InitSteps>>,
     _setInitStepError: React.Dispatch<
       React.SetStateAction<InitStepsErrors | null>
     >
   ) {
     this._client = _client
-    this._setInitStep = _setInitStep
     this._setInitStepError = _setInitStepError
   }
 
@@ -77,7 +73,6 @@ export default class InitializationService {
     const startTime = performance.now()
     const profileService = new ProfileService(this._client)
     try {
-      this._setInitStep(InitSteps.PROFILE)
       const loadedProfile = await profileService.getProfile()
       if (!loadedProfile) {
         // Population with the data
@@ -161,12 +156,12 @@ export default class InitializationService {
   public async initFluidPrices(): Promise<void> {
     const startTime = performance.now()
     logDuration('[Initialization] Launching fluidPrices service', startTime)
-    const triggerQuery: QueryDefinition = Q(TRIGGERS_DOCTYPE).where({
+    const triggerQuery = Q(TRIGGERS_DOCTYPE).where({
       'message.name': 'fluidsPrices',
     })
     const {
       data: [trigger],
-    }: QueryResult<Array<Trigger>> = await this._client.query(triggerQuery)
+    }: QueryResult<Trigger[]> = await this._client.query(triggerQuery)
     if (trigger?._id) {
       this._client
         .getStackClient()
@@ -185,7 +180,6 @@ export default class InitializationService {
 
   public async initChallengeEntity(hash: string): Promise<string> {
     const startTime = performance.now()
-    this._setInitStep(InitSteps.CHALLENGES)
     const challengeHash = hashFile(challengeEntityData)
     const challengeService = new ChallengeService(this._client)
     // Populate data if none challengeEntity exists
@@ -473,10 +467,10 @@ export default class InitializationService {
     }
   }
 
-  public async initAnalysis(profile: Profile): Promise<{
+  public initAnalysis(profile: Profile): {
     monthlyAnalysisDate: DateTime
     haveSeenLastAnalysis: boolean
-  }> {
+  } {
     const startTime = performance.now()
     try {
       const actualAnalysisDate = getActualAnalysisDate()
@@ -516,8 +510,8 @@ export default class InitializationService {
 
   /**
    * Check if FluidTypes exist
-   * success return: FluidType[]
-   * failure throw error
+   * - success return: FluidType[]
+   * - failure throw error
    */
   public async initFluidTypes(): Promise<FluidType[]> {
     const startTime = performance.now()
@@ -546,14 +540,13 @@ export default class InitializationService {
 
   /**
    * For each fluid get the trigger status and the last data date
-   * success return: FluidStatus[]
-   * failure throw error
+   * - success return: FluidStatus[]
+   * - failure throw error
    */
   public async initFluidStatus(): Promise<FluidStatus[]> {
     const startTime = performance.now()
     const fs = new FluidService(this._client)
     try {
-      this._setInitStep(InitSteps.CONSOS)
       const fluidStatus = await fs.getFluidStatus()
       if (fluidStatus) {
         logDuration('[Initialization] Fluid Status loaded', startTime)
@@ -635,7 +628,6 @@ export default class InitializationService {
   public async initConsent(): Promise<TermsStatus> {
     const startTime = performance.now()
     try {
-      this._setInitStep(InitSteps.CONSENT)
       const termService = new TermsService(this._client)
       const isUpToDate = await termService.isConsentVersionUpToDate()
       const lastTerm = await termService.getLastTerm()
diff --git a/src/services/konnector.service.ts b/src/services/konnector.service.ts
index 5b16ad5391d0031d9f1e0744bebb472e6461dd73..00887b6bc13641d001d6a5a027526cc64f0ee908 100644
--- a/src/services/konnector.service.ts
+++ b/src/services/konnector.service.ts
@@ -1,4 +1,4 @@
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { KONNECTORS_DOCTYPE } from 'doctypes'
 import { Account, Konnector, TriggerState } from 'models'
 import TriggerService from 'services/triggers.service'
@@ -11,7 +11,7 @@ export default class KonnectorService {
   }
 
   public async getKonnector(id: string): Promise<Konnector | null> {
-    const query: QueryDefinition = Q(KONNECTORS_DOCTYPE).where({
+    const query = Q(KONNECTORS_DOCTYPE).where({
       _id: KONNECTORS_DOCTYPE + '/' + id,
     })
     const { data: konnector }: QueryResult<Konnector[]> =
@@ -33,9 +33,7 @@ export default class KonnectorService {
   }
 
   public async createIndexKonnector() {
-    const query: QueryDefinition = Q(KONNECTORS_DOCTYPE)
-      .where({ _id: 'index' })
-      .limitBy(1)
+    const query = Q(KONNECTORS_DOCTYPE).where({ _id: 'index' }).limitBy(1)
     const { data: result }: QueryResult<[]> = await this._client.query(query)
     return result
   }
diff --git a/src/services/mail.service.ts b/src/services/mail.service.ts
index 1e425524b7d7e39e1eb68e9ba873d4f726bbe7dc..534cfa4365b824709743b32b0a733e9b16daf7c7 100644
--- a/src/services/mail.service.ts
+++ b/src/services/mail.service.ts
@@ -11,7 +11,7 @@ export default class MailService {
   ): Promise<void> {
     try {
       const jobCollection = client.collection('io.cozy.jobs')
-      jobCollection.create('sendmail', mailInfo)
+      await jobCollection.create('sendmail', mailInfo)
     } catch (error) {
       const errorMessage = `Failed to send mail`
       logStack('error', errorMessage)
diff --git a/src/services/permissions.service.ts b/src/services/permissions.service.ts
index a16f3f371e597a7a496c27ae0cc7adf1b863662c..3702f7a74f700013bdbd4c0c3e7c1e74e9fe9458 100644
--- a/src/services/permissions.service.ts
+++ b/src/services/permissions.service.ts
@@ -3,9 +3,9 @@ import { Client, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import { PERMISSIONS_DOCTYPE } from 'doctypes/io-cozy-permissions'
 
-const logStack = logger.namespace('challengeService')
+const logStack = logger.namespace('permissionService')
 
-type PermissionsResponse = {
+interface PermissionsResponse {
   attributes: {
     type: string
     source_id: string
diff --git a/src/services/profile.service.ts b/src/services/profile.service.ts
index 48a31b7224ff4bfef964f420d4623323dfb17eb5..33a7a32df794fce34eeb468842cf1daf683ecf35 100644
--- a/src/services/profile.service.ts
+++ b/src/services/profile.service.ts
@@ -1,4 +1,4 @@
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { PROFILE_DOCTYPE } from 'doctypes'
 import { DateTime } from 'luxon'
 import { Profile, ProfileEntity } from 'models'
@@ -42,11 +42,11 @@ export default class ProfileService {
   }
 
   public async getProfile(): Promise<Profile | null> {
-    const query: QueryDefinition = Q(PROFILE_DOCTYPE)
+    const query = Q(PROFILE_DOCTYPE)
     const {
       data: [profile],
     }: QueryResult<ProfileEntity[]> = await this._client.query(query.limitBy(1))
-    const profileEntity: ProfileEntity | null = profile ? profile : null
+    const profileEntity = profile ? profile : null
     if (profileEntity) {
       return this.parseProfileEntityToProfile(profileEntity)
     }
@@ -56,7 +56,7 @@ export default class ProfileService {
   public async updateProfile(
     attributes: Partial<Profile>
   ): Promise<Profile | null> {
-    const query: QueryDefinition = Q(PROFILE_DOCTYPE)
+    const query = Q(PROFILE_DOCTYPE)
     const {
       data: [doc],
     }: QueryResult<ProfileEntity[]> = await this._client.query(query.limitBy(1))
diff --git a/src/services/profileEcogesture.service.ts b/src/services/profileEcogesture.service.ts
index e9cfce1e125ebd6e3162c3a626adccd7054dfb00..ff44764751853ee4aaa19dd81c0de4cdecffd2f6 100644
--- a/src/services/profileEcogesture.service.ts
+++ b/src/services/profileEcogesture.service.ts
@@ -1,4 +1,4 @@
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { PROFILEECOGESTURE_DOCTYPE } from 'doctypes'
 import { ProfileEcogesture } from 'models'
 
@@ -12,7 +12,7 @@ export default class ProfileEcogestureService {
    * Retrieve the ProfileEcogesture from db
    */
   public async getProfileEcogesture(): Promise<ProfileEcogesture | null> {
-    const query: QueryDefinition = Q(PROFILEECOGESTURE_DOCTYPE)
+    const query = Q(PROFILEECOGESTURE_DOCTYPE)
     const {
       data: [profileEcogesture],
     }: QueryResult<ProfileEcogesture[]> = await this._client.query(
@@ -28,7 +28,7 @@ export default class ProfileEcogestureService {
   public async updateProfileEcogesture(
     attributes: Partial<ProfileEcogesture>
   ): Promise<ProfileEcogesture | null> {
-    const query: QueryDefinition = Q(PROFILEECOGESTURE_DOCTYPE)
+    const query = Q(PROFILEECOGESTURE_DOCTYPE)
     const {
       data: [doc],
     }: QueryResult<ProfileEcogesture[]> = await this._client.query(
diff --git a/src/services/profileType.service.spec.ts b/src/services/profileType.service.spec.ts
index cda9941ab6337c5a53250d37ab43b00e0bc96858..5625bad4a5744e58d9eb047b497908954deb866a 100644
--- a/src/services/profileType.service.spec.ts
+++ b/src/services/profileType.service.spec.ts
@@ -14,6 +14,7 @@ import { DateTime } from 'luxon'
 import { DjuResult } from 'models'
 import { ProfileType } from 'models/profileType.model'
 import mockClient from 'tests/__mocks__/client.mock'
+import { mockFluidPrice } from 'tests/__mocks__/fluidPrice.mock'
 import {
   mockCorrectedConsumption,
   mockEstimatedConsumption,
@@ -40,9 +41,12 @@ import {
   mockWaterRawNeeds,
   mockWaterSpreadNeeds,
 } from 'tests/__mocks__/profileType.mock'
+import FluidPricesService from './fluidsPrices.service'
 import ProfileTypeService from './profileType.service'
 import ProfileTypeFormService from './profileTypeForm.service'
 
+const mockGetPrices = jest.spyOn(FluidPricesService.prototype, 'getPrices')
+
 const unknownStep = 99999 as ProfileTypeStepForm
 describe('ProfileType service', () => {
   const profileTypeService = new ProfileTypeService(
@@ -189,6 +193,7 @@ describe('ProfileType service', () => {
   })
 
   describe('getMonthlyForecast for January', () => {
+    mockGetPrices.mockResolvedValue(mockFluidPrice)
     it('should get the monthly forecast for test profile 1', async () => {
       const profileTypeService1 = new ProfileTypeService(
         mockTestProfile1,
@@ -555,14 +560,14 @@ describe('ProfileType service', () => {
         values: [
           {
             month: '2024-01',
-            average_measurement: 10.5,
+            sum_measurement: 10.5,
             identifiant: '69029001',
           },
         ],
       }
       mockClient.getStackClient().fetchJSON.mockResolvedValueOnce(mockDjuResult)
       const result = await profileTypeService.fetchDJU(2023, 2)
-      expect(result).toEqual(mockDjuResult.values[0].average_measurement)
+      expect(result).toEqual(mockDjuResult.values[0].sum_measurement)
     })
     it('should return default dju if remote doctype returns no value', async () => {
       const mockDjuResult: DjuResult = {
diff --git a/src/services/profileType.service.ts b/src/services/profileType.service.ts
index 8bd19f3633b65a0d7f283efe4311c439791f1fab..99f7d57c64bd0149b1fb785352a913dd0d89013e 100644
--- a/src/services/profileType.service.ts
+++ b/src/services/profileType.service.ts
@@ -28,6 +28,7 @@ import {
 import logApp from 'utils/logger'
 import { formatTwoDigits } from 'utils/utils'
 import ConverterService from './converter.service'
+import FluidPricesService from './fluidsPrices.service'
 
 const logStack = logger.namespace('profileTypeService')
 
@@ -83,7 +84,7 @@ export default class ProfileTypeService {
     let correctionFacilities: number
     const correctionsNbWalls =
       heatingData.adjustment_outside_facing_walls[housingType]
-    const correctionWalls: number = correctionsNbWalls[outsideFacingWalls]
+    const correctionWalls = correctionsNbWalls[outsideFacingWalls]
     const correctionFloor =
       housingType === HousingType.APARTMENT
         ? heatingData.adjustment_floor.apartment[floor]
@@ -151,13 +152,12 @@ export default class ProfileTypeService {
       heating !== IndividualOrCollective.COLLECTIVE
     ) {
       correctionFacilities =
-        heatingData.adjustment_facilities['individual_heater_and_ventilation']
+        heatingData.adjustment_facilities.individual_heater_and_ventilation
     } else if (hasReplacedHeater === ThreeChoicesAnswer.YES) {
-      correctionFacilities =
-        heatingData.adjustment_facilities['individual_heater']
+      correctionFacilities = heatingData.adjustment_facilities.individual_heater
     } else if (hasInstalledVentilation === ThreeChoicesAnswer.YES) {
       correctionFacilities =
-        heatingData.adjustment_facilities['individual_ventilation']
+        heatingData.adjustment_facilities.individual_ventilation
     } else {
       correctionFacilities = 0
     }
@@ -233,7 +233,7 @@ export default class ProfileTypeService {
       accumulator: number,
       currentValue: number
     ): number => accumulator + currentValue
-    const totalRawNeeds: number = rawNeeds.reduce(calculateTotalNeeds)
+    const totalRawNeeds = rawNeeds.reduce(calculateTotalNeeds)
     const spreadConsumption: number =
       (totalRawNeeds / (12 * 100)) * EcsData.mensual_repartition[month - 1]
     return Math.round(spreadConsumption)
@@ -282,7 +282,7 @@ export default class ProfileTypeService {
    * @returns {number} monthCookingConsumption
    */
   public getMonthCookingConsumption(month: number): number {
-    const annualCookingConsumption: number =
+    const annualCookingConsumption =
       this.profileType.occupantsNumber *
       cookingData.ratio_kw_per_person_per_year
     const nbDaysInMonth = DateTime.fromObject({
@@ -299,7 +299,7 @@ export default class ProfileTypeService {
    * @returns {number} monthElectricSpecificConsumption
    */
   public getMonthElectricSpecificConsumption(month: number): number {
-    const annualElectricSpecificConsumption: number =
+    const annualElectricSpecificConsumption =
       elecSpeData[this.profileType.housingType][
         this.profileType.constructionYear
       ]
@@ -317,11 +317,11 @@ export default class ProfileTypeService {
    * @returns {number} monthColdWaterConsumption
    */
   public getMonthColdWaterConsumption(month: number): number {
-    const occupantsNumberIndex: number = coldWaterData.findIndex(
+    const occupantsNumberIndex = coldWaterData.findIndex(
       waterNeeds =>
         waterNeeds.occupants_number === this.profileType.occupantsNumber
     )
-    const coldWaterNeeds: number =
+    const coldWaterNeeds =
       coldWaterData[occupantsNumberIndex].consumption_in_liter_per_day
     const nbDaysInMonth = DateTime.fromObject({
       month: month,
@@ -383,11 +383,17 @@ export default class ProfileTypeService {
     return detailsMonthlyForecast
   }
 
+  /**
+   * Get fluid forecast with adjusted price
+   */
   public async getFluidForecast(
     fluidType: FluidType,
     year: number,
     month: number
   ): Promise<FluidForecast> {
+    const converterService = new ConverterService()
+    const fluidsPricesService = new FluidPricesService(this._client)
+
     const detailsMonthlyForecast = await this.getDetailsMonthlyForecast(
       fluidType,
       year,
@@ -399,15 +405,23 @@ export default class ProfileTypeService {
       if (load !== null) fluidLoad += load
     })
 
-    const converterService = new ConverterService()
-    const fluidValue = parseFloat(
-      converterService.LoadToEuro(fluidLoad, fluidType).toPrecision(5)
+    const date = DateTime.fromObject({
+      year: year,
+      month: month,
+    })
+    const priceData = await fluidsPricesService.getPrices(fluidType, date)
+    const priceForecast = fluidLoad * priceData.price
+
+    const fluidPrice = parseFloat(
+      converterService
+        .LoadToEuro(fluidLoad, fluidType, priceForecast)
+        .toPrecision(5)
     )
 
     const fluidForecast: FluidForecast = {
       fluidType: fluidType,
       load: fluidLoad,
-      value: fluidValue,
+      value: fluidPrice,
       detailsMonthlyForecast: detailsMonthlyForecast,
     }
     return fluidForecast
@@ -452,7 +466,7 @@ export default class ProfileTypeService {
         .getStackClient()
         .fetchJSON('GET', `${REMOTE_ORG_ECOLYO_DJU}?month=${djuDate}`)
       if (result && result.nb_results !== 0) {
-        return result.values[0].average_measurement
+        return result.values[0].sum_measurement
       } else {
         return heatingData.dju_average_by_month[month - 1]
       }
diff --git a/src/services/profileTypeEntity.service.spec.ts b/src/services/profileTypeEntity.service.spec.ts
index 870510261d9292ac66b4dc6943dfdadecc0b84a4..fadb1a63dec7db6d95ad399e3ca75007db0987b4 100644
--- a/src/services/profileTypeEntity.service.spec.ts
+++ b/src/services/profileTypeEntity.service.spec.ts
@@ -1,4 +1,6 @@
 import { QueryResult } from 'cozy-client'
+import profileTypeDataJson from 'db/profileTypeData.json'
+import { DateTime } from 'luxon'
 import { ProfileType } from 'models'
 import mockClient from 'tests/__mocks__/client.mock'
 import { profileTypeData } from 'tests/__mocks__/profileType.mock'
@@ -8,26 +10,51 @@ describe('UserProfileTypeEntity service', () => {
   const pteService = new ProfileTypeEntityService(mockClient)
 
   describe('getUserProfileType', () => {
+    const mockProfileQueryResult: QueryResult<ProfileType[]> = {
+      data: [profileTypeData],
+      bookmark: '',
+      next: false,
+      skip: 0,
+    }
+    const mockEmptyQueryResult: QueryResult<ProfileType[]> = {
+      data: [],
+      bookmark: '',
+      next: false,
+      skip: 0,
+    }
+    it('should return the closest profileType according to passed argument updateDate', async () => {
+      mockClient.query.mockResolvedValueOnce(mockProfileQueryResult)
+      const result = await pteService.getProfileType(DateTime.local(2022, 1, 1))
+      expect(result).toEqual(profileTypeData)
+    })
+
+    it('should not find a profile corresponding to the passed argument updateDate', async () => {
+      mockClient.query.mockResolvedValueOnce(mockEmptyQueryResult)
+      mockClient.query.mockResolvedValueOnce(mockProfileQueryResult)
+      const result = await pteService.getProfileType(DateTime.local(2022, 1, 1))
+      expect(result).toEqual(profileTypeData)
+    })
+
+    it('should return default profileType if no profile found when date is given', async () => {
+      const date = DateTime.local(2022, 1, 1)
+      const defaultProfileType = {
+        ...profileTypeDataJson[0].profileType,
+        updateDate: date,
+      } as ProfileType
+
+      mockClient.query.mockResolvedValueOnce(mockEmptyQueryResult)
+      mockClient.query.mockResolvedValueOnce(mockEmptyQueryResult)
+      const result = await pteService.getProfileType(date)
+      expect(result).toEqual(defaultProfileType)
+    })
     it('should return the last profileType in base', async () => {
-      const mockQueryResult: QueryResult<ProfileType[]> = {
-        data: [profileTypeData],
-        bookmark: '',
-        next: false,
-        skip: 0,
-      }
-      mockClient.query.mockResolvedValueOnce(mockQueryResult)
+      mockClient.query.mockResolvedValueOnce(mockProfileQueryResult)
       const result = await pteService.getProfileType()
       expect(result).toEqual(profileTypeData)
     })
 
     it('should return null if no user profile found', async () => {
-      const mockQueryResult: QueryResult<ProfileType[]> = {
-        data: [],
-        bookmark: '',
-        next: false,
-        skip: 0,
-      }
-      mockClient.query.mockResolvedValueOnce(mockQueryResult)
+      mockClient.query.mockResolvedValueOnce(mockEmptyQueryResult)
       const result = await pteService.getProfileType()
       expect(result).toBeNull()
     })
diff --git a/src/services/profileTypeEntity.service.ts b/src/services/profileTypeEntity.service.ts
index 59d6b80dada9c3b9ec30dbb5f525933fd9368496..bda52c3ad8df0394914bf5a9b824dbbc40c3de38 100644
--- a/src/services/profileTypeEntity.service.ts
+++ b/src/services/profileTypeEntity.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import profileTypeData from 'db/profileTypeData.json'
 import { PROFILETYPE_DOCTYPE } from 'doctypes'
@@ -21,7 +21,7 @@ export default class ProfileTypeEntityService {
    * When called without parameters, fetches last profileType in doctype
    */
   public async getProfileType(date?: DateTime): Promise<ProfileType | null> {
-    const query: QueryDefinition = Q(PROFILETYPE_DOCTYPE)
+    const query = Q(PROFILETYPE_DOCTYPE)
     if (date) {
       const {
         data: [profileType],
@@ -32,7 +32,7 @@ export default class ProfileTypeEntityService {
           .sortBy([{ updateDate: 'desc' }])
           .limitBy(1)
       )
-      const result: ProfileType | null = profileType ? profileType : null
+      const result = profileType ? profileType : null
       if (result) {
         return this.parseProfileTypeEntityToProfileType(profileType)
       } else {
@@ -40,10 +40,9 @@ export default class ProfileTypeEntityService {
         logApp.debug(
           'Checking if user has already filled a profileType and uses it as default'
         )
-        const query: QueryDefinition = Q(PROFILETYPE_DOCTYPE)
         const data: QueryResult<ProfileType[]> = await this._client.query(query)
-        if (data.data.length) {
-          const loadedProfileType: ProfileType = data.data[0]
+        if (data?.data.length) {
+          const loadedProfileType = data.data[0]
           logApp.debug(
             'found oldest profileType filled by user : ',
             loadedProfileType
@@ -51,10 +50,10 @@ export default class ProfileTypeEntityService {
           return loadedProfileType
         } else {
           // return default profiletype
-          const loadedProfileType: any = {
+          const loadedProfileType = {
             ...profileTypeData[0].profileType,
             updateDate: date,
-          }
+          } as ProfileType
           logApp.debug('No profileType were found, loading default profileType')
           return loadedProfileType
         }
@@ -69,7 +68,7 @@ export default class ProfileTypeEntityService {
           .sortBy([{ updateDate: 'desc' }])
           .limitBy(1)
       )
-      const result: ProfileType | null = profileType ? profileType : null
+      const result = profileType ? profileType : null
       if (result) {
         return this.parseProfileTypeEntityToProfileType(profileType)
       }
@@ -85,7 +84,7 @@ export default class ProfileTypeEntityService {
   public async getAllProfileTypes(
     timePeriod?: TimePeriod
   ): Promise<ProfileType[] | null> {
-    const query: QueryDefinition = Q(PROFILETYPE_DOCTYPE)
+    const query = Q(PROFILETYPE_DOCTYPE)
     if (timePeriod) {
       const data: QueryResult<ProfileType[]> = await this._client.query(
         query
@@ -100,7 +99,7 @@ export default class ProfileTypeEntityService {
       )
       if (data.data.length) {
         const profileTypesToReturn: ProfileType[] = []
-        data.data.forEach((ele: ProfileType) => {
+        data.data.forEach(ele => {
           profileTypesToReturn.push(
             this.parseProfileTypeEntityToProfileType(ele)
           )
@@ -115,7 +114,7 @@ export default class ProfileTypeEntityService {
       )
       if (data.data.length) {
         const profileTypesToReturn: ProfileType[] = []
-        data.data.forEach((ele: ProfileType) => {
+        data.data.forEach(ele => {
           profileTypesToReturn.push(
             this.parseProfileTypeEntityToProfileType(ele)
           )
@@ -132,7 +131,7 @@ export default class ProfileTypeEntityService {
   public async saveProfileType(
     attributes: Partial<ProfileType>
   ): Promise<ProfileType | null> {
-    const query: QueryDefinition = Q(PROFILETYPE_DOCTYPE)
+    const query = Q(PROFILETYPE_DOCTYPE)
     const {
       data: [doc],
     }: QueryResult<ProfileType[]> = await this._client.query(query.limitBy(1))
diff --git a/src/services/queryRunner.service.ts b/src/services/queryRunner.service.ts
index 30dcbdf0c1e0b0e01efeb83740ccb15bb897f0f0..efd0abdeb3f53c2d24da9202c395a269a43e8a59 100644
--- a/src/services/queryRunner.service.ts
+++ b/src/services/queryRunner.service.ts
@@ -250,6 +250,8 @@ export default class QueryRunner {
           },
         }
         break
+      case TimeStep.HOUR:
+        throw new Error('Unexpected time step')
     }
     return predicate
   }
@@ -287,7 +289,7 @@ export default class QueryRunner {
     }
     return (
       doctypeMappings[fluidType]?.[timeStep] ||
-      doctypeMappings[fluidType]?.['default'] ||
+      doctypeMappings[fluidType]?.default ||
       'default'
     )
   }
@@ -297,7 +299,7 @@ export default class QueryRunner {
     timeStep: TimeStep,
     fluidType: FluidType
   ): Promise<Dataload[] | null> {
-    const query: QueryDefinition = this.buildListQuery(
+    const query = this.buildListQuery(
       timeStep,
       timePeriod,
       fluidType,
@@ -307,10 +309,7 @@ export default class QueryRunner {
 
     if (result?.data) {
       const filteredResult = this.filterDataList(result, timePeriod, timeStep)
-      const mappedResult: Dataload[] = this.mapDataList(
-        filteredResult,
-        timeStep
-      )
+      const mappedResult = this.mapDataList(filteredResult, timeStep)
       return mappedResult
     }
     return null
@@ -321,7 +320,7 @@ export default class QueryRunner {
     timeStep: TimeStep,
     fluidType: FluidType
   ) {
-    const query: QueryDefinition = this.buildListQuery(
+    const query = this.buildListQuery(
       timeStep,
       timePeriod,
       fluidType,
@@ -336,7 +335,7 @@ export default class QueryRunner {
     fluidType: FluidType,
     withDate?: boolean
   ): Promise<number | Dataload | null> {
-    const query: QueryDefinition = this.buildMaxQuery(
+    const query = this.buildMaxQuery(
       timeStep,
       maxTimePeriod,
       fluidType,
@@ -348,7 +347,7 @@ export default class QueryRunner {
         startDate: maxTimePeriod.startDate.plus({ day: -1 }),
         endDate: maxTimePeriod.startDate.plus({ day: -1 }).endOf('day'),
       }
-      const lastDayOfPreviousMonthQuery: QueryDefinition = this.buildMaxQuery(
+      const lastDayOfPreviousMonthQuery = this.buildMaxQuery(
         timeStep,
         lastDayOfPreviousMonth,
         fluidType,
@@ -383,11 +382,7 @@ export default class QueryRunner {
     fluidType: FluidType,
     timeStep?: TimeStep
   ): Promise<DateTime | null> {
-    const query: QueryDefinition = this.buildFirstDateQuery(
-      fluidType,
-      1,
-      timeStep
-    )
+    const query = this.buildFirstDateQuery(fluidType, 1, timeStep)
     const result = await this.fetchData(query)
     if (
       result?.data[0]?.year &&
@@ -411,11 +406,7 @@ export default class QueryRunner {
     fluidType: FluidType,
     timeStep?: TimeStep
   ): Promise<DateTime | null> {
-    const query: QueryDefinition = this.buildLastDateQuery(
-      fluidType,
-      1,
-      timeStep
-    )
+    const query = this.buildLastDateQuery(fluidType, 1, timeStep)
     const result = await this.fetchData(query)
     if (
       result?.data[0]?.year &&
diff --git a/src/services/quiz.service.spec.ts b/src/services/quiz.service.spec.ts
index 7b891b8419ff4ca068327a52d776f8a3ed7000d0..355120bcdfb0f6554ed3d3c84c12b2494a20af03 100644
--- a/src/services/quiz.service.spec.ts
+++ b/src/services/quiz.service.spec.ts
@@ -138,11 +138,11 @@ describe('Quiz service', () => {
     })
   })
 
-  describe('getUserQuizfromQuizEntities method', () => {
+  describe('getUserQuizFromQuizEntities method', () => {
     it('should return the userQuiz from a quizEntity', () => {
       const searchId = 'QUIZ001'
 
-      const result = quizService.getUserQuizfromQuizEntities(
+      const result = quizService.getUserQuizFromQuizEntities(
         allQuizEntities,
         searchId
       )
@@ -150,31 +150,31 @@ describe('Quiz service', () => {
     })
   })
   describe('endUserQuiz Method', () => {
-    it('should return the finished userQuiz', async () => {
-      const result = await quizService.endUserQuiz(quizDefault)
+    it('should return the finished userQuiz', () => {
+      const result = quizService.endUserQuiz(quizDefault)
       expect(result).toEqual(UserQuizDone)
     })
   })
   describe('startUserQuiz Method', () => {
-    it('should return the started userQuiz', async () => {
+    it('should return the started userQuiz', () => {
       jest
         .spyOn(DateTime, 'local')
         .mockReturnValueOnce(
           DateTime.fromISO('2021-01-01T00:00:00.000Z', { zone: 'utc' })
         )
-      const result = await quizService.startUserQuiz(quizDefault)
+      const result = quizService.startUserQuiz(quizDefault)
       expect(result).toEqual(UserQuizStarted)
     })
   })
   describe('resetUserQuiz Method', () => {
-    it('should return the reseted userQuiz', async () => {
-      const result = await quizService.resetUserQuiz(UserQuizDone)
+    it('should return the reseted userQuiz', () => {
+      const result = quizService.resetUserQuiz(UserQuizDone)
       expect(result).toEqual(UserQuizReseted)
     })
   })
   describe('updateUserQuiz Method', () => {
-    it('should return the userQuiz with updated result and correct answer to question', async () => {
-      const result = await quizService.updateUserQuiz(userQuiz, true, 0)
+    it('should return the userQuiz with updated result and correct answer to question', () => {
+      const result = quizService.updateUserQuiz(userQuiz, true, 0)
       const mockUpdatedQuestion: UserQuestion = {
         ...userQuiz.questions[0],
         result: UserQuestionState.CORRECT,
@@ -187,11 +187,11 @@ describe('Quiz service', () => {
       }
       expect(result).toEqual(mockUpdatedQuiz)
     })
-    it('should return the userQuiz with updated result and wrong answer to question', async () => {
-      const result = await quizService.updateUserQuiz(userQuiz, false, 2)
+    it('should return the userQuiz with updated result and wrong answer to question', () => {
+      const result = quizService.updateUserQuiz(userQuiz, false, 2)
       const mockUpdatedQuestion: UserQuestion = {
         ...userQuiz.questions[2],
-        result: UserQuestionState.UNCORRECT,
+        result: UserQuestionState.INCORRECT,
       }
       userQuiz.questions[2] = mockUpdatedQuestion
 
@@ -201,8 +201,8 @@ describe('Quiz service', () => {
       }
       expect(result).toEqual(mockUpdatedQuiz)
     })
-    it('should return the userQuiz with updated result and right answer to customQuestion', async () => {
-      const result = await quizService.updateUserQuiz(userQuiz, true)
+    it('should return the userQuiz with updated result and right answer to customQuestion', () => {
+      const result = quizService.updateUserQuiz(userQuiz, true)
       const mockUpdatedCustomQuestion: UserCustomQuestion = {
         ...userQuiz.customQuestion,
         result: UserQuestionState.CORRECT,
@@ -217,7 +217,7 @@ describe('Quiz service', () => {
     })
   })
   describe('getCustomQuestion Method', () => {
-    it('should return the customQuestion for date type without period - What day did I consumme the most on the last week ?', async () => {
+    it('should return the customQuestion for date type without period - What day did I consume the most on the last week ?', async () => {
       localSpy.mockReturnValue(
         DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc' })
       )
@@ -245,7 +245,7 @@ describe('Quiz service', () => {
       ])
       expect(result).toEqual(expected)
     })
-    it('should return the customQuestion for date type with period - What month did I consumme the most on year 2020 ?', async () => {
+    it('should return the customQuestion for date type with period - What month did I consume the most on year 2020 ?', async () => {
       localSpy.mockReturnValue(
         DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc' })
       )
@@ -272,7 +272,7 @@ describe('Quiz service', () => {
       ])
       expect(result).toEqual(expected)
     })
-    it('should return the customQuestion for maxload type without period - Which is your daily max consumption on the last week ?', async () => {
+    it('should return the customQuestion for max load type without period - Which is your daily max consumption on the last week ?', async () => {
       localSpy.mockReturnValue(
         DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc' })
       )
@@ -304,7 +304,7 @@ describe('Quiz service', () => {
       ])
       expect(result).toEqual(expected)
     })
-    it('should return the customQuestion for maxload type with period - Which is your daily max consumption on january 2020 ?', async () => {
+    it('should return the customQuestion for max load type with period - Which is your daily max consumption on January 2020 ?', async () => {
       localSpy.mockReturnValue(
         DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc' })
       )
@@ -335,18 +335,6 @@ describe('Quiz service', () => {
       const result = await quizService.getCustomQuestion(mockCustomQuestion, [
         FluidType.ELECTRICITY,
       ])
-      expect(mockGetMaxLoad).toHaveBeenCalledWith(
-        {
-          startDate: DateTime.fromObject({ month: 1, year: 2020 }).startOf(
-            'month'
-          ),
-          endDate: DateTime.fromObject({ month: 1, year: 2020 }).endOf('month'),
-        },
-        TimeStep.DAY,
-        [FluidType.ELECTRICITY],
-        undefined,
-        true
-      )
       expect(result).toEqual(expected)
     })
     it('should return the customQuestion for average type without period - Which is your daily average consumption on the last week ?', async () => {
@@ -413,20 +401,9 @@ describe('Quiz service', () => {
       const result = await quizService.getCustomQuestion(mockCustomQuestion, [
         FluidType.ELECTRICITY,
       ])
-      expect(mockGetGraphData).toHaveBeenCalledWith(
-        {
-          startDate: DateTime.fromObject({ year: 2020 }).startOf('year'),
-          endDate: DateTime.fromObject({ year: 2020 }).endOf('year'),
-        },
-        TimeStep.MONTH,
-        [FluidType.ELECTRICITY],
-        undefined,
-        undefined,
-        true
-      )
       expect(result).toEqual(expected)
     })
-    it('should return the customQuestion for average type with weekday period - Which is your monthly average consumption on wednesday ?', async () => {
+    it('should return the customQuestion for average type with weekday period - Which is your monthly average consumption on Wednesday ?', async () => {
       localSpy.mockReturnValue(
         DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc' })
       )
@@ -460,7 +437,7 @@ describe('Quiz service', () => {
       ])
       expect(result).toEqual(expected)
     })
-    it('should return the customQuestion for average type with weekday period and singleFluid - Which is your monthly average consumption of #fluid in #unit on wednesday ?', async () => {
+    it('should return the customQuestion for average type with weekday period and singleFluid - Which is your monthly average consumption of #fluid in #unit on Wednesday ?', async () => {
       localSpy.mockReturnValue(
         DateTime.fromISO('2020-10-03T00:00:00.000Z', { zone: 'utc' })
       )
diff --git a/src/services/quiz.service.ts b/src/services/quiz.service.ts
index 26271500527efae3b6cb4a890b3983a3673a7db7..cde3563d4bdb3933e542bce3c37a1b666864a2dd 100644
--- a/src/services/quiz.service.ts
+++ b/src/services/quiz.service.ts
@@ -1,4 +1,4 @@
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import { QUIZ_DOCTYPE } from 'doctypes'
 import {
   CustomQuestionType,
@@ -36,10 +36,10 @@ export default class QuizService {
    * Retrieve all quiz entities from db
    */
   public async getAllQuizEntities(): Promise<QuizEntity[]> {
-    const query: QueryDefinition = Q(QUIZ_DOCTYPE)
-    const { data: quizs }: QueryResult<QuizEntity[]> =
+    const query = Q(QUIZ_DOCTYPE)
+    const { data: quizzes }: QueryResult<QuizEntity[]> =
       await this._client.query(query)
-    return quizs
+    return quizzes
   }
 
   /**
@@ -47,9 +47,7 @@ export default class QuizService {
    * @param {string} quizId - ID of the searched quiz
    */
   public async getQuizEntityById(quizId: string): Promise<QuizEntity> {
-    const query: QueryDefinition = Q(QUIZ_DOCTYPE)
-      .where({ _id: quizId })
-      .limitBy(1)
+    const query = Q(QUIZ_DOCTYPE).where({ _id: quizId }).limitBy(1)
     const { data }: QueryResult<QuizEntity[]> = await this._client.query(query)
     return data?.[0]
   }
@@ -74,7 +72,7 @@ export default class QuizService {
    * @param {QuizEntity[]} quizEntityList - userQuiz to update
    * @param {string} searchId - userQuiz to update
    */
-  public getUserQuizfromQuizEntities(
+  public getUserQuizFromQuizEntities(
     quizEntityList: QuizEntity[],
     searchId: string
   ): UserQuiz {
@@ -99,7 +97,7 @@ export default class QuizService {
         entity => entity.id === searchId
       )
       if (quizEntityIndex >= 0) {
-        const quizEntity: QuizEntity = quizEntityList[quizEntityIndex]
+        const quizEntity = quizEntityList[quizEntityIndex]
         quiz = this.parseQuizEntityToUserQuiz(quizEntity)
       }
     }
@@ -137,12 +135,12 @@ export default class QuizService {
     const userQuestions: UserQuestion[] = []
 
     quiz.questions.forEach(question => {
-      const userQuestion: UserQuestion =
-        this.parseQuestionEntityToQuestion(question)
+      const userQuestion = this.parseQuestionEntityToQuestion(question)
       userQuestions.push(userQuestion)
     })
-    const userCustomQuestion: UserCustomQuestion =
-      this.parseCustomQuestionEntityToCustomQuestion(quiz.customQuestion)
+    const userCustomQuestion = this.parseCustomQuestionEntityToCustomQuestion(
+      quiz.customQuestion
+    )
 
     const userQuiz: UserQuiz = {
       id: quiz.id,
@@ -163,7 +161,7 @@ export default class QuizService {
    * Return quiz with updated state to UserQuizState.ONGOING and randomize question and answers
    * @param {UserQuiz} userQuiz - userQuiz to update
    */
-  public async startUserQuiz(userQuiz: UserQuiz): Promise<UserQuiz> {
+  public startUserQuiz(userQuiz: UserQuiz): UserQuiz {
     const questions = userQuiz.questions.map(question => ({
       ...question,
       answers: shuffle(question.answers),
@@ -182,13 +180,11 @@ export default class QuizService {
    * Return quiz with updated state to UserQuizState.UNLOCKED and updated questions with false result
    * @param {UserQuiz} userQuiz - userQuiz to update
    */
-  public async resetUserQuiz(userQuiz: UserQuiz): Promise<UserQuiz> {
-    const updatedQuestions: UserQuestion[] = userQuiz.questions.map(
-      question => ({
-        ...question,
-        result: UserQuestionState.UNLOCKED,
-      })
-    )
+  public resetUserQuiz(userQuiz: UserQuiz): UserQuiz {
+    const updatedQuestions = userQuiz.questions.map(question => ({
+      ...question,
+      result: UserQuestionState.UNLOCKED,
+    }))
     const updatedCustomQuestion = {
       ...userQuiz.customQuestion,
       result: UserQuestionState.UNLOCKED,
@@ -206,26 +202,25 @@ export default class QuizService {
    * Return quiz with updated state to UserQuizState.DONE
    * @param {UserQuiz} userQuiz - userQuiz to update
    */
-  public async endUserQuiz(userQuiz: UserQuiz): Promise<UserQuiz> {
-    const updatedUserQuiz: UserQuiz = {
+  public endUserQuiz(userQuiz: UserQuiz): UserQuiz {
+    return {
       ...userQuiz,
       state: UserQuizState.DONE,
     }
-    return updatedUserQuiz
   }
 
   /**
    * Return quiz with result and updated question or customQuestion if no index is passed
    * @param {UserQuiz} userQuiz - userQuiz to update
    */
-  public async updateUserQuiz(
+  public updateUserQuiz(
     userQuiz: UserQuiz,
     questionResult: boolean,
     questionIndex?: number
-  ): Promise<UserQuiz> {
+  ): UserQuiz {
     const result = questionResult
       ? UserQuestionState.CORRECT
-      : UserQuestionState.UNCORRECT
+      : UserQuestionState.INCORRECT
 
     const updatedQuestions = userQuiz.questions.map((question, index) => {
       if (index === questionIndex) {
@@ -265,12 +260,12 @@ export default class QuizService {
     let answers: Answer[]
     const explanation =
       'Vous pouvez vérifier cette information sur l’écran Conso.'
-    const finalInterval: TimePeriod = this.getTimePeriodFromInterval(
+    const finalInterval = this.getTimePeriodFromInterval(
       customQuestionEntity.interval,
       customQuestionEntity.period.weekday ? {} : customQuestionEntity.period
     )
-    let useFluidTypes: FluidType[] = fluidTypes
-    let questionLabel: string = customQuestionEntity.questionLabel
+    let useFluidTypes = fluidTypes
+    let questionLabel = customQuestionEntity.questionLabel
     let unit = '€'
     if (customQuestionEntity.singleFluid === true) {
       let unitLabel = 'kWh'
@@ -295,27 +290,26 @@ export default class QuizService {
     }
     if (customQuestionEntity.type === CustomQuestionType.DATE) {
       // Interval
-      const intervalAsnwer = await this.getMaxLoadOnLastInterval(
+      const intervalAnswer = await this.getMaxLoadOnLastInterval(
         customQuestionEntity.timeStep,
         finalInterval,
         useFluidTypes
       )
       answers = this.getAnswersForInterval(
-        intervalAsnwer.date,
+        intervalAnswer.date,
         customQuestionEntity.timeStep,
         finalInterval
       )
     } else if (customQuestionEntity.type === CustomQuestionType.MAXDATA) {
       // Max data
       const consumptionService = new ConsumptionDataManager(this._client)
-      let maxLoad = await consumptionService.getMaxLoad(
-        finalInterval,
-        customQuestionEntity.timeStep,
-        useFluidTypes,
-        undefined,
-        !customQuestionEntity.singleFluid
-      )
-      maxLoad = maxLoad === null ? 0 : maxLoad
+      let maxLoad = await consumptionService.getMaxLoad({
+        maxTimePeriod: finalInterval,
+        timeStep: customQuestionEntity.timeStep,
+        fluidTypes: useFluidTypes,
+        isHome: !customQuestionEntity.singleFluid,
+      })
+      maxLoad = maxLoad ?? 0
       answers = this.getAnswersForNumberValue(maxLoad as number, unit)
     } else {
       // average
@@ -353,6 +347,10 @@ export default class QuizService {
     let endTime = today
     const isPeriod = Object.keys(period).length !== 0
     switch (interval) {
+      case TimeStep.HALF_AN_HOUR:
+      case TimeStep.HOUR:
+      case TimeStep.DAY:
+        throw new Error('Unexpected time step')
       case TimeStep.WEEK:
         startTime = isPeriod
           ? DateTime.fromObject(period).startOf('week')
@@ -393,19 +391,19 @@ export default class QuizService {
   private async getMaxLoadOnLastInterval(
     timeStep: TimeStep,
     interval: TimePeriod,
-    fluidType: FluidType[]
+    fluidTypes: FluidType[]
   ): Promise<IntervalAnswer> {
-    let dateMax: DateTime = DateTime.local().setZone('utc', {
+    let dateMax = DateTime.local().setZone('utc', {
       keepLocalTime: true,
     })
     let max = 0
     const consumptionService = new ConsumptionDataManager(this._client)
     const limit = { date: interval.startDate, reached: false }
-    let graphData = await consumptionService.getGraphData(
-      interval,
+    let graphData = await consumptionService.getGraphData({
+      timePeriod: interval,
       timeStep,
-      fluidType
-    )
+      fluidTypes,
+    })
     if (graphData?.actualData) {
       max = Math.max(...graphData.actualData.map(d => d.value))
 
@@ -426,11 +424,11 @@ export default class QuizService {
           newInterval.startDate = newInterval.startDate.minus(objectTimeStep)
           newInterval.endDate = newInterval.endDate.minus(objectTimeStep)
           limit.date = newInterval.startDate
-          graphData = await consumptionService.getGraphData(
-            newInterval,
+          graphData = await consumptionService.getGraphData({
+            timePeriod: newInterval,
             timeStep,
-            fluidType
-          )
+            fluidTypes: fluidTypes,
+          })
 
           if (limit.date < DateTime.now().minus({ year: 5 })) {
             limit.reached = true
@@ -454,11 +452,11 @@ export default class QuizService {
             })
             .startOf('month'),
         }
-        graphData = await consumptionService.getGraphData(
-          newInterval,
+        graphData = await consumptionService.getGraphData({
+          timePeriod: newInterval,
           timeStep,
-          fluidType
-        )
+          fluidTypes: fluidTypes,
+        })
       }
       if (graphData?.actualData) {
         max = Math.max(...graphData.actualData.map(d => d.value))
@@ -477,20 +475,18 @@ export default class QuizService {
   private async getAverageOnGivenPeriod(
     timeStep: TimeStep,
     interval: TimePeriod,
-    fluidType: FluidType[],
+    fluidTypes: FluidType[],
     weekday: number | undefined,
     singleFluid: boolean
   ): Promise<number> {
     const consumptionService = new ConsumptionDataManager(this._client)
-    logApp.info('GetAverageOnGivenPeriod is about to call getgraphdata')
-    const graphData = await consumptionService.getGraphData(
-      interval,
+    logApp.info('GetAverageOnGivenPeriod is about to call getGraphData')
+    const graphData = await consumptionService.getGraphData({
+      timePeriod: interval,
       timeStep,
-      fluidType,
-      undefined,
-      undefined,
-      !singleFluid
-    )
+      fluidTypes,
+      isHome: !singleFluid,
+    })
     let average = 0
     if (graphData?.actualData) {
       let total = 0
diff --git a/src/services/terms.service.ts b/src/services/terms.service.ts
index 778405b3f809f071e167f7106df99d6f35649c8d..2e33732d5e035c07d1c0b91176217bcafdbaa9c5 100644
--- a/src/services/terms.service.ts
+++ b/src/services/terms.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import { TERMS_DOCTYPE } from 'doctypes'
 import { DateTime } from 'luxon'
@@ -18,7 +18,7 @@ export default class TermsService {
    * Gets the last term doctype
    */
   public async getLastTerm(): Promise<Term> {
-    const query: QueryDefinition = Q(TERMS_DOCTYPE)
+    const query = Q(TERMS_DOCTYPE)
       .where({})
       .indexFields(['acceptedAt'])
       .sortBy([{ acceptedAt: 'desc' }])
@@ -31,7 +31,7 @@ export default class TermsService {
 
   /** Checks if the last term has been accepted by user */
   public async isLastTermValidated(): Promise<boolean> {
-    const query: QueryDefinition = Q(TERMS_DOCTYPE)
+    const query = Q(TERMS_DOCTYPE)
       .where({})
       .indexFields(['acceptedAt'])
       .sortBy([{ acceptedAt: 'desc' }])
@@ -52,8 +52,8 @@ export default class TermsService {
   public async getTermsVersionType(): Promise<VersionType> {
     const lastTerm = await this.getLastTerm()
     if (lastTerm) {
-      const splittedLastVersion: string[] = lastTerm.version.split('.')
-      const splittedConfVersion: string[] = config.termsVersion.split('.')
+      const splittedLastVersion = lastTerm.version.split('.')
+      const splittedConfVersion = config.termsVersion.split('.')
       if (
         splittedLastVersion[0] === splittedConfVersion[0] &&
         (splittedLastVersion[1] !== splittedConfVersion[1] ||
diff --git a/src/services/timePeriod.service.spec.ts b/src/services/timePeriod.service.spec.ts
index abc6455fb1c27f99e61c5091ffd234a929f2193e..674c75a36f5084a0e8f95df6014af39915a25f83 100644
--- a/src/services/timePeriod.service.spec.ts
+++ b/src/services/timePeriod.service.spec.ts
@@ -263,7 +263,7 @@ describe('timePeriod service', () => {
           zone: 'utc',
         }),
       }
-      const error = await getError(async () =>
+      const error = await getError(() =>
         timePeriodService.getComparisonTimePeriod(timePeriod, unknownTimeStep)
       )
       expect(error).toEqual(new Error('TimeStep unknown'))
@@ -322,7 +322,7 @@ describe('timePeriod service', () => {
       expect(result).toEqual(expectedDate)
     })
     it('should return an error because of unknown TimeStep', async () => {
-      const error = await getError(async () =>
+      const error = await getError(() =>
         timePeriodService.getLastDayOfCompletePeriod(
           randomDate,
           unknownTimeStep
@@ -384,7 +384,7 @@ describe('timePeriod service', () => {
       expect(result).toEqual(expectedDate)
     })
     it('should return unknown timestep', async () => {
-      const error = await getError(async () =>
+      const error = await getError(() =>
         timePeriodService.getLastDayOfTimePeriod(randomDate, unknownTimeStep)
       )
       expect(error).toEqual(new Error('TimeStep unknown'))
@@ -443,7 +443,7 @@ describe('timePeriod service', () => {
       expect(result).toEqual(expectedDate)
     })
     it('should return the date of the last day of current period', async () => {
-      const error = await getError(async () =>
+      const error = await getError(() =>
         timePeriodService.getStartDateFromEndDateByTimeStep(
           randomDate,
           unknownTimeStep
diff --git a/src/services/timePeriod.service.ts b/src/services/timePeriod.service.ts
index 46804b2e55b687df5c0352d75c20e87dc7655979..263b793784686d92e266e29b34c58186c01c57df 100644
--- a/src/services/timePeriod.service.ts
+++ b/src/services/timePeriod.service.ts
@@ -27,11 +27,11 @@ export default class TimePeriodService {
         timeStep
       ).endOf('day')
 
-    const timePeriod: TimePeriod = this.getLastCompletePeriod(
+    const timePeriod = this.getLastCompletePeriod(
       lastDayOfCompletePeriod,
       timeStep
     )
-    const comparisonTimePeriod: TimePeriod = this.getComparisonTimePeriod(
+    const comparisonTimePeriod = this.getComparisonTimePeriod(
       timePeriod,
       timeStep
     )
@@ -194,7 +194,7 @@ export default class TimePeriodService {
     lastDay: DateTime,
     timeStep: TimeStep
   ): TimePeriod {
-    // calculate last day of the tobe coimpleted period
+    // calculate last day of the to be completed period
     const lastCompleteTimePeriod = {
       startDate: this.getStartDateFromEndDateByTimeStep(lastDay, timeStep),
       endDate: lastDay,
diff --git a/src/services/triggers.service.ts b/src/services/triggers.service.ts
index 5e363dbe5a34b8324a398a3532f8de596ab8e877..39fd600215bdcbb9dbb019fd77c2c1246dca33d6 100644
--- a/src/services/triggers.service.ts
+++ b/src/services/triggers.service.ts
@@ -1,5 +1,5 @@
 import * as Sentry from '@sentry/react'
-import { Client, Q, QueryDefinition, QueryResult } from 'cozy-client'
+import { Client, Q, QueryResult } from 'cozy-client'
 import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers'
 import { buildAttributes } from 'cozy-harvest-lib/dist/helpers/triggers'
 import logger from 'cozy-logger'
@@ -50,7 +50,7 @@ export default class TriggerService {
     account: Account,
     konnector: Konnector
   ): Promise<Trigger | null> {
-    const query: QueryDefinition = Q(TRIGGERS_DOCTYPE)
+    const query = Q(TRIGGERS_DOCTYPE)
       .where({
         'message.account': account._id,
         'message.konnector': konnector.slug,
@@ -64,7 +64,7 @@ export default class TriggerService {
   }
 
   public async getTriggerForAccount(account: Account): Promise<Trigger | null> {
-    const query: QueryDefinition = Q(TRIGGERS_DOCTYPE)
+    const query = Q(TRIGGERS_DOCTYPE)
       .where({
         'message.account': account._id,
         'message.konnector': account.account_type,
diff --git a/src/services/usageEvent.service.ts b/src/services/usageEvent.service.ts
index 5f971c83c9f93048118d01adc3ce1370fdd084a6..390d4c654141d48e41263e4336d17605b245fadb 100644
--- a/src/services/usageEvent.service.ts
+++ b/src/services/usageEvent.service.ts
@@ -1,11 +1,5 @@
 import * as Sentry from '@sentry/react'
-import {
-  Client,
-  MongoSelector,
-  Q,
-  QueryDefinition,
-  QueryResult,
-} from 'cozy-client'
+import { Client, MongoSelector, Q, QueryResult } from 'cozy-client'
 import logger from 'cozy-logger'
 import { USAGEEVENT_DOCTYPE } from 'doctypes'
 import { DateTime } from 'luxon'
@@ -93,16 +87,14 @@ export default class UsageEventService {
     filterParams: MongoSelector,
     desc = false
   ): Promise<UsageEvent[]> {
-    const query: QueryDefinition = Q(USAGEEVENT_DOCTYPE)
+    const query = Q(USAGEEVENT_DOCTYPE)
       .where(filterParams)
       .sortBy([{ eventDate: desc ? 'desc' : 'asc' }])
     const { data: usageEventEntities }: QueryResult<UsageEventEntity[]> =
       await client.query(query)
-    const usageEvents: UsageEvent[] = usageEventEntities.map(
-      (usageEventEntity: UsageEventEntity) => {
-        return this.parseUsageEventEntityToUsageEvent(usageEventEntity)
-      }
-    )
+    const usageEvents = usageEventEntities.map(usageEventEntity => {
+      return this.parseUsageEventEntityToUsageEvent(usageEventEntity)
+    })
     return usageEvents
   }
 
diff --git a/src/store/analysis/analysis.slice.spec.ts b/src/store/analysis/analysis.slice.spec.ts
index 8e8ac488ee08b829a2b2493d8b5ccc9fb20bb851..cfa64383ba5aea45ec3a75e69385264a731dc6a6 100644
--- a/src/store/analysis/analysis.slice.spec.ts
+++ b/src/store/analysis/analysis.slice.spec.ts
@@ -1,12 +1,15 @@
 import { DateTime } from 'luxon'
 import { mockAnalysisState } from 'tests/__mocks__/store'
-import { analysisSlice, setAnalysisMonth, setPeriod } from './analysis.slice'
+import {
+  analysisSlice,
+  setAnalysisMonth,
+  setHaveSeenNewsletterReminder,
+  setPeriod,
+} from './analysis.slice'
 
 describe('analysis reducer', () => {
   it('should return the initial state', () => {
-    const initialState = analysisSlice.reducer(undefined, {
-      type: undefined,
-    })
+    const initialState = analysisSlice.getInitialState()
     expect(initialState).toEqual({
       ...mockAnalysisState,
       analysisMonth: DateTime.local().minus({ months: 1 }).startOf('day'),
@@ -35,4 +38,17 @@ describe('analysis reducer', () => {
       })
     })
   })
+
+  describe('setHaveSeenNewsletterReminder', () => {
+    it('should handle setHaveSeenNewsletterReminder', () => {
+      const state = analysisSlice.reducer(
+        mockAnalysisState,
+        setHaveSeenNewsletterReminder(true)
+      )
+      expect(state).toEqual({
+        ...mockAnalysisState,
+        haveSeenNewsletterReminder: true,
+      })
+    })
+  })
 })
diff --git a/src/store/analysis/analysis.slice.ts b/src/store/analysis/analysis.slice.ts
index 11eabac17c89f295762c5bf02b5ecdc10c45a866..bc2b12deaa4e8a66d411e52983409fcafd9c3d81 100644
--- a/src/store/analysis/analysis.slice.ts
+++ b/src/store/analysis/analysis.slice.ts
@@ -5,6 +5,7 @@ import { AnalysisState } from 'models'
 const initialState: AnalysisState = {
   period: 'month',
   analysisMonth: DateTime.local().minus({ months: 1 }).startOf('day'),
+  haveSeenNewsletterReminder: false,
 }
 
 export const analysisSlice = createSlice({
@@ -17,7 +18,11 @@ export const analysisSlice = createSlice({
     setAnalysisMonth: (state, action: PayloadAction<DateTime>) => {
       state.analysisMonth = action.payload
     },
+    setHaveSeenNewsletterReminder: (state, action: PayloadAction<boolean>) => {
+      state.haveSeenNewsletterReminder = action.payload
+    },
   },
 })
 
-export const { setPeriod, setAnalysisMonth } = analysisSlice.actions
+export const { setPeriod, setAnalysisMonth, setHaveSeenNewsletterReminder } =
+  analysisSlice.actions
diff --git a/src/store/challenge/challenge.slice.spec.ts b/src/store/challenge/challenge.slice.spec.ts
index f4a265cdf615264845e93d98099247311b8e174f..600a19afaaa9d4e2626032eed5b09dbb52450eb8 100644
--- a/src/store/challenge/challenge.slice.spec.ts
+++ b/src/store/challenge/challenge.slice.spec.ts
@@ -16,7 +16,7 @@ import {
 
 describe('challenge reducer', () => {
   it('should return the initial state', () => {
-    const state = challengeSlice.reducer(undefined, { type: undefined })
+    const state = challengeSlice.getInitialState()
     expect(state).toEqual(mockChallengeState)
   })
 
diff --git a/src/store/chart/chart.slice.spec.ts b/src/store/chart/chart.slice.spec.ts
index 02f68b6399afa66dbb82ff070c10dc8d082dbdb1..c585209bde367a574c33fc32d2f28a181a912160 100644
--- a/src/store/chart/chart.slice.spec.ts
+++ b/src/store/chart/chart.slice.spec.ts
@@ -15,12 +15,12 @@ import {
 
 describe('chart reducer', () => {
   it('should return the initial state', () => {
-    const initialState = chartSlice.reducer(undefined, { type: undefined })
+    const initialState = chartSlice.getInitialState()
     expect(initialState).toEqual(mockChartState)
   })
 
   it('should return same state if no action', () => {
-    const state = chartSlice.reducer(mockChartState, { type: undefined })
+    const state = chartSlice.getInitialState()
     expect(state).toEqual(mockChartState)
   })
 
diff --git a/src/store/global/global.slice.spec.ts b/src/store/global/global.slice.spec.ts
index 3df92c909f3204595518c0ae66e6a7d913b0e440..608bd5f10bea23a3d71d01804987cc4fced1e287 100644
--- a/src/store/global/global.slice.spec.ts
+++ b/src/store/global/global.slice.spec.ts
@@ -2,7 +2,6 @@
 import { FluidSlugType, FluidState, FluidType, ScreenType, Usage } from 'enums'
 import { DateTime } from 'luxon'
 import { FluidStatus, PartnersInfo, TermsStatus } from 'models'
-import { SgeStore } from 'models/sgeStore.model'
 import { accountsData } from 'tests/__mocks__/accountsData.mock'
 import { konnectorsData } from 'tests/__mocks__/konnectorsData.mock'
 import { mockGlobalState } from 'tests/__mocks__/store'
@@ -22,7 +21,6 @@ import {
   toggleChallengeExplorationNotification,
   updateEcogestureFilter,
   updateFluidConnection,
-  updateSgeStore,
   updateTermsStatus,
 } from './global.slice'
 
@@ -100,7 +98,7 @@ const fluidStatus: FluidStatus[] = [
 
 describe('globalSlice', () => {
   it('should return the initial state', () => {
-    const initialState = globalSlice.reducer(undefined, { type: undefined })
+    const initialState = globalSlice.getInitialState()
     expect(initialState).toEqual(mockGlobalState)
   })
 
@@ -232,28 +230,6 @@ describe('globalSlice', () => {
       shouldRefreshConsent: true,
     })
   })
-  it('should handle setSgeConnect', () => {
-    const expectedSgeConnect: SgeStore = {
-      address: 'address',
-      city: 'city',
-      currentStep: 1,
-      dataConsent: true,
-      firstName: 'firstName',
-      lastName: 'lastName',
-      pdl: 12345678901234,
-      pdlConfirm: true,
-      shouldLaunchAccount: true,
-      zipCode: 99999,
-    }
-    const state = globalSlice.reducer(
-      mockGlobalState,
-      updateSgeStore(expectedSgeConnect)
-    )
-    expect(state).toEqual({
-      ...mockGlobalState,
-      sgeConnect: expectedSgeConnect,
-    })
-  })
   it('should handle updateFluidConnection', () => {
     const state = globalSlice.reducer(
       mockGlobalState,
diff --git a/src/store/global/global.slice.ts b/src/store/global/global.slice.ts
index f93aada9ec5f5ef8d0d77b340694d312f902b06b..9b6acdedb6b4b9376eff0c602bd303fb7e3ef3db 100644
--- a/src/store/global/global.slice.ts
+++ b/src/store/global/global.slice.ts
@@ -7,7 +7,6 @@ import {
   GlobalState,
   Notes,
   PartnersInfo,
-  SgeStore,
   TermsStatus,
 } from 'models'
 
@@ -107,18 +106,6 @@ const initialState: GlobalState = {
     notification_activated: false,
   },
   shouldRefreshConsent: false,
-  sgeConnect: {
-    currentStep: 0,
-    firstName: '',
-    lastName: '',
-    pdl: null,
-    address: '',
-    zipCode: null,
-    city: '',
-    dataConsent: false,
-    pdlConfirm: false,
-    shouldLaunchAccount: false,
-  },
   ecogestureFilter: Usage.ALL,
   lastEpglLogin: '',
 }
@@ -208,9 +195,6 @@ export const globalSlice = createSlice({
     setLastEpglLogin: (state, action: PayloadAction<string>) => {
       state.lastEpglLogin = action.payload
     },
-    updateSgeStore: (state, action: PayloadAction<SgeStore>) => {
-      state.sgeConnect = action.payload
-    },
     updateEcogestureFilter: (state, action: PayloadAction<Usage>) => {
       state.ecogestureFilter = action.payload
     },
@@ -231,6 +215,5 @@ export const {
   toggleChallengeExplorationNotification,
   updateEcogestureFilter,
   updateFluidConnection,
-  updateSgeStore,
   updateTermsStatus,
 } = globalSlice.actions
diff --git a/src/store/hooks.ts b/src/store/hooks.ts
index 21a319209c0bc26aa1d502d3593373536345c336..66ed0295e1ad4153f9da32070c9b220fd381c8d5 100644
--- a/src/store/hooks.ts
+++ b/src/store/hooks.ts
@@ -1,9 +1,9 @@
 // eslint-disable-next-line @typescript-eslint/no-restricted-imports
-import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
+import { useDispatch, useSelector } from 'react-redux'
 import { AppDispatch, AppState } from './store'
 
 // Typed hooks
 // https://redux.js.org/tutorials/typescript-quick-start#define-typed-hooks
 
-export const useAppDispatch: () => AppDispatch = useDispatch
-export const useAppSelector: TypedUseSelectorHook<AppState> = useSelector
+export const useAppDispatch = useDispatch.withTypes<AppDispatch>()
+export const useAppSelector = useSelector.withTypes<AppState>()
diff --git a/src/store/modal/modal.slice.spec.ts b/src/store/modal/modal.slice.spec.ts
index 3ff8dd684ed589fb048e37ba1bbecc078be2f3e4..83ba110aaa2edb55dc195239edbf03503764a1c9 100644
--- a/src/store/modal/modal.slice.spec.ts
+++ b/src/store/modal/modal.slice.spec.ts
@@ -10,7 +10,7 @@ import {
 
 describe('modal reducer', () => {
   it('should return the initial state', () => {
-    const initialState = modalSlice.reducer(undefined, { type: undefined })
+    const initialState = modalSlice.getInitialState()
     expect(initialState).toEqual(mockModalState)
   })
 
@@ -31,9 +31,7 @@ describe('modal reducer', () => {
       grdf: true,
     }
     it('should have all partners to false by default', () => {
-      const state = modalSlice.reducer(mockModalState, {
-        type: undefined,
-      })
+      const state = modalSlice.getInitialState()
       const expectedResult: ModalState = {
         ...mockModalState,
         partnersIssueModal: {
diff --git a/src/store/profile/profile.slice.spec.ts b/src/store/profile/profile.slice.spec.ts
index aca5f4bbd7aec52404cfa22fcbd3c0cf01e80732..eb1e2b65c9ff4be2cf6e1e56763675da6fe67eb6 100644
--- a/src/store/profile/profile.slice.spec.ts
+++ b/src/store/profile/profile.slice.spec.ts
@@ -3,9 +3,7 @@ import { profileSlice } from './profile.slice'
 
 describe('profile slice', () => {
   it('should return the initial state', () => {
-    const initialState = profileSlice.reducer(undefined, {
-      type: undefined,
-    })
+    const initialState = profileSlice.getInitialState()
     expect(initialState).toEqual(mockProfileState)
   })
 })
diff --git a/src/store/profile/profile.slice.ts b/src/store/profile/profile.slice.ts
index c2d5c3a5c3539b51bef2219bbfeda08974125b1c..876c44ab3b453e0a3307c40086c2f3cdfe9476fc 100644
--- a/src/store/profile/profile.slice.ts
+++ b/src/store/profile/profile.slice.ts
@@ -32,6 +32,7 @@ const initialState: Profile = {
   }),
   haveSeenLastAnalysis: true,
   sendAnalysisNotification: true,
+  isAnalysisReminderEnabled: false,
   sendConsumptionAlert: false,
   waterDailyConsumptionLimit: 0,
   mailToken: '',
diff --git a/src/store/profileEcogesture/profileEcogesture.slice.spec.ts b/src/store/profileEcogesture/profileEcogesture.slice.spec.ts
index 290c69278fd2419c3f13b74c406c84e742c92115..6eedc284fa1c3c9fceeb07af1bf0b502dba82744 100644
--- a/src/store/profileEcogesture/profileEcogesture.slice.spec.ts
+++ b/src/store/profileEcogesture/profileEcogesture.slice.spec.ts
@@ -6,9 +6,7 @@ import { profileEcogestureSlice } from './profileEcogesture.slice'
 
 describe('profileEcogesture slice', () => {
   it('should return the initial state', () => {
-    const initialState = profileEcogestureSlice.reducer(undefined, {
-      type: undefined,
-    })
+    const initialState = profileEcogestureSlice.getInitialState()
     expect(initialState).toEqual(mockProfileEcogesture)
   })
 
diff --git a/src/store/profileType/profileType.slice.spec.ts b/src/store/profileType/profileType.slice.spec.ts
index d359df254235ff64b45bfb2e7ea14daf509740ea..1b0f2500a20c294283d7b4c958d20a81e69de70f 100644
--- a/src/store/profileType/profileType.slice.spec.ts
+++ b/src/store/profileType/profileType.slice.spec.ts
@@ -18,9 +18,7 @@ import { profileTypeSlice, setProfileType } from './profileType.slice'
 
 describe('profileType reducer', () => {
   it('should return the initial state', () => {
-    const initialState = profileTypeSlice.reducer(undefined, {
-      type: undefined,
-    })
+    const initialState = profileTypeSlice.getInitialState()
     expect(initialState).toEqual(mockProfileTypeState)
   })
 
diff --git a/src/store/store.ts b/src/store/store.ts
index 3348dcf8f15bd1514dbc12ae164d0c4355077756..a9a184c31ed787e2a75937f9f703f8d0e8ad6b7f 100644
--- a/src/store/store.ts
+++ b/src/store/store.ts
@@ -61,19 +61,26 @@ const ecolyo = combineReducers({
 })
 
 /** setupStore function to configure redux store taking an extra argument 'client' */
-export const setupStore = (client: Client) => {
+export const setupStore = (
+  client: Client,
+  preloadedState?: Partial<AppState>
+) => {
   const store = configureStore({
     reducer: {
       cozy: client.reducer(),
       ecolyo,
     },
+    preloadedState,
     middleware: getDefaultMiddleware =>
       getDefaultMiddleware({
-        serializableCheck: false,
         thunk: { extraArgument: { client } },
+        serializableCheck: false,
       }),
     devTools: true,
-    enhancers: [sentryReduxEnhancer],
+    enhancers: getDefaultEnhancers =>
+      getDefaultEnhancers({
+        autoBatch: { type: 'tick' },
+      }).concat(sentryReduxEnhancer),
   })
 
   return store
diff --git a/src/styles/base/_breakpoint.scss b/src/styles/base/_breakpoint.scss
index 8cb5481971e6fc83c49d89160890c19a7a36eefd..b4e493995f710e64e8ce03ad01c14c027ab1f885 100644
--- a/src/styles/base/_breakpoint.scss
+++ b/src/styles/base/_breakpoint.scss
@@ -5,6 +5,8 @@ $width-tablet: 1023px;
 $width-desktop: 1200px;
 $width-large-desktop: 1201px;
 
+$height-small-phone: 667px;
+
 $small-phone: 'only screen and (max-width : #{$width-small-phone})';
 $phone: 'only screen and (max-width : #{$width-phone})';
 $large-phone: 'only screen and (max-width : #{$width-large-phone})';
diff --git a/src/styles/base/_color.scss b/src/styles/base/_color.scss
index b27f6f4409913063e2a68024e365ce5e0a8a950f..eb1e924e65d8dc58dc725ae5a2c9f8a39346a0d8 100644
--- a/src/styles/base/_color.scss
+++ b/src/styles/base/_color.scss
@@ -43,6 +43,7 @@ $blue-radial-gradient-transparent: radial-gradient(
   rgba(255, 255, 255, 0) 100%
 );
 $blue-grey: #bfcce4;
+$blue-accessibility: #1b8bff;
 
 /** GREEN **/
 $green: #7fd771;
diff --git a/src/styles/base/_mixins.scss b/src/styles/base/_mixins.scss
index bb10dab58b0eb7169ac10ae24f17ff7de2661842..51dd2d1253bdd7c0af9c173fb2865ce3d7059185 100644
--- a/src/styles/base/_mixins.scss
+++ b/src/styles/base/_mixins.scss
@@ -20,46 +20,3 @@
   }
   transition: all 150ms ease-in-out;
 }
-
-@mixin checkBox($foreground, $background) {
-  width: 24px;
-  min-width: 24px;
-  height: 24px;
-  display: flex;
-  align-items: center;
-  border-radius: 4px;
-
-  cursor: pointer;
-  appearance: none;
-  background: $background;
-  position: relative;
-  border: solid 1px $grey-dark;
-
-  &:checked {
-    background: $foreground;
-    border-color: $foreground;
-    // Custom check mark
-    &:before,
-    &:after {
-      content: '';
-      position: absolute;
-      display: inline-block;
-      background: $dark-light-2;
-      border-radius: 0.5rem;
-    }
-    &:before {
-      width: 3px;
-      height: 12px;
-      left: 10px;
-      top: 4px;
-      transform: rotate(41deg);
-    }
-    &:after {
-      width: 3px;
-      height: 6px;
-      left: 5px;
-      top: 8px;
-      transform: rotate(133deg);
-    }
-  }
-}
diff --git a/src/styles/base/_typography.scss b/src/styles/base/_typography.scss
index a0a743fb893995f6081059ed136c91c9bd35de1f..3a97f7fe47e59b2d3613fed7a546137ba4cdf574 100644
--- a/src/styles/base/_typography.scss
+++ b/src/styles/base/_typography.scss
@@ -13,7 +13,6 @@ h4,
 h5,
 h6,
 p {
-  color: $soft-grey;
   font-family: $text-font;
 }
 
@@ -36,7 +35,9 @@ p {
   text-align: center;
   letter-spacing: 0.15px;
   color: $grey-bright;
-  text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);
+  text-shadow:
+    0px -1px 0px #060609,
+    0px 1px 0px rgba(255, 255, 255, 0.07);
 }
 
 @each $name, $size in $text-size {
@@ -131,13 +132,3 @@ p {
     font-size: 0.75rem;
   }
 }
-
-/* Cozy bar */
-.cozybar {
-  font-family: $text-font;
-  font-style: normal;
-  font-weight: bold;
-  font-size: 1.3125rem;
-  line-height: 120%;
-  color: $grey-bright;
-}
diff --git a/src/styles/base/_z-index.scss b/src/styles/base/_z-index.scss
index 17a5dea8e7482596a2e437d272f293d7242f99c8..4fe88ba947f1a029c8575b439f51614140cc465f 100644
--- a/src/styles/base/_z-index.scss
+++ b/src/styles/base/_z-index.scss
@@ -3,3 +3,4 @@ $z-pieChart: 5;
 $z-dialog: 10;
 $z-header: 18;
 $z-splash: 1500;
+$skip-link: 1000001;
diff --git a/src/styles/components/_barchart.scss b/src/styles/components/_barchart.scss
index 16fdf31cd70c22b952979b857ebfb9a3cb0b342d..3ce54187b6ba08978c2553a292b8c5f1f9ddd7e3 100644
--- a/src/styles/components/_barchart.scss
+++ b/src/styles/components/_barchart.scss
@@ -165,6 +165,15 @@
     filter: drop-shadow(0 -0.1rem 0.2rem $multi-color);
   }
 }
+
+.barValue {
+  outline: none;
+  &:focus-visible {
+    outline: 2px solid $blue-accessibility;
+    outline-offset: 2px;
+  }
+}
+
 /** Animation **/
 .bounce-1 {
   animation-name: bounce-1;
@@ -222,27 +231,6 @@
   }
 }
 
-.bounce-3 {
-  animation-name: bounce-3;
-  animation-timing-function: cubic-bezier(1, 1, 0.42, 1);
-  animation-iteration-count: 1;
-  transform-origin: bottom center;
-}
-@keyframes bounce-3 {
-  0% {
-    opacity: 0.6;
-    transform: scaleY(1);
-  }
-  50% {
-    transform: scaleY(1.1);
-    opacity: 0.8;
-  }
-  100% {
-    transform: scaleY(1);
-    opacity: 1;
-  }
-}
-
 /** Animation delay **/
 .delay {
   animation-duration: 0.4s;
diff --git a/src/styles/components/_buttons.scss b/src/styles/components/_buttons.scss
index 3a8f0feb4ef0b737d97fb2f0daf824056364274b..c3cfc4fff498721495f1ecf7b1334eb8e518cfe3 100644
--- a/src/styles/components/_buttons.scss
+++ b/src/styles/components/_buttons.scss
@@ -6,6 +6,10 @@ button {
     font-size: 1rem;
     font-weight: 700;
   }
+  &:focus-visible {
+    outline: 2px solid $blue-accessibility;
+    outline-offset: 2px;
+  }
 
   &.btnPrimary {
     @include button($dark-light-2, transparent, $multi-color-radial-gradient) {
@@ -18,8 +22,8 @@ button {
   }
 
   &.btnText {
-    text-decoration: underline;
     span {
+      text-decoration: underline;
       text-transform: none;
       font-weight: 400;
     }
diff --git a/src/styles/components/_expansion-panel.scss b/src/styles/components/_expansion-panel.scss
index b7a3fd566b52189d24f81ab8b24ebe03cdaadb56..5fa2f1df183a45ca61f5e9416630db0b325ae68e 100644
--- a/src/styles/components/_expansion-panel.scss
+++ b/src/styles/components/_expansion-panel.scss
@@ -26,6 +26,10 @@ div.expansion-panel-summary {
     background-color: unset;
     box-shadow: 0 0 0 1px $grey-bright;
   }
+  &:focus-visible {
+    outline: 2px solid $blue-accessibility;
+    outline-offset: 2px;
+  }
   &.Mui-expanded {
     min-height: 4rem;
     &.small {
diff --git a/src/styles/components/_input.scss b/src/styles/components/_input.scss
index 66759a556b309fc6956a2b95c0b855c390379449..5342054c9ba1a936d584480313336931ee5d67ba 100644
--- a/src/styles/components/_input.scss
+++ b/src/styles/components/_input.scss
@@ -9,11 +9,6 @@ input.inputNumber {
   background: transparent;
   transition: all 300ms ease;
   color: $grey-bright;
-  &:focus,
-  &:focus-visible {
-    border-color: $gold-shadow;
-    outline: none;
-  }
 }
 
 input.inputText {
@@ -33,6 +28,7 @@ input.inputNumber {
   text-align: center;
 }
 
-input.inputCheckbox {
-  @include checkBox($gold-shadow, $dark-light-2);
+input:focus-visible {
+  outline: 2px solid $blue-accessibility;
+  outline-offset: 2px;
 }
diff --git a/src/styles/components/_link.scss b/src/styles/components/_link.scss
index c3331e239bc9a2bace876c6fc809ad76e3f6a68a..077d3c00763e25795f573f513b6fc3517f7c2886 100644
--- a/src/styles/components/_link.scss
+++ b/src/styles/components/_link.scss
@@ -13,6 +13,10 @@ a:focus {
     box-shadow: 0 0 0 1px $grey-bright;
   }
 }
+a:focus-visible {
+  outline: 2px solid $blue-accessibility;
+  outline-offset: 2px;
+}
 a.MuiLink-underlineHover:hover {
   text-decoration: none;
 }
diff --git a/src/styles/index.scss b/src/styles/index.scss
index b0eaaab45d4fe6daf09d9c927721c53c023d98da..d1f1147728ad6c04df17e831508b26766b8176fa 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -52,6 +52,10 @@
   --elecColorRadialGradient: #{$elec-color-radial-gradient};
   --gasColorRadialGradient: #{$gas-color-radial-gradient};
   --waterColorRadialGradient: #{$water-color-radial-gradient};
+
+  // Override Cozy UI colors
+  --paperBackgroundColor: $dark-2;
+  --primaryTextColor: $grey-bright;
 }
 
 .application {
@@ -75,6 +79,7 @@
   justify-content: center;
   // useful when text is rendered with loader
   align-items: center;
+  background-color: transparent;
 }
 
 // devtools button
diff --git a/src/targets/browser/index.ejs b/src/targets/browser/index.ejs
index ee85e8ba084bdce2227a5426926788879554db44..b2711492a810f395bfa216dd018dea595b8a998f 100644
--- a/src/targets/browser/index.ejs
+++ b/src/targets/browser/index.ejs
@@ -21,6 +21,7 @@
     <!-- PWA Colors -->
     <meta name="theme-color" content="#343641" />
     <meta name="background-color" content="#121212" />
+    <meta name="color-scheme" content="only dark" />
 
     <% _.forEach(htmlWebpackPlugin.files.css, function(file) { %>
         <link rel="stylesheet" href="<%- file %>">
diff --git a/src/targets/browser/index.tsx b/src/targets/browser/index.tsx
index 9e9cde5363be93509e43daa58fc5576d2d344c6a..bd485a74445e679f0c9728b0b2bb3c8376f6d102 100644
--- a/src/targets/browser/index.tsx
+++ b/src/targets/browser/index.tsx
@@ -5,13 +5,14 @@ declare let __PIWIK_SITEID__: number
 declare let __SENTRY_DSN__: string
 declare let Piwik: any
 
+import { ThemeProvider } from '@material-ui/core'
 import * as Sentry from '@sentry/react'
-import { BrowserTracing } from '@sentry/tracing'
+import { theme } from 'components/theme'
 import CozyClient, { Client, CozyProvider } from 'cozy-client'
 import { isFlagshipApp } from 'cozy-device-helper'
 import { handleOAuthResponse } from 'cozy-harvest-lib/dist/helpers/oauth'
 import { WebviewIntentProvider } from 'cozy-intent'
-import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n'
+import { I18n, initTranslation } from 'cozy-ui/transpiled/react/providers/I18n'
 import schema from 'doctypes'
 import { createHashHistory } from 'history'
 import { memoize } from 'lodash'
@@ -79,7 +80,7 @@ const setupApp = memoize(() => {
   !isLocal &&
     Sentry.init({
       dsn: __SENTRY_DSN__,
-      integrations: [new BrowserTracing()],
+      integrations: [Sentry.browserTracingIntegration()],
       // Set tracesSampleRate to 1.0 to capture 100%
       // of transactions for performance monitoring.
       // We recommend adjusting this value in production
@@ -109,7 +110,9 @@ const init = () => {
         <CozyProvider client={client}>
           <I18n lang={locale} polyglot={polyglot}>
             <HashRouter {...history}>
-              <App tracker={tracker} />
+              <ThemeProvider theme={theme}>
+                <App tracker={tracker} />
+              </ThemeProvider>
             </HashRouter>
           </I18n>
         </CozyProvider>
diff --git a/src/targets/public/index.ejs b/src/targets/public/index.ejs
index 6a02d8eded146705720414f370c649dc892cb194..359ee7568dd51f01a7faf607cd516c9fd51a5c50 100644
--- a/src/targets/public/index.ejs
+++ b/src/targets/public/index.ejs
@@ -17,6 +17,7 @@
     <!-- PWA Colors -->
     <meta name="theme-color" content="#343641" />
     <meta name="background-color" content="#121212" />
+    <meta name="color-scheme" content="only dark" />
 
     <% _.forEach(htmlWebpackPlugin.files.css, function(file) { %>
         <link rel="stylesheet" href="<%- file %>">
diff --git a/src/targets/public/index.tsx b/src/targets/public/index.tsx
index 294a37fb174f66b2c2747e92b9ef5c22ec51a1f2..8478e85e16b2d179dcea305e470af9f5218dbf83 100644
--- a/src/targets/public/index.tsx
+++ b/src/targets/public/index.tsx
@@ -3,12 +3,11 @@
 declare let __SENTRY_DSN__: string
 
 import * as Sentry from '@sentry/react'
-import { BrowserTracing } from '@sentry/tracing'
 import Unsubscribe from 'components/Options/Unsubscribe/Unsubscribe'
 import CozyClient, { Client, CozyProvider } from 'cozy-client'
 import { isFlagshipApp } from 'cozy-device-helper'
 import { WebviewIntentProvider } from 'cozy-intent'
-import { I18n, initTranslation } from 'cozy-ui/transpiled/react/I18n'
+import { I18n, initTranslation } from 'cozy-ui/transpiled/react/providers/I18n'
 import schema from 'doctypes'
 import { memoize } from 'lodash'
 import React from 'react'
@@ -63,7 +62,7 @@ const setupApp = memoize(() => {
   !isLocal &&
     Sentry.init({
       dsn: __SENTRY_DSN__,
-      integrations: [new BrowserTracing()],
+      integrations: [Sentry.browserTracingIntegration()],
       // Set tracesSampleRate to 1.0 to capture 100%
       // of transactions for performance monitoring.
       // We recommend adjusting this value in production
diff --git a/src/targets/services/aggregatorUsageEvents.ts b/src/targets/services/aggregatorUsageEvents.ts
index 36beffe25a1f122a126fba16ff2bdab6f2dd8120..1ae6a70fe449ab7404249e68bd44b4e80770a35f 100644
--- a/src/targets/services/aggregatorUsageEvents.ts
+++ b/src/targets/services/aggregatorUsageEvents.ts
@@ -231,7 +231,7 @@ const buildProfileWithFluidType = async (
 
 const getConsumptionValue = async (
   client: Client,
-  fluidType: FluidType[]
+  fluidTypes: FluidType[]
 ): Promise<PerformanceIndicator[]> => {
   const consumptionService = new ConsumptionService(client)
   const analysisDate = DateTime.local().setZone('utc', { keepLocalTime: true })
@@ -249,7 +249,7 @@ const getConsumptionValue = async (
     await consumptionService.getPerformanceIndicators(
       periods.timePeriod,
       TimeStep.MONTH,
-      fluidType,
+      fluidTypes,
       periods.comparisonTimePeriod
     )
   return fetchedPerformanceIndicators
diff --git a/src/targets/services/consumptionAlert.ts b/src/targets/services/consumptionAlert.ts
index 496b83c3596b712b97f7d5449464086b69401478..1dc6b33128e4c9dcebfaece7a8e9a1387fcc3ab0 100644
--- a/src/targets/services/consumptionAlert.ts
+++ b/src/targets/services/consumptionAlert.ts
@@ -55,7 +55,7 @@ const consumptionAlert = async ({ client }: ConsumptionAlertProps) => {
 
   const fetchedData = await consumptionService.getLastDataload(FluidType.WATER)
   let lastDayValue = 0
-  let alertDay: DateTime = DateTime.local().setZone('utc', {
+  let alertDay = DateTime.local().setZone('utc', {
     keepLocalTime: true,
   })
 
diff --git a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts
index 84b034a1e87c1b557436d2f4195e8e1a6aeb39a8..b356f516c539ad34c3f5cb6a2d51a20e1ae6fb4d 100644
--- a/src/targets/services/enedisHalfHourMonthlyAnalysis.ts
+++ b/src/targets/services/enedisHalfHourMonthlyAnalysis.ts
@@ -136,9 +136,11 @@ const getEnedisMonthAnalysisData = async (
     endDate: DateTime.fromObject({ month: month, year: year }).endOf('month'),
   }
   const cs = new ConsumptionService(client)
-  const data = await cs.getGraphData(timePeriod, TimeStep.DAY, [
-    FluidType.ELECTRICITY,
-  ])
+  const data = await cs.getGraphData({
+    timePeriod,
+    timeStep: TimeStep.DAY,
+    fluidTypes: [FluidType.ELECTRICITY],
+  })
   const monthlyAveragesLoads: EnedisMonthlyAnalysisData = {
     weekDaysHalfHourAverageValues: [],
     weekEndDaysHalfHourAverageValues: [],
@@ -160,11 +162,11 @@ const getEnedisMonthAnalysisData = async (
       }
       // for each day, we get its halfHour DataChart
       // so we get 48 entries per day
-      const halfHourDayData = await cs.getGraphData(
+      const halfHourDayData = await cs.getGraphData({
         timePeriod,
-        TimeStep.HALF_AN_HOUR,
-        [FluidType.ELECTRICITY]
-      )
+        timeStep: TimeStep.HALF_AN_HOUR,
+        fluidTypes: [FluidType.ELECTRICITY],
+      })
       if (halfHourDayData) {
         populateArrayWithTotalData(weekEndValuesArray, halfHourDayData, true)
         populateArrayWithTotalData(weekValuesArray, halfHourDayData, false)
@@ -183,21 +185,21 @@ const getEnedisMonthAnalysisData = async (
       arr.reduce((a, b) => a + b, 0) / arr.length
     // at this point we have an array of sums for each 48 half hour timestep
     // so we calculate the average
-    const weekEndAverages: number[] = weekEndValuesArray.map(halfHourArray =>
+    const weekEndAverages = weekEndValuesArray.map(halfHourArray =>
       arrAvg(halfHourArray)
     )
     // so we calculate the average
     const weekAverages = weekValuesArray.map(halfHourArray =>
       arrAvg(halfHourArray)
     )
+    const [maxPower, offPeakHoursRatio] = await Promise.all([
+      getMonthMaxPower(month, year, client),
+      getOffPeakHoursRatio(month, year, client),
+    ])
     monthlyAveragesLoads.weekDaysHalfHourAverageValues = weekAverages
     monthlyAveragesLoads.weekEndDaysHalfHourAverageValues = weekEndAverages
-    monthlyAveragesLoads.maxPower = await getMonthMaxPower(month, year, client)
-    monthlyAveragesLoads.offPeakHoursRatio = await getOffPeakHoursRatio(
-      month,
-      year,
-      client
-    )
+    monthlyAveragesLoads.maxPower = maxPower
+    monthlyAveragesLoads.offPeakHoursRatio = offPeakHoursRatio
     return monthlyAveragesLoads
   }
 }
@@ -213,7 +215,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({
     client
   )
   const consumptionService = new ConsumptionService(client)
-  const firstMinuteData = (await consumptionService.getFirsDataDateFromDoctype(
+  const firstMinuteData = (await consumptionService.getFirstDataDateFromDoctype(
     ENEDIS_MINUTE_DOCTYPE
   )) as DataloadEntity[]
 
@@ -236,9 +238,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({
   const today = DateTime.local().setZone('utc', {
     keepLocalTime: true,
   })
-  const analysisDate: DateTime = today.minus({
-    month: 1,
-  })
+  const analysisDate = today.minus({ month: 1 })
 
   const data = await getEnedisMonthAnalysisData(
     client,
@@ -266,7 +266,7 @@ const syncEnedisMonthlyAnalysisDataDoctype = async ({
   if (lastEnedisMonthlyAnalysis.length > 0) {
     // If user has more than one entry (already synced), fetch the full history
     const firstEnedisMonthlyAnalysis =
-      (await consumptionService.getFirsDataDateFromDoctype(
+      (await consumptionService.getFirstDataDateFromDoctype(
         ENEDIS_MONTHLY_ANALYSIS_DATA_DOCTYPE
       )) as EnedisMonthlyAnalysisData[]
     if (
diff --git a/src/targets/services/fluidsPrices.ts b/src/targets/services/fluidsPrices.ts
index 32ad62df05c206c88c1ad0bb145b207b451dae1c..bdb2d51dba1c89d1f305007642977a952941ddda 100644
--- a/src/targets/services/fluidsPrices.ts
+++ b/src/targets/services/fluidsPrices.ts
@@ -1,20 +1,13 @@
-import * as Sentry from '@sentry/react'
 import { Client } from 'cozy-client'
 import logger from 'cozy-logger'
 import {
-  EGL_DAY_DOCTYPE,
-  ENEDIS_DAY_DOCTYPE,
-  GRDF_DAY_DOCTYPE,
   REMOTE_ORG_ECOLYO_AGENT_PRICES,
   REMOTE_ORG_ECOLYO_AGENT_PRICES_REC,
 } from 'doctypes'
-import { FluidType, TimeStep } from 'enums'
-import { DateTime } from 'luxon'
-import { DataloadEntity, FluidPrice, TimePeriod } from 'models'
-import ConsumptionDataManager from 'services/consumption.service'
+import { FluidType } from 'enums'
+import { FluidPrice } from 'models'
 import EnvironmentService from 'services/environment.service'
 import FluidPricesService from 'services/fluidsPrices.service'
-import QueryRunner from 'services/queryRunner.service'
 import { runService } from './service'
 
 const logStack = logger.namespace('fluidPrices')
@@ -33,35 +26,19 @@ const getRemotePricesByFluid = async (
   return prices
 }
 
-/**
- * If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
- */
-function updateFirstEditedPrice(
-  firstEditedPrice: string | null,
-  remotePrice: FluidPrice
-): string {
-  return firstEditedPrice === null || firstEditedPrice >= remotePrice.startDate
-    ? remotePrice.startDate
-    : firstEditedPrice
-}
-
-/**
- * Synchro the remote prices with database and returns a date where we have to relaunch aggregation if a price has been edited in backoffice
- * @returns {string | null} the oldest startDate
- */
-const synchroPricesToUpdate = async (
-  client: Client,
-  fluidType: FluidType
-): Promise<string | null> => {
-  const fps = new FluidPricesService(client)
-  try {
+const updatePrices = async ({ client }: { client: Client }) => {
+  for (const fluidType of [
+    FluidType.ELECTRICITY,
+    FluidType.WATER,
+    FluidType.GAS,
+  ]) {
+    logStack('info', `Updating fluid prices for ${fluidType}...`)
+    const fps = new FluidPricesService(client)
     const remotePrices = await getRemotePricesByFluid(client, fluidType)
-    let firstEditedPrice: string | null = null
     for (const remotePrice of remotePrices) {
       const existingPrice = await fps.checkIfPriceExists(remotePrice)
       if (!existingPrice) {
         logStack('debug', `Price doesn't exist in db, creating a new price`)
-        firstEditedPrice = updateFirstEditedPrice(firstEditedPrice, remotePrice)
         await fps.createPrice(remotePrice)
         continue
       }
@@ -72,7 +49,6 @@ const synchroPricesToUpdate = async (
       }
       logStack('debug', `Price exists in db but not up to date, updating it`)
       // If a price has been updated, set the oldest startDate of the edited price so we can redo aggregation
-      firstEditedPrice = updateFirstEditedPrice(firstEditedPrice, remotePrice)
 
       await fps.updatePrice(existingPrice, {
         price: remotePrice.price,
@@ -80,255 +56,9 @@ const synchroPricesToUpdate = async (
         startDate: remotePrice.startDate,
         endDate: remotePrice.endDate,
       })
-    }
-    return firstEditedPrice
-  } catch (error) {
-    logStack('error', `Error: ${error}`)
-    Sentry.captureException(error)
-    return null
-  }
-}
-
-const price = (item: DataloadEntity): number => {
-  return item.price ? item.price : 0
-}
-
-const sum = (prev: number, next: number): number => {
-  return prev + next
-}
-
-const getTimePeriod = async (
-  timeStep: TimeStep,
-  date: DateTime
-): Promise<TimePeriod> => {
-  switch (timeStep) {
-    case TimeStep.HALF_AN_HOUR:
-      return {
-        startDate: date,
-        endDate: date.plus({ day: 1 }).startOf('day'),
-      }
-    case TimeStep.DAY:
-    case TimeStep.MONTH:
-      return {
-        startDate: date.startOf('month'),
-        endDate: date.endOf('month'),
-      }
-    case TimeStep.YEAR:
-      return {
-        startDate: date.startOf('year'),
-        endDate: date.endOf('year'),
-      }
-    default:
-      logStack('error', 'Unhandled time period')
-      Sentry.captureException(
-        JSON.stringify({ error: 'Unhandled time period' })
-      )
-      throw Error('Unhandled time period')
-  }
-}
-
-const aggregatePrices = async (
-  qr: QueryRunner,
-  cdm: ConsumptionDataManager,
-  firstDate: DateTime,
-  today: DateTime,
-  fluidType: FluidType
-) => {
-  const timeSteps = [TimeStep.MONTH, TimeStep.YEAR]
-  logStack(
-    'debug',
-    `Aggregation started for fluid: ${fluidType}, from ${firstDate}  `
-  )
-  for (const timeStep of timeSteps) {
-    let aggregationDate = DateTime.fromObject({
-      year: firstDate.year,
-      month: firstDate.month,
-      day: firstDate.day,
-    })
-    try {
-      do {
-        const timePeriod = await getTimePeriod(timeStep, aggregationDate)
-        // Get doc for aggregation
-        const dayDocuments = await qr.fetchFluidRawDoctype(
-          timePeriod,
-          TimeStep.DAY,
-          fluidType
-        )
-        const docToUpdate = await qr.fetchFluidRawDoctype(
-          timePeriod,
-          timeStep,
-          fluidType
-        )
-
-        if (docToUpdate?.data && dayDocuments?.data) {
-          docToUpdate.data[0].price = dayDocuments.data.map(price).reduce(sum)
-        }
-        await cdm.saveDocs(docToUpdate?.data)
-        // Update date according to timestep
-        if (timeStep === TimeStep.YEAR) {
-          aggregationDate = aggregationDate.plus({ year: 1 }).startOf('month')
-        } else {
-          aggregationDate = aggregationDate.plus({ month: 1 }).startOf('month')
-        }
-      } while (aggregationDate < today)
-    } catch (error) {
-      logStack('info', `Error : ${error}`)
-      Sentry.captureException(error)
-    }
-  }
-
-  logStack('debug', `Aggregation done`)
-}
-
-const getDoctypeTypeByFluid = (fluidType: FluidType): string => {
-  if (fluidType === FluidType.ELECTRICITY) {
-    return ENEDIS_DAY_DOCTYPE
-  }
-  if (fluidType === FluidType.GAS) {
-    return GRDF_DAY_DOCTYPE
-  }
-  if (fluidType === FluidType.WATER) {
-    return EGL_DAY_DOCTYPE
-  }
-  logStack('error', 'Unknown FluidType')
-  Sentry.captureException({ error: 'Unknown FluidType Doctype' })
-  throw new Error()
-}
-
-const getTimeStepsByFluid = (fluidType: FluidType): TimeStep[] => {
-  if (fluidType === FluidType.ELECTRICITY) {
-    return [TimeStep.DAY, TimeStep.HALF_AN_HOUR]
-  }
-  if (fluidType === FluidType.GAS || fluidType === FluidType.WATER) {
-    return [TimeStep.DAY]
-  }
-  logStack('error', 'Unknown FluidType')
-  Sentry.captureException({ error: 'Unknown FluidType' })
-  throw new Error()
-}
-
-const applyPrices = async (client: Client, fluidType: FluidType) => {
-  // If no doctypes exists, do nothing
-  const fluidsPricesService = new FluidPricesService(client)
-  const cdm = new ConsumptionDataManager(client)
-  const qr = new QueryRunner(client)
-
-  // Synchro db prices with remote prices
-  const firstEditedPriceDate = await synchroPricesToUpdate(client, fluidType)
-  const firstDataDate = await cdm.fetchAllFirstDateData([fluidType])
-  const prices = await fluidsPricesService.getAllPrices()
-
-  if (prices.length === 0) {
-    logStack('info', 'No fluidesPrices data')
-    return
-  }
-  logStack('debug', 'fluidPrices data found')
-  const firstMinuteData = await cdm.getFirstDataDateFromDoctypeWithPrice(
-    getDoctypeTypeByFluid(fluidType)
-  )
-
-  // If there is data, update hourly data and daily data
-  if (
-    !firstDataDate?.[0] ||
-    (!firstMinuteData && firstEditedPriceDate === null)
-  ) {
-    logStack('info', `No data found for fluid ${fluidType}`)
-    return
-  }
-  const today = DateTime.now()
-  const timeSteps = getTimeStepsByFluid(fluidType)
-  let firstDate: DateTime
-
-  if (firstMinuteData && firstEditedPriceDate) {
-    // If there is first data without price and a price edited, set the smallest date
-    const firstMinuteDataDate = DateTime.fromObject({
-      year: firstMinuteData.year,
-      month: firstMinuteData.month,
-      day: firstMinuteData.day,
-    }).setZone('utc', {
-      keepLocalTime: true,
-    })
-    const formattedFirstEditedPrice = DateTime.fromISO(
-      firstEditedPriceDate
-    ).setZone('utc', {
-      keepLocalTime: true,
-    })
-    // we want to exclude the period with no data if the edited date is smaller than the first data date
-    firstDate = DateTime.min(
-      DateTime.max(formattedFirstEditedPrice, firstDataDate[0]),
-      firstMinuteDataDate
-    )
-  } else if (firstMinuteData) {
-    firstDate = DateTime.fromObject({
-      year: firstMinuteData.year,
-      month: firstMinuteData.month,
-      day: firstMinuteData.day,
-    }).setZone('utc', {
-      keepLocalTime: true,
-    })
-  } else if (firstEditedPriceDate) {
-    firstDate = DateTime.max(
-      DateTime.fromISO(firstEditedPriceDate).setZone('utc', {
-        keepLocalTime: true,
-      }),
-      firstDataDate[0]
-    )
-  } else {
-    firstDate = today
-  }
-
-  // Hourly and daily prices
-  for (const timeStep of timeSteps) {
-    let date: DateTime = DateTime.local().setZone('utc', {
-      keepLocalTime: true,
-    })
-    Object.assign(date, firstDate)
-    try {
-      do {
-        const priceData = await fluidsPricesService.getPrices(fluidType, date)
-        const timePeriod = await getTimePeriod(timeStep, date)
-        const data = await qr.fetchFluidRawDoctype(
-          timePeriod,
-          timeStep,
-          fluidType
-        )
-
-        // If lastItem has a price, skip this day (in order to save perf)
-        const lastItem = data?.data && data.data[data.data.length - 1]
-        if (lastItem && priceData) {
-          // if a price has been updated in backoffice re-calculates all price from the firstEditedPriceDate
-          data?.data.forEach((element: DataloadEntity) => {
-            element.price = element.load * priceData.price
-          })
-          await cdm.saveDocs(data.data)
-        }
-        // Update date
-        if (timeStep === TimeStep.HALF_AN_HOUR) {
-          date = date.plus({ days: 1 })
-        } else {
-          date = date.plus({ month: 1 }).startOf('month')
-        }
-      } while (date < today)
-    } catch (error) {
-      logStack('error', `ERROR : ${error} `)
-      Sentry.captureException(error)
+      logStack('info', `Price updated`)
     }
   }
-
-  await aggregatePrices(qr, cdm, firstDate, today, fluidType)
-}
-
-const processPrices = async ({ client }: { client: Client }) => {
-  logStack('info', `Processing electricity data...`)
-  await applyPrices(client, FluidType.ELECTRICITY)
-  logStack('info', `Electricity data done`)
-  logStack('info', `Processing gas data...`)
-  await applyPrices(client, FluidType.GAS)
-  logStack('info', `Gas data done`)
-  logStack('info', `Processing water data...`)
-  await applyPrices(client, FluidType.WATER)
-  logStack('info', `Water data done`)
-  logStack('info', `processPrices done`)
 }
 
-runService(processPrices)
+runService(updatePrices)
diff --git a/src/targets/services/monthlyReportNotification.ts b/src/targets/services/monthlyReportNotification.ts
index 7cb75e4a4ff03ac4b9924b6f562f91e57069fd7b..a89b7c2ca763ed16f06ede878e907e1e922a4424 100644
--- a/src/targets/services/monthlyReportNotification.ts
+++ b/src/targets/services/monthlyReportNotification.ts
@@ -24,11 +24,11 @@ interface MonthlyReportNotificationProps {
 
 /**
  * Get consumption value for all fluid if exist
- * @param fluidType - FluidType
+ * @param fluidTypes - FluidType
  */
 const getConsumptionValue = async (
   client: Client,
-  fluidType: FluidType[],
+  fluidTypes: FluidType[],
   period: 'month' | 'year'
 ): Promise<PerformanceIndicator[]> => {
   const consumptionService = new ConsumptionService(client)
@@ -48,7 +48,7 @@ const getConsumptionValue = async (
   return consumptionService.getPerformanceIndicators(
     timePeriod,
     TimeStep.MONTH,
-    fluidType,
+    fluidTypes,
     comparisonTimePeriod
   )
 }
@@ -204,6 +204,7 @@ const monthlyReportNotification = async ({
 
   logStack('info', 'Creation of mail...')
   const mailService = new MailService()
+  const envService = new EnvironmentService()
 
   const today = DateTime.local().setZone('utc', {
     keepLocalTime: true,
@@ -246,14 +247,16 @@ const monthlyReportNotification = async ({
   const environmentService = new EnvironmentService()
   const baseUrl = environmentService.getPublicURL()
 
+  const comparisonExist =
+    monthComparisonText.length > 0 || yearComparisonText.length > 0
+
   const template = monthlyReportTemplate({
     title: 'Infos & bilan consos',
     baseUrl: baseUrl,
     username: username,
     clientUrl: analysisLink,
     unsubscribeUrl: unsubscribeUrl,
-    comparisonExist:
-      monthComparisonText.length > 0 || yearComparisonText.length > 0,
+    comparisonExist: comparisonExist,
     monthComparisonExist: monthComparisonText.length > 0,
     monthComparisonText: monthComparisonText,
     yearComparisonExist: yearComparisonText.length > 0,
@@ -281,12 +284,14 @@ const monthlyReportNotification = async ({
     previousYear: date.year - 1,
     currentYear: date.year,
     previousMonthYear: date.month === 1 ? date.year - 1 : date.year,
-    consoImageUrl: baseUrl + '/assets/multifluidConsumption.png',
+    consoImageUrl: comparisonExist
+      ? baseUrl + '/assets/multifluidConsumption.png'
+      : baseUrl + '/assets/multifluidNoConsumption.png',
     feedbackImageUrl: baseUrl + '/assets/feedback.png',
   })
 
   const mailData = {
-    mode: 'campaign',
+    mode: envService.isProduction() ? 'campaign' : 'noreply',
     subject: monthlyReport.subject,
     parts: [
       {
diff --git a/src/types/cozy-bar.d.ts b/src/types/cozy-bar.d.ts
index 3eb901e7289677953ae19ac5c6e46180084e538c..d618f5a985178ebda998fe44e9d9636b50274e2d 100644
--- a/src/types/cozy-bar.d.ts
+++ b/src/types/cozy-bar.d.ts
@@ -2,7 +2,7 @@ import { ReactComponentElement } from 'react'
 
 /* eslint-disable @typescript-eslint/no-explicit-any */
 declare module 'cozy-bar' {
-  type TcozyBarInitOpts = {
+  interface TcozyBarInitOpts {
     appName: string
     appNamePrefix: string
     appSlug?: string
diff --git a/src/types/cozy-client.d.ts b/src/types/cozy-client.d.ts
index 8a7d20f28601fcd335b7b332c50fbed2fe9c0795..0e1f45fd6353a22c4e192bcb112dd9be4ad45707 100644
--- a/src/types/cozy-client.d.ts
+++ b/src/types/cozy-client.d.ts
@@ -15,28 +15,30 @@ declare module 'cozy-client' {
   export function useClient(): Client
   export function Q(doctype: TDoctype): QueryDefinition
 
-  export type SortOptions = { [field: string]: 'asc' | 'desc' }
-  export type QueryDefinition = {
+  export interface SortOptions {
+    [field: string]: 'asc' | 'desc'
+  }
+  export interface QueryDefinition {
     checkSortOrder(opts: {
       sort: SortOptions
       selector: unknown
       indexedFields: unknown
     }): QueryDefinition
     getById(id: string): QueryDefinition
-    getByIds(ids: Array<string>): QueryDefinition
-    include(relations: Array<string>): QueryDefinition
-    indexFields(indexedFields: Array<string>): QueryDefinition
+    getByIds(ids: string[]): QueryDefinition
+    include(relations: string[]): QueryDefinition
+    indexFields(indexedFields: string[]): QueryDefinition
     partialIndex(partialFilter: object): QueryDefinition
     limitBy(limit: number): QueryDefinition
     offset(skip: number): QueryDefinition
     offsetBookmark(bookmark: string): QueryDefinition
     offsetCursor(cursor): QueryDefinition
     referencedBy(document: unknown): QueryDefinition
-    select(field: Array<string> | undefined): QueryDefinition
-    sortBy(sort: Array<SortOptions>): QueryDefinition
+    select(field: string[] | undefined): QueryDefinition
+    sortBy(sort: SortOptions[]): QueryDefinition
     where(selector: MongoSelector): QueryDefinition
   }
-  export type QueryResult<T, I = undefined> = {
+  export interface QueryResult<T, I = undefined> {
     bookmark: string
     next: boolean
     meta?: { count: number }
@@ -56,7 +58,7 @@ declare module 'cozy-client' {
   }
   export interface FindQueryOptions {
     bookmark?: string
-    fields?: Array<string>
+    fields?: string[]
     indexId?: string
     limit?: number
     skip?: number
@@ -297,10 +299,7 @@ declare module 'cozy-client' {
      * @param  {Array<Document>} documents - Documents to be hydrated
      * @returns {Array<HydratedDocument>}
      */
-    hydrateDocuments<D>(
-      doctype: TDoctype,
-      documents: Array<D>
-    ): Array<HydratedDocument>
+    hydrateDocuments<D>(doctype: TDoctype, documents: D[]): HydratedDocument[]
 
     /**
      * Resolves relationships on a document.
@@ -317,9 +316,7 @@ declare module 'cozy-client' {
   class CCozyClient {
     constructor(n: unknown): Client
   }
-  const CozyClient: {
-    new (n: unknown): Client
-  } = CCozyClient
+  const CozyClient: new (n: unknown) => Client = CCozyClient
   export default CozyClient
 
   export type HydratedDoc = any
diff --git a/src/types/cozy-ui.d.ts b/src/types/cozy-ui.d.ts
index e45466e6769d12c9dcce14662af7d6754bd4e218..220288b1e8a2cdccfc9c75120872370e09f43f30 100644
--- a/src/types/cozy-ui.d.ts
+++ b/src/types/cozy-ui.d.ts
@@ -3,7 +3,7 @@ declare module 'cozy-ui/transpiled/react/Spinner'
 declare module 'cozy-ui/transpiled/react/Layout'
 declare module 'cozy-ui/transpiled/react/helpers/appDataset'
 
-declare module 'cozy-ui/transpiled/react/I18n' {
+declare module 'cozy-ui/transpiled/react/providers/I18n' {
   interface IPropsIcon {
     icon?: string
     width?: string | number
diff --git a/src/utils/date.spec.ts b/src/utils/date.spec.ts
index 1211870ea45c7af7833c5de84cffd1c79f7aac43..362a95ddd3f19e77f2df83078570cb94b80a1a55 100644
--- a/src/utils/date.spec.ts
+++ b/src/utils/date.spec.ts
@@ -6,6 +6,7 @@ import {
   compareDates,
   convertDateToMonthYearString,
   convertDateToShortDateString,
+  formatDate,
   getActualAnalysisDate,
   getCurrentSeason,
   getLagDays,
@@ -483,4 +484,33 @@ describe('date utils', () => {
       expect(currentSeason).toBeNull()
     })
   })
+
+  describe('formatDate', () => {
+    const date = DateTime.local(2024, 3, 13, 9).setZone('utc', {
+      keepLocalTime: true,
+    })
+    it('should return the correct date format for YEAR', () => {
+      const formattedDate = formatDate(TimeStep.YEAR, date)
+      expect(formattedDate).toEqual(['2024', ''])
+    })
+    it('should return the correct date format for MONTH', () => {
+      const formattedDate = formatDate(TimeStep.MONTH, date)
+      expect(formattedDate).toEqual(['March', '2024'])
+    })
+    it('should return the correct date format for DAY', () => {
+      const formattedDate = formatDate(TimeStep.DAY, date)
+      expect(formattedDate).toEqual(['13 Wednesday', 'March'])
+    })
+    it('should return the correct date format for WEEK', () => {
+      const formattedDate = formatDate(TimeStep.WEEK, date)
+      expect(formattedDate).toEqual(['13 Wednesday', 'March'])
+    })
+    it('should return the correct date format for HALF_AN_HOUR', () => {
+      const formattedDate = formatDate(TimeStep.HALF_AN_HOUR, date)
+      expect(formattedDate).toEqual([
+        '9:00 AM - 9:30 AM',
+        'Wednesday, March 13',
+      ])
+    })
+  })
 })
diff --git a/src/utils/date.ts b/src/utils/date.ts
index 434975bc19903b67813df3b1867bcd20dcfc8940..9468ee8f43ebba8267546b22958443b2f3b43807 100644
--- a/src/utils/date.ts
+++ b/src/utils/date.ts
@@ -189,3 +189,60 @@ export function getOppositeSeason(currentSeason: Season): Season {
     throw new Error('Invalid current season.')
   }
 }
+
+/**
+ * Returns an array of the formatted date. It returns an array for display purposes.
+ */
+export const formatDate = (timeStep: TimeStep, date: DateTime) => {
+  switch (timeStep) {
+    case TimeStep.YEAR:
+      return [
+        date.toLocaleString({
+          year: 'numeric',
+        }),
+        '',
+      ]
+    case TimeStep.MONTH:
+      return [
+        date.toLocaleString({
+          month: 'long',
+        }),
+        date.toLocaleString({
+          year: 'numeric',
+        }),
+      ]
+    case TimeStep.DAY:
+    case TimeStep.WEEK:
+      return [
+        date.toLocaleString({
+          weekday: 'long',
+          day: '2-digit',
+        }),
+        date.toLocaleString({
+          month: 'long',
+        }),
+      ]
+    case TimeStep.HALF_AN_HOUR:
+      /**
+       * Format date to range:
+       * 9:00 - 9:30
+       * Day 0X Month
+       */
+      return [
+        `${date.toLocaleString({
+          hour: 'numeric',
+          minute: 'numeric',
+        })} - ${date.plus({ minutes: 30 }).toLocaleString({
+          hour: 'numeric',
+          minute: 'numeric',
+        })}`,
+        date.toLocaleString({
+          weekday: 'long',
+          day: '2-digit',
+          month: 'long',
+        }),
+      ]
+    default:
+      return [date.toLocaleString(DateTime.DATETIME_SHORT), '']
+  }
+}
diff --git a/src/utils/math.spec.ts b/src/utils/math.spec.ts
index 49e6737cb9eb01790689d293d682c8e45624f8af..e761efc03780ecebc762edbc2c474db3618d06cd 100644
--- a/src/utils/math.spec.ts
+++ b/src/utils/math.spec.ts
@@ -3,8 +3,8 @@ import { getPercentage, sum } from './math'
 describe('math utilis test', () => {
   describe('getPercentage test', () => {
     it('should return the correct percent', () => {
-      const dataA: Array<number> = [1, 2, 3, 4, 5]
-      const dataB: Array<number> = [5, 4, 3]
+      const dataA: number[] = [1, 2, 3, 4, 5]
+      const dataB: number[] = [5, 4, 3]
       const result = getPercentage(dataA, dataB)
       expect(result).toBe(25)
     })
@@ -12,7 +12,7 @@ describe('math utilis test', () => {
 
   describe('sum test', () => {
     it('should return the correct sum', () => {
-      const dataA: Array<number> = [1, 2, 3, 4, 5]
+      const dataA: number[] = [1, 2, 3, 4, 5]
       const result = sum(dataA)
       expect(result).toBe(15)
     })
diff --git a/src/utils/math.ts b/src/utils/math.ts
index ddb43df2a3ee7d52f7723dc1538bc2e744142098..d0664a64f256ac94abe0193e49c75f28edd5bb32 100644
--- a/src/utils/math.ts
+++ b/src/utils/math.ts
@@ -4,12 +4,12 @@ export function getRoundFloat(data: number) {
   return Math.round((data + Number.EPSILON) * 100) / 100
 }
 
-export function getPercentage(dataA: Array<number>, dataB: Array<number>) {
+export function getPercentage(dataA: number[], dataB: number[]) {
   return Math.round(
     Number.parseFloat(((1 - _.mean(dataA) / _.mean(dataB)) * 100).toFixed(2))
   )
 }
 
-export function sum(dataA: Array<number>) {
+export function sum(dataA: number[]) {
   return Number.parseInt(_.sum(dataA))
 }
diff --git a/src/utils/utils.spec.ts b/src/utils/utils.spec.ts
index e36db9b7ba1b1f7afa0529b9a1bca3f8fb6e3a65..6bd4fe0f095a1e5ceb2a332f9d3c5513b9b6a2c6 100644
--- a/src/utils/utils.spec.ts
+++ b/src/utils/utils.spec.ts
@@ -13,8 +13,10 @@ import {
   formatOffPeakHours,
   formatTwoDigits,
   getChallengeTitleWithLineReturn,
+  getFluidLabel,
   getFluidName,
   getFluidTypeTranslation,
+  getFluidUnit,
   getKonnectorSlug,
   getKonnectorUpdateError,
   getMonthFullName,
@@ -261,6 +263,21 @@ describe('utils test', () => {
     })
   })
 
+  describe('getFluidLabel', () => {
+    it('should return elec', () => {
+      expect(getFluidLabel(FluidType.ELECTRICITY)).toBe('elec')
+    })
+    it('should return gas', () => {
+      expect(getFluidLabel(FluidType.GAS)).toBe('gaz')
+    })
+    it('should return water', () => {
+      expect(getFluidLabel(FluidType.WATER)).toBe('water')
+    })
+    it('should return multi', () => {
+      expect(getFluidLabel(FluidType.MULTIFLUID)).toBe('multi')
+    })
+  })
+
   describe('formatListWithAnd', () => {
     it('should return empty string', () => {
       expect(formatListWithAnd([])).toBe('')
@@ -385,4 +402,21 @@ describe('utils test', () => {
       ])
     })
   })
+
+  describe('getFluidUnit', () => {
+    it('should return kWh for ELECTRICITY', () => {
+      expect(getFluidUnit(FluidType.ELECTRICITY)).toBe('kWh')
+    })
+    it('should return L for WATER', () => {
+      expect(getFluidUnit(FluidType.WATER)).toBe('L')
+    })
+    it('should return € for MULTIFLUID', () => {
+      expect(getFluidUnit(FluidType.MULTIFLUID)).toBe('€')
+    })
+    it('should throw error for invalid fluid type', () => {
+      expect(() => getFluidUnit(99 as FluidType.GAS)).toThrow(
+        'unknown fluidtype'
+      )
+    })
+  })
 })
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
index fc5bf7edee928e76d7a0bfbb1fb64decbdda30a3..a2336f765e407f8bdcf6fa63a50f70a6ecf6f6cd 100644
--- a/src/utils/utils.ts
+++ b/src/utils/utils.ts
@@ -64,6 +64,19 @@ export const getPartnerKey = (fluidType: FluidType) => {
   }
 }
 
+export const getFluidLabel = (fluidType: FluidType) => {
+  switch (fluidType) {
+    case FluidType.ELECTRICITY:
+      return 'elec'
+    case FluidType.GAS:
+      return 'gaz'
+    case FluidType.WATER:
+      return 'water'
+    case FluidType.MULTIFLUID:
+      return 'multi'
+  }
+}
+
 export function getKonnectorUpdateError(type: string) {
   switch (type.toUpperCase()) {
     case 'USER_ACTION_NEEDED.OAUTH_OUTDATED':
@@ -232,40 +245,25 @@ export const getMonthNameWithPrep = (date: DateTime) => {
  * @returns Season
  */
 export const getSeason = (): Season => {
-  const currentDate: DateTime = DateTime.local().setZone('utc', {
+  const currentDate = DateTime.local().setZone('utc', {
+    keepLocalTime: true,
+  })
+  const currentYear = currentDate.year
+  const winterStart = DateTime.local(currentYear, 11, 1).setZone('utc', {
+    keepLocalTime: true,
+  })
+  const winterEnd = DateTime.local(currentYear + 1, 3, 1).setZone('utc', {
     keepLocalTime: true,
   })
-  const currentYear: number = currentDate.year
-  const winterStart: DateTime = DateTime.local(currentYear, 11, 1).setZone(
-    'utc',
-    {
-      keepLocalTime: true,
-    }
-  )
-  const winterEnd: DateTime = DateTime.local(currentYear + 1, 3, 1).setZone(
-    'utc',
-    {
-      keepLocalTime: true,
-    }
-  )
 
-  const summerStart: DateTime = DateTime.local(currentYear, 6, 1).setZone(
-    'utc',
-    {
-      keepLocalTime: true,
-    }
-  )
-  const summerEnd: DateTime = DateTime.local(currentYear, 9, 1).setZone('utc', {
+  const summerStart = DateTime.local(currentYear, 6, 1).setZone('utc', {
     keepLocalTime: true,
   })
-  const summerInterval: Interval = Interval.fromDateTimes(
-    summerStart,
-    summerEnd
-  )
-  const winterInterval: Interval = Interval.fromDateTimes(
-    winterStart,
-    winterEnd
-  )
+  const summerEnd = DateTime.local(currentYear, 9, 1).setZone('utc', {
+    keepLocalTime: true,
+  })
+  const summerInterval = Interval.fromDateTimes(summerStart, summerEnd)
+  const winterInterval = Interval.fromDateTimes(winterStart, winterEnd)
 
   if (summerInterval.contains(currentDate)) {
     return Season.SUMMER
@@ -327,7 +325,7 @@ export const formatListWithAnd = (array: string[]) => {
   }
 }
 
-export type OffPeakHours = {
+export interface OffPeakHours {
   start: { hour: number; minute: number }
   end: { hour: number; minute: number }
 }
@@ -472,3 +470,17 @@ export const roundOffPeakHours = (
     end: roundToNearestHalfHour(end.hour, end.minute, true),
   }))
 }
+
+export const getFluidUnit = (fluidType: FluidType) => {
+  switch (fluidType) {
+    case FluidType.ELECTRICITY:
+    case FluidType.GAS:
+      return 'kWh'
+    case FluidType.WATER:
+      return 'L'
+    case FluidType.MULTIFLUID:
+      return '€'
+    default:
+      throw new Error('unknown fluidtype')
+  }
+}
diff --git a/tests/__mocks__/avgTemperature.mock.ts b/tests/__mocks__/avgTemperature.mock.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d50cee3d44528f1648043aa66f05490b3c3c899c
--- /dev/null
+++ b/tests/__mocks__/avgTemperature.mock.ts
@@ -0,0 +1,16 @@
+/* eslint-disable camelcase */
+import { AvgTemperatureResult } from 'models'
+
+export const mockAvgTemperature: AvgTemperatureResult = {
+  fields: ['identifiant', 'average_measurement', 'month'],
+  layer_name: '',
+  nb_results: 1,
+  table_href: '',
+  values: [
+    {
+      average_measurement: 17.6,
+      identifiant: '69123002',
+      month: '2023-05',
+    },
+  ],
+}
diff --git a/tests/__mocks__/client.mock.ts b/tests/__mocks__/client.mock.ts
index f2b7101ee47a8d7a424ac76549ec3a75e3f2b27c..3038b50b81f7106379f92c07f608ba6bd1cd64c4 100644
--- a/tests/__mocks__/client.mock.ts
+++ b/tests/__mocks__/client.mock.ts
@@ -20,6 +20,7 @@ const mockClient = {
   options: {
     uri: 'http://cozy.tools:8080', // NOSONAR
   },
+  reducer: () => ({}),
 } as unknown as jest.Mocked<Client>
 
 export default mockClient
diff --git a/tests/__mocks__/fluidPrice.mock.ts b/tests/__mocks__/fluidPrice.mock.ts
index b93fac787143fc494cb5e6f1b53dcf392aee787b..19ab4a3a379a1a37465860e82b40f84d8b2cc69b 100644
--- a/tests/__mocks__/fluidPrice.mock.ts
+++ b/tests/__mocks__/fluidPrice.mock.ts
@@ -1,5 +1,14 @@
 import { FluidPrice } from 'models'
 
+export const mockFluidPrice: FluidPrice = {
+  _id: 'e8510c85cd44734b58fd2f587200975c',
+  UpdatedAt: '2024-06-26T07:55:06.093Z',
+  endDate: '',
+  fluidType: 0,
+  price: 0.2516,
+  startDate: '2024-02-01T00:00:00Z',
+}
+
 export const fluidPrices: FluidPrice[] = [
   {
     _id: '03045ea1afecc7a86e5443a52e00b07d',
diff --git a/tests/__mocks__/forms.mock.ts b/tests/__mocks__/forms.mock.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9f3f43e67924305e8024b8d7505bb8b084e8b833
--- /dev/null
+++ b/tests/__mocks__/forms.mock.ts
@@ -0,0 +1,14 @@
+import { SgeStore } from 'models'
+
+export const mockSgeState: SgeStore = {
+  address: '',
+  lastName: '',
+  firstName: '',
+  pdl: 0,
+  zipCode: 0,
+  city: '',
+  currentStep: 0,
+  dataConsent: false,
+  shouldLaunchAccount: false,
+  pdlConfirm: false,
+}
diff --git a/tests/__mocks__/profileType.mock.ts b/tests/__mocks__/profileType.mock.ts
index 0ae825f44fc43e4ef3d6596526f180ced47e19ee..5a0c69dc5379ace77c0935f65c821072e9831102 100644
--- a/tests/__mocks__/profileType.mock.ts
+++ b/tests/__mocks__/profileType.mock.ts
@@ -15,8 +15,6 @@ import {
 import { DateTime } from 'luxon'
 import { MonthlyForecast, ProfileType, ProfileTypeAnswer } from 'models'
 
-const IS_LEAP_YEAR = DateTime.now().isInLeapYear
-
 export const profileTypeData: ProfileType = {
   area: '64',
   coldWater: IndividualOrCollective.INDIVIDUAL,
@@ -73,9 +71,9 @@ export const mockMonthElectricSpecificConsumption = 175
 
 export const mockMonthColdWaterConsumption = 4247
 export const mockWaterRawNeeds = 2480
-export const mockWaterSpreadNeeds = IS_LEAP_YEAR ? 2708 : 2701
+export const mockWaterSpreadNeeds = 2708
 export const mockMonthEcsConsumptionOther = 166
-export const mockMonthEcsConsumptionThermo = IS_LEAP_YEAR ? 111 : 110
+export const mockMonthEcsConsumptionThermo = 111
 
 export const mockProfileType1: ProfileType = {
   housingType: HousingType.APARTMENT,
@@ -102,7 +100,7 @@ export const mockProfileType1: ProfileType = {
 // For the month of February
 export const mockMonthConsumption1 = 1174
 
-export const mockMonthEcsConsumption1Solar = IS_LEAP_YEAR ? 135 : 134
+export const mockMonthEcsConsumption1Solar = 135
 
 export const mockProfileType2: ProfileType = {
   housingType: HousingType.INDIVIDUAL_HOUSE,
@@ -164,7 +162,7 @@ export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = {
       },
       fluidType: 0,
       load: 4340,
-      value: 755.16,
+      value: 1091.9,
     },
     {
       detailsMonthlyForecast: {
@@ -176,23 +174,23 @@ export const mockMonthlyForecastJanuaryTestProfile1: MonthlyForecast = {
       },
       fluidType: 1,
       load: 14911,
-      value: 47.566,
+      value: 3751.6,
     },
     {
       detailsMonthlyForecast: {
         coldWaterConsumption: null,
         cookingConsumption: 85,
-        ecsConsumption: IS_LEAP_YEAR ? 291 : 290,
+        ecsConsumption: 291,
         electricSpecificConsumption: null,
         heatingConsumption: null,
       },
       fluidType: 2,
-      load: IS_LEAP_YEAR ? 376 : 375,
-      value: IS_LEAP_YEAR ? 42.15 : 42.038,
+      load: 376,
+      value: 94.602,
     },
   ],
   month: 1,
-  totalValue: IS_LEAP_YEAR ? 844.876 : 844.764,
+  totalValue: 4938.102,
 }
 
 export const mockTestProfile2: ProfileType = {
@@ -224,13 +222,13 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = {
       detailsMonthlyForecast: {
         coldWaterConsumption: null,
         cookingConsumption: 34,
-        ecsConsumption: IS_LEAP_YEAR ? 249 : 248,
+        ecsConsumption: 249,
         electricSpecificConsumption: 151,
         heatingConsumption: 1237,
       },
       fluidType: 0,
-      load: IS_LEAP_YEAR ? 1671 : 1670,
-      value: IS_LEAP_YEAR ? 290.75 : 290.58,
+      load: 1671,
+      value: 420.42,
     },
     {
       detailsMonthlyForecast: {
@@ -242,7 +240,7 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = {
       },
       fluidType: 1,
       load: 8494,
-      value: 27.096,
+      value: 2137.1,
     },
     {
       detailsMonthlyForecast: {
@@ -258,7 +256,7 @@ export const mockMonthlyForecastJanuaryTestProfile2: MonthlyForecast = {
     },
   ],
   month: 1,
-  totalValue: IS_LEAP_YEAR ? 317.846 : 317.676,
+  totalValue: 2557.52,
 }
 
 export const mockTestProfile3: ProfileType = {
@@ -296,7 +294,7 @@ export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = {
       },
       fluidType: 0,
       load: 194,
-      value: 33.756,
+      value: 48.81,
     },
     {
       detailsMonthlyForecast: {
@@ -308,7 +306,7 @@ export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = {
       },
       fluidType: 1,
       load: 8494,
-      value: 27.096,
+      value: 2137.1,
     },
     {
       detailsMonthlyForecast: {
@@ -324,7 +322,7 @@ export const mockMonthlyForecastJanuaryTestProfile3: MonthlyForecast = {
     },
   ],
   month: 1,
-  totalValue: 60.852000000000004,
+  totalValue: 2185.91,
 }
 
 export const mockProfileTypeAnswers: ProfileTypeAnswer[] = [
@@ -437,7 +435,7 @@ export const mockMonthlyForecastJanuaryTest1WithFullArrays: MonthlyForecast = {
       },
       fluidType: 0,
       load: 2745,
-      value: 477.63,
+      value: 690.64,
     },
     {
       detailsMonthlyForecast: {
@@ -449,21 +447,21 @@ export const mockMonthlyForecastJanuaryTest1WithFullArrays: MonthlyForecast = {
       },
       fluidType: 1,
       load: 14911,
-      value: 47.566,
+      value: 3751.6,
     },
     {
       detailsMonthlyForecast: {
         coldWaterConsumption: null,
         cookingConsumption: 85,
-        ecsConsumption: IS_LEAP_YEAR ? 291 : 290,
+        ecsConsumption: 291,
         electricSpecificConsumption: null,
         heatingConsumption: null,
       },
       fluidType: 2,
-      load: IS_LEAP_YEAR ? 376 : 375,
-      value: IS_LEAP_YEAR ? 42.15 : 42.038,
+      load: 376,
+      value: 94.602,
     },
   ],
   month: 1,
-  totalValue: IS_LEAP_YEAR ? 567.346 : 567.234,
+  totalValue: 4536.842,
 }
diff --git a/tests/__mocks__/store/analysis.state.mock.ts b/tests/__mocks__/store/analysis.state.mock.ts
index 9c19d8e1d63b54d0f29d04a84ce2e3004a88ea47..8934561222754098eae6e9f7ff5efab3c62928d2 100644
--- a/tests/__mocks__/store/analysis.state.mock.ts
+++ b/tests/__mocks__/store/analysis.state.mock.ts
@@ -4,4 +4,5 @@ import { AnalysisState } from 'models'
 export const mockAnalysisState: AnalysisState = {
   period: 'month',
   analysisMonth: DateTime.local(2023, 1, 1).startOf('day'),
+  haveSeenNewsletterReminder: false,
 }
diff --git a/tests/__mocks__/store/global.state.mock.ts b/tests/__mocks__/store/global.state.mock.ts
index 3c19efac32e4edefa90cb524f770d0c4d5b496f8..de8407406461bd29b994341b7e5a05f68f72867b 100644
--- a/tests/__mocks__/store/global.state.mock.ts
+++ b/tests/__mocks__/store/global.state.mock.ts
@@ -94,17 +94,5 @@ export const mockGlobalState: GlobalState = {
   ],
   fluidTypes: [],
   shouldRefreshConsent: false,
-  sgeConnect: {
-    address: '',
-    city: '',
-    currentStep: 0,
-    dataConsent: false,
-    firstName: '',
-    lastName: '',
-    pdl: null,
-    pdlConfirm: false,
-    zipCode: null,
-    shouldLaunchAccount: false,
-  },
   ecogestureFilter: Usage.ALL,
 }
diff --git a/tests/__mocks__/store/profile.state.mock.ts b/tests/__mocks__/store/profile.state.mock.ts
index cb896d683d30eddebab0b43fabca149d4a03d035..0f030bbb68454713f8d6fed13657f6fcf923313c 100644
--- a/tests/__mocks__/store/profile.state.mock.ts
+++ b/tests/__mocks__/store/profile.state.mock.ts
@@ -24,6 +24,7 @@ export const mockProfileState: Profile = {
     zone: 'utc',
   }),
   haveSeenLastAnalysis: true,
+  isAnalysisReminderEnabled: false,
   sendConsumptionAlert: false,
   waterDailyConsumptionLimit: 0,
   sendAnalysisNotification: true,
diff --git a/tests/__mocks__/store/store.mock.ts b/tests/__mocks__/store/store.mock.ts
index cc4be7aa4f975f89994702509d0c7fa4095769d7..368816a11bac4e6ebd283be7b8ea29a04a8bfdec 100644
--- a/tests/__mocks__/store/store.mock.ts
+++ b/tests/__mocks__/store/store.mock.ts
@@ -1,7 +1,4 @@
-import { AnyAction } from '@reduxjs/toolkit'
-import configureStore from 'redux-mock-store'
-import thunkMiddleware from 'redux-thunk'
-import { AppState, MockEcolyoState } from 'store/store'
+import { AppState, setupStore } from 'store/store'
 import mockClient from '../client.mock'
 import { mockProfileEcogesture } from '../profileEcogesture.mock'
 import { mockAnalysisState } from './analysis.state.mock'
@@ -23,21 +20,14 @@ export const mockInitialEcolyoState: AppState['ecolyo'] = {
   profileEcogesture: mockProfileEcogesture,
 }
 
-const middlewares = [thunkMiddleware.withExtraArgument({ mockClient })]
-const mockStore = configureStore<
-  { ecolyo: Partial<MockEcolyoState>; cozy: unknown },
-  AnyAction
->(middlewares)
-
 /**
  * Create a mocked Ecolyo store with the default mockInitialEcolyoState
- * @argument state - optional, a partial desired state
+ * @param state - optional, a partial desired state
  */
 export const createMockEcolyoStore = (
-  initialState: Partial<MockEcolyoState> = mockInitialEcolyoState
+  initialState: Partial<AppState['ecolyo']> = mockInitialEcolyoState
 ) => {
-  return mockStore({
-    ecolyo: initialState,
-    cozy: {},
+  return setupStore(mockClient, {
+    ecolyo: { ...mockInitialEcolyoState, ...initialState },
   })
 }
diff --git a/tests/__mocks__/userChallengeData.mock.ts b/tests/__mocks__/userChallengeData.mock.ts
index 3966c3f0b4a98577899f9bcd8f46a4f85dc7f5af..497daa2f0b48e9d65cb4b720cfc0ef430f174883 100644
--- a/tests/__mocks__/userChallengeData.mock.ts
+++ b/tests/__mocks__/userChallengeData.mock.ts
@@ -359,7 +359,7 @@ export const userChallengeExplo4: UserChallenge = {
     fluid_condition: [0],
     progress: 0,
     message_success:
-      'Vous avez dévérrouillé les données électricité à la demi-heure',
+      'Vous avez déverrouillé les données électricité à la demi-heure',
   },
   action: {
     ecogesture: null,
diff --git a/tests/jestLib/setupTests.ts b/tests/jestLib/setupTests.ts
index b321c6bd3e5d68b5fe55ebb9c891e2ea1c32f83a..1efaf4215654cdb0b8516a3f7fafd1fc99944233 100644
--- a/tests/jestLib/setupTests.ts
+++ b/tests/jestLib/setupTests.ts
@@ -4,7 +4,7 @@ require('jest-canvas-mock')
 import '@testing-library/jest-dom'
 import mockClient from 'tests/__mocks__/client.mock'
 
-jest.mock('cozy-ui/transpiled/react/I18n', () => ({
+jest.mock('cozy-ui/transpiled/react/providers/I18n', () => ({
   useI18n: jest.fn(() => ({
     t: (key: string) => key,
   })),
diff --git a/tests/lib/I18n.js b/tests/lib/I18n.js
index 1e6e9d09810c76df4792717f09e17f53d3e1fc12..47eaeeb69747d40b573b1f3d016b133719759f04 100644
--- a/tests/lib/I18n.js
+++ b/tests/lib/I18n.js
@@ -1,6 +1,6 @@
 'use strict'
 
-import { I18n } from 'cozy-ui/react/I18n'
+import { I18n } from 'cozy-ui/react/providers/I18n'
 
 const I18nComponent = new I18n({
   lang: 'en',
diff --git a/tsconfig.json b/tsconfig.json
index 918223a92ae41951a898f2a5c62cdab1262f56d2..3da6f149f974cf63cbdfb2e9f47d8ac224d5756f 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -20,5 +20,5 @@
       "*": ["src/*", "../node_modules/*", "types/*"]
     }
   },
-  "include": ["src/**/*", "tests/**/*"]
+  "include": ["src/**/*", "tests/**/*", "scripts/**/*"]
 }
diff --git a/yarn.lock b/yarn.lock
index b75a633450ecd89e95d838c70496787dad11eb77..6fe2131c1ac227c34caf057233d80dd79c25ed6f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,28 +2,23 @@
 # yarn lockfile v1
 
 
-"@aashutoshrathi/word-wrap@^1.2.3":
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
-  integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
-
-"@adobe/css-tools@^4.3.2":
-  version "4.3.3"
-  resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff"
-  integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==
+"@adobe/css-tools@^4.4.0":
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/@adobe/css-tools/-/css-tools-4.4.0.tgz#728c484f4e10df03d5a3acd0d8adcbbebff8ad63"
+  integrity sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==
 
 "@alloc/types@^1.2.1":
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/@alloc/types/-/types-1.3.0.tgz#904245b8d3260a4b7d8a801c12501968f64fac08"
   integrity sha512-mH7LiFiq9g6rX2tvt1LtwsclfG5hnsmtIfkZiauAGrm1AwXhoRS0sF2WrN9JGN7eV5vFXqNaB0eXZ3IvMsVi9g==
 
-"@ampproject/remapping@^2.1.0":
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
-  integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+"@ampproject/remapping@^2.2.0":
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+  integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
   dependencies:
-    "@jridgewell/gen-mapping" "^0.1.0"
-    "@jridgewell/trace-mapping" "^0.3.9"
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.24"
 
 "@aspnet/signalr-protocol-msgpack@^1.1.0":
   version "1.1.0"
@@ -48,38 +43,19 @@
   dependencies:
     "@babel/highlight" "^7.10.4"
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.8.3":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
-  integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.8.3":
+  version "7.26.2"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85"
+  integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==
   dependencies:
-    "@babel/highlight" "^7.18.6"
-
-"@babel/code-frame@^7.10.4":
-  version "7.24.2"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
-  integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
-  dependencies:
-    "@babel/highlight" "^7.24.2"
+    "@babel/helper-validator-identifier" "^7.25.9"
+    js-tokens "^4.0.0"
     picocolors "^1.0.0"
 
-"@babel/code-frame@^7.22.13":
-  version "7.22.13"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
-  integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
-  dependencies:
-    "@babel/highlight" "^7.22.13"
-    chalk "^2.4.2"
-
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.6.tgz#8b37d24e88e8e21c499d4328db80577d8882fa53"
-  integrity sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==
-
-"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8":
-  version "7.18.8"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d"
-  integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0":
+  version "7.26.2"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e"
+  integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==
 
 "@babel/core@7.10.0":
   version "7.10.0"
@@ -145,495 +121,286 @@
     source-map "^0.5.0"
 
 "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.5":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d"
-  integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==
-  dependencies:
-    "@ampproject/remapping" "^2.1.0"
-    "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.18.6"
-    "@babel/helper-compilation-targets" "^7.18.6"
-    "@babel/helper-module-transforms" "^7.18.6"
-    "@babel/helpers" "^7.18.6"
-    "@babel/parser" "^7.18.6"
-    "@babel/template" "^7.18.6"
-    "@babel/traverse" "^7.18.6"
-    "@babel/types" "^7.18.6"
-    convert-source-map "^1.7.0"
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40"
+  integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==
+  dependencies:
+    "@ampproject/remapping" "^2.2.0"
+    "@babel/code-frame" "^7.26.0"
+    "@babel/generator" "^7.26.0"
+    "@babel/helper-compilation-targets" "^7.25.9"
+    "@babel/helper-module-transforms" "^7.26.0"
+    "@babel/helpers" "^7.26.0"
+    "@babel/parser" "^7.26.0"
+    "@babel/template" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.26.0"
+    convert-source-map "^2.0.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
-    json5 "^2.2.1"
-    semver "^6.3.0"
+    json5 "^2.2.3"
+    semver "^6.3.1"
 
 "@babel/eslint-parser@^7.16.3":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz#255a63796819a97b7578751bb08ab9f2a375a031"
-  integrity sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c"
+  integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==
   dependencies:
-    eslint-scope "^5.1.1"
+    "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
     eslint-visitor-keys "^2.1.0"
-    semver "^6.3.0"
-
-"@babel/generator@^7.10.0", "@babel/generator@^7.23.0":
-  version "7.23.0"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
-  integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
-  dependencies:
-    "@babel/types" "^7.23.0"
-    "@jridgewell/gen-mapping" "^0.3.2"
-    "@jridgewell/trace-mapping" "^0.3.17"
-    jsesc "^2.5.1"
-
-"@babel/generator@^7.16.8", "@babel/generator@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.10.tgz#794f328bfabdcbaf0ebf9bf91b5b57b61fa77a2a"
-  integrity sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==
-  dependencies:
-    "@babel/types" "^7.18.10"
-    "@jridgewell/gen-mapping" "^0.3.2"
-    jsesc "^2.5.1"
+    semver "^6.3.1"
 
-"@babel/generator@^7.18.6", "@babel/generator@^7.2.2":
-  version "7.18.7"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd"
-  integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==
+"@babel/generator@^7.10.0", "@babel/generator@^7.16.8", "@babel/generator@^7.2.2", "@babel/generator@^7.25.9", "@babel/generator@^7.26.0":
+  version "7.26.2"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f"
+  integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==
   dependencies:
-    "@babel/types" "^7.18.7"
-    "@jridgewell/gen-mapping" "^0.3.2"
-    jsesc "^2.5.1"
+    "@babel/parser" "^7.26.2"
+    "@babel/types" "^7.26.0"
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.25"
+    jsesc "^3.0.2"
 
-"@babel/helper-annotate-as-pure@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
-  integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
+"@babel/helper-annotate-as-pure@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4"
+  integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==
   dependencies:
-    "@babel/types" "^7.18.6"
+    "@babel/types" "^7.25.9"
 
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz#f14d640ed1ee9246fb33b8255f08353acfe70e6a"
-  integrity sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9"
+  integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.18.6"
-    "@babel/types" "^7.18.6"
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
 
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96"
-  integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==
+"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875"
+  integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==
   dependencies:
-    "@babel/compat-data" "^7.18.6"
-    "@babel/helper-validator-option" "^7.18.6"
-    browserslist "^4.20.2"
-    semver "^6.3.0"
-
-"@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf"
-  integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==
-  dependencies:
-    "@babel/compat-data" "^7.18.8"
-    "@babel/helper-validator-option" "^7.18.6"
-    browserslist "^4.20.2"
-    semver "^6.3.0"
+    "@babel/compat-data" "^7.25.9"
+    "@babel/helper-validator-option" "^7.25.9"
+    browserslist "^4.24.0"
+    lru-cache "^5.1.1"
+    semver "^6.3.1"
 
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.3.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz#6f15f8459f3b523b39e00a99982e2c040871ed72"
-  integrity sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-function-name" "^7.18.6"
-    "@babel/helper-member-expression-to-functions" "^7.18.6"
-    "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/helper-replace-supers" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-
-"@babel/helper-create-regexp-features-plugin@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c"
-  integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    regexpu-core "^5.1.0"
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.9", "@babel/helper-create-class-features-plugin@^7.3.0":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz#7644147706bb90ff613297d49ed5266bde729f83"
+  integrity sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-member-expression-to-functions" "^7.25.9"
+    "@babel/helper-optimise-call-expression" "^7.25.9"
+    "@babel/helper-replace-supers" "^7.25.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+    semver "^6.3.1"
 
-"@babel/helper-define-polyfill-provider@^0.3.1":
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
-  integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26"
+  integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==
   dependencies:
-    "@babel/helper-compilation-targets" "^7.13.0"
-    "@babel/helper-module-imports" "^7.12.13"
-    "@babel/helper-plugin-utils" "^7.13.0"
-    "@babel/traverse" "^7.13.0"
-    debug "^4.1.1"
-    lodash.debounce "^4.0.8"
-    resolve "^1.14.2"
-    semver "^6.1.2"
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    regexpu-core "^6.1.1"
+    semver "^6.3.1"
 
-"@babel/helper-define-polyfill-provider@^0.3.2":
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073"
-  integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==
+"@babel/helper-define-polyfill-provider@^0.6.2":
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
+  integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
   dependencies:
-    "@babel/helper-compilation-targets" "^7.17.7"
-    "@babel/helper-plugin-utils" "^7.16.7"
+    "@babel/helper-compilation-targets" "^7.22.6"
+    "@babel/helper-plugin-utils" "^7.22.5"
     debug "^4.1.1"
     lodash.debounce "^4.0.8"
     resolve "^1.14.2"
-    semver "^6.1.2"
-
-"@babel/helper-environment-visitor@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7"
-  integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==
 
 "@babel/helper-environment-visitor@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
-  integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
-
-"@babel/helper-environment-visitor@^7.22.20":
-  version "7.22.20"
-  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
-  integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
-
-"@babel/helper-explode-assignable-expression@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
-  integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==
-  dependencies:
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-function-name@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83"
-  integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==
-  dependencies:
-    "@babel/template" "^7.18.6"
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-function-name@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0"
-  integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==
-  dependencies:
-    "@babel/template" "^7.18.6"
-    "@babel/types" "^7.18.9"
-
-"@babel/helper-function-name@^7.23.0":
-  version "7.23.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
-  integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+  version "7.24.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9"
+  integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==
   dependencies:
-    "@babel/template" "^7.22.15"
-    "@babel/types" "^7.23.0"
+    "@babel/types" "^7.24.7"
 
-"@babel/helper-hoist-variables@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
-  integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
-  dependencies:
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-hoist-variables@^7.22.5":
-  version "7.22.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
-  integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+"@babel/helper-member-expression-to-functions@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3"
+  integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==
   dependencies:
-    "@babel/types" "^7.22.5"
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
 
-"@babel/helper-member-expression-to-functions@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz#44802d7d602c285e1692db0bad9396d007be2afc"
-  integrity sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+  integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
   dependencies:
-    "@babel/types" "^7.18.6"
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
 
-"@babel/helper-member-expression-to-functions@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
-  integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
+"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0", "@babel/helper-module-transforms@^7.9.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+  integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
   dependencies:
-    "@babel/types" "^7.18.9"
+    "@babel/helper-module-imports" "^7.25.9"
+    "@babel/helper-validator-identifier" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
 
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
-  integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
-  dependencies:
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712"
-  integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==
-  dependencies:
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-module-imports" "^7.18.6"
-    "@babel/helper-simple-access" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/helper-validator-identifier" "^7.18.6"
-    "@babel/template" "^7.18.6"
-    "@babel/traverse" "^7.18.9"
-    "@babel/types" "^7.18.9"
-
-"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.9.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz#57e3ca669e273d55c3cda55e6ebf552f37f483c8"
-  integrity sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==
-  dependencies:
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-module-imports" "^7.18.6"
-    "@babel/helper-simple-access" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/helper-validator-identifier" "^7.18.6"
-    "@babel/template" "^7.18.6"
-    "@babel/traverse" "^7.18.6"
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-optimise-call-expression@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
-  integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==
+"@babel/helper-optimise-call-expression@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e"
+  integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==
   dependencies:
-    "@babel/types" "^7.18.6"
+    "@babel/types" "^7.25.9"
 
 "@babel/helper-plugin-utils@7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
   integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==
 
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz#9448974dd4fb1d80fefe72e8a0af37809cd30d6d"
-  integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==
-
-"@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f"
-  integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==
-
-"@babel/helper-remap-async-to-generator@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz#fa1f81acd19daee9d73de297c0308783cd3cfc23"
-  integrity sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-wrap-function" "^7.18.6"
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-remap-async-to-generator@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519"
-  integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-wrap-function" "^7.18.9"
-    "@babel/types" "^7.18.9"
-
-"@babel/helper-replace-supers@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz#efedf51cfccea7b7b8c0f00002ab317e7abfe420"
-  integrity sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==
-  dependencies:
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-member-expression-to-functions" "^7.18.6"
-    "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/traverse" "^7.18.6"
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-replace-supers@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6"
-  integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==
-  dependencies:
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-member-expression-to-functions" "^7.18.9"
-    "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/traverse" "^7.18.9"
-    "@babel/types" "^7.18.9"
-
-"@babel/helper-simple-access@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
-  integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
-  dependencies:
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz#7dff00a5320ca4cf63270e5a0eca4b268b7380d9"
-  integrity sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==
-  dependencies:
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818"
-  integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==
-  dependencies:
-    "@babel/types" "^7.18.9"
-
-"@babel/helper-split-export-declaration@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
-  integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
-  dependencies:
-    "@babel/types" "^7.18.6"
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46"
+  integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==
+
+"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92"
+  integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-wrap-function" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+
+"@babel/helper-replace-supers@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz#ba447224798c3da3f8713fc272b145e33da6a5c5"
+  integrity sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.25.9"
+    "@babel/helper-optimise-call-expression" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+
+"@babel/helper-simple-access@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739"
+  integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==
+  dependencies:
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9"
+  integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==
+  dependencies:
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
+
+"@babel/helper-string-parser@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c"
+  integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==
+
+"@babel/helper-validator-identifier@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7"
+  integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==
+
+"@babel/helper-validator-option@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72"
+  integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==
+
+"@babel/helper-wrap-function@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0"
+  integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==
+  dependencies:
+    "@babel/template" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
+    "@babel/types" "^7.25.9"
+
+"@babel/helpers@^7.10.0", "@babel/helpers@^7.16.7", "@babel/helpers@^7.2.0", "@babel/helpers@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4"
+  integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==
+  dependencies:
+    "@babel/template" "^7.25.9"
+    "@babel/types" "^7.26.0"
+
+"@babel/highlight@^7.10.4":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.9.tgz#8141ce68fc73757946f983b343f1231f4691acc6"
+  integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.25.9"
+    chalk "^2.4.2"
+    js-tokens "^4.0.0"
+    picocolors "^1.0.0"
 
-"@babel/helper-split-export-declaration@^7.22.6":
-  version "7.22.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
-  integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.12", "@babel/parser@^7.2.2", "@babel/parser@^7.20.7", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2", "@babel/parser@^7.7.0":
+  version "7.26.2"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11"
+  integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==
   dependencies:
-    "@babel/types" "^7.22.5"
-
-"@babel/helper-string-parser@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
-  integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
-
-"@babel/helper-string-parser@^7.22.5":
-  version "7.22.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
-  integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
-
-"@babel/helper-validator-identifier@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
-  integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
-
-"@babel/helper-validator-identifier@^7.22.20":
-  version "7.22.20"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
-  integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+    "@babel/types" "^7.26.0"
 
-"@babel/helper-validator-option@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
-  integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
-
-"@babel/helper-wrap-function@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz#ec44ea4ad9d8988b90c3e465ba2382f4de81a073"
-  integrity sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==
-  dependencies:
-    "@babel/helper-function-name" "^7.18.6"
-    "@babel/template" "^7.18.6"
-    "@babel/traverse" "^7.18.6"
-    "@babel/types" "^7.18.6"
-
-"@babel/helper-wrap-function@^7.18.9":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.10.tgz#a7fcd3ab9b1be4c9b52cf7d7fdc1e88c2ce93396"
-  integrity sha512-95NLBP59VWdfK2lyLKe6eTMq9xg+yWKzxzxbJ1wcYNi1Auz200+83fMDADjRxBvc2QQor5zja2yTQzXGhk2GtQ==
-  dependencies:
-    "@babel/helper-function-name" "^7.18.9"
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.18.10"
-    "@babel/types" "^7.18.10"
-
-"@babel/helpers@^7.10.0":
-  version "7.23.1"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15"
-  integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==
-  dependencies:
-    "@babel/template" "^7.22.15"
-    "@babel/traverse" "^7.23.0"
-    "@babel/types" "^7.23.0"
-
-"@babel/helpers@^7.16.7":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9"
-  integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==
-  dependencies:
-    "@babel/template" "^7.18.6"
-    "@babel/traverse" "^7.18.9"
-    "@babel/types" "^7.18.9"
-
-"@babel/helpers@^7.18.6", "@babel/helpers@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd"
-  integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe"
+  integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==
   dependencies:
-    "@babel/template" "^7.18.6"
-    "@babel/traverse" "^7.18.6"
-    "@babel/types" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
 
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
-  integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30"
+  integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.18.6"
-    chalk "^2.0.0"
-    js-tokens "^4.0.0"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/highlight@^7.22.13", "@babel/highlight@^7.24.2":
-  version "7.24.2"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
-  integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137"
+  integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.22.20"
-    chalk "^2.4.2"
-    js-tokens "^4.0.0"
-    picocolors "^1.0.0"
-
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.2.2", "@babel/parser@^7.7.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.6.tgz#845338edecad65ebffef058d3be851f1d28a63bc"
-  integrity sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/parser@^7.10.0", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
-  version "7.23.0"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
-  integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
-
-"@babel/parser@^7.16.12", "@babel/parser@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.10.tgz#94b5f8522356e69e8277276adf67ed280c90ecc1"
-  integrity sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==
-
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
-  integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1"
+  integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+    "@babel/plugin-transform-optional-chaining" "^7.25.9"
 
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50"
-  integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e"
+  integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
-    "@babel/plugin-proposal-optional-chaining" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
 
-"@babel/plugin-proposal-async-generator-functions@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952"
-  integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==
+"@babel/plugin-proposal-async-generator-functions@^7.2.0":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
+  integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
   dependencies:
     "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.20.2"
     "@babel/helper-remap-async-to-generator" "^7.18.9"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
 
-"@babel/plugin-proposal-async-generator-functions@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17"
-  integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==
-  dependencies:
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-remap-async-to-generator" "^7.18.6"
-    "@babel/plugin-syntax-async-generators" "^7.8.4"
-
 "@babel/plugin-proposal-class-properties@7.3.0":
   version "7.3.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd"
@@ -642,7 +409,7 @@
     "@babel/helper-create-class-features-plugin" "^7.3.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.18.6":
+"@babel/plugin-proposal-class-properties@^7.16.0":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
   integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -650,32 +417,7 @@
     "@babel/helper-create-class-features-plugin" "^7.18.6"
     "@babel/helper-plugin-utils" "^7.18.6"
 
-"@babel/plugin-proposal-class-static-block@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020"
-  integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-class-static-block" "^7.14.5"
-
-"@babel/plugin-proposal-dynamic-import@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
-  integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-
-"@babel/plugin-proposal-export-namespace-from@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
-  integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-
-"@babel/plugin-proposal-json-strings@^7.18.6", "@babel/plugin-proposal-json-strings@^7.2.0":
+"@babel/plugin-proposal-json-strings@^7.2.0":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
   integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
@@ -683,30 +425,6 @@
     "@babel/helper-plugin-utils" "^7.18.6"
     "@babel/plugin-syntax-json-strings" "^7.8.3"
 
-"@babel/plugin-proposal-logical-assignment-operators@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23"
-  integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
-  integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-
-"@babel/plugin-proposal-numeric-separator@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
-  integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-
 "@babel/plugin-proposal-object-rest-spread@7.3.2":
   version "7.3.2"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz#6d1859882d4d778578e41f82cc5d7bf3d5daf6c1"
@@ -715,29 +433,18 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
 
-"@babel/plugin-proposal-object-rest-spread@^7.16.0", "@babel/plugin-proposal-object-rest-spread@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7"
-  integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
+"@babel/plugin-proposal-object-rest-spread@^7.16.0", "@babel/plugin-proposal-object-rest-spread@^7.3.1":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
+  integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
   dependencies:
-    "@babel/compat-data" "^7.18.8"
-    "@babel/helper-compilation-targets" "^7.18.9"
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/compat-data" "^7.20.5"
+    "@babel/helper-compilation-targets" "^7.20.7"
+    "@babel/helper-plugin-utils" "^7.20.2"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
-    "@babel/plugin-transform-parameters" "^7.18.8"
+    "@babel/plugin-transform-parameters" "^7.20.7"
 
-"@babel/plugin-proposal-object-rest-spread@^7.3.1":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz#ec93bba06bfb3e15ebd7da73e953d84b094d5daf"
-  integrity sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==
-  dependencies:
-    "@babel/compat-data" "^7.18.6"
-    "@babel/helper-compilation-targets" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
-    "@babel/plugin-transform-parameters" "^7.18.6"
-
-"@babel/plugin-proposal-optional-catch-binding@^7.18.6", "@babel/plugin-proposal-optional-catch-binding@^7.2.0":
+"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
   integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
@@ -745,34 +452,12 @@
     "@babel/helper-plugin-utils" "^7.18.6"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
 
-"@babel/plugin-proposal-optional-chaining@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993"
-  integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
-    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-
-"@babel/plugin-proposal-private-methods@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
-  integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
-  dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+  version "7.21.0-placeholder-for-preset-env.2"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+  integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
 
-"@babel/plugin-proposal-private-property-in-object@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503"
-  integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-create-class-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-
-"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.2.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+"@babel/plugin-proposal-unicode-property-regex@^7.2.0":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
   integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
@@ -794,7 +479,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3":
+"@babel/plugin-syntax-class-properties@^7.12.13":
   version "7.12.13"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
   integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
@@ -808,28 +493,21 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.14.5"
 
-"@babel/plugin-syntax-dynamic-import@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
-  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
-  integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+"@babel/plugin-syntax-import-assertions@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f"
+  integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-syntax-import-assertions@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4"
-  integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==
+"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7"
+  integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-syntax-import-meta@^7.8.3":
+"@babel/plugin-syntax-import-meta@^7.10.4":
   version "7.10.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
   integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
@@ -843,14 +521,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0"
-  integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
+"@babel/plugin-syntax-jsx@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290"
+  integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
   version "7.10.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
   integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
@@ -864,7 +542,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
   version "7.10.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
   integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
@@ -899,350 +577,396 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.14.5"
 
-"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+"@babel/plugin-syntax-top-level-await@^7.14.5":
   version "7.14.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
   integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
   dependencies:
     "@babel/helper-plugin-utils" "^7.14.5"
 
-"@babel/plugin-syntax-typescript@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285"
-  integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==
+"@babel/plugin-syntax-typescript@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399"
+  integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-arrow-functions@^7.18.6", "@babel/plugin-transform-arrow-functions@^7.2.0":
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
   version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe"
-  integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+  integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
   dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
     "@babel/helper-plugin-utils" "^7.18.6"
 
-"@babel/plugin-transform-async-to-generator@^7.18.6", "@babel/plugin-transform-async-to-generator@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615"
-  integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==
+"@babel/plugin-transform-arrow-functions@^7.2.0", "@babel/plugin-transform-arrow-functions@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845"
+  integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==
   dependencies:
-    "@babel/helper-module-imports" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-remap-async-to-generator" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-block-scoped-functions@^7.18.6", "@babel/plugin-transform-block-scoped-functions@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8"
-  integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==
+"@babel/plugin-transform-async-generator-functions@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz#1b18530b077d18a407c494eb3d1d72da505283a2"
+  integrity sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-remap-async-to-generator" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
 
-"@babel/plugin-transform-block-scoping@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
-  integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
+"@babel/plugin-transform-async-to-generator@^7.2.0", "@babel/plugin-transform-async-to-generator@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71"
+  integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-module-imports" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-remap-async-to-generator" "^7.25.9"
 
-"@babel/plugin-transform-block-scoping@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz#b5f78318914615397d86a731ef2cc668796a726c"
-  integrity sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==
+"@babel/plugin-transform-block-scoped-functions@^7.2.0", "@babel/plugin-transform-block-scoped-functions@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz#5700691dbd7abb93de300ca7be94203764fce458"
+  integrity sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-classes@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da"
-  integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==
+"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz#c33665e46b06759c93687ca0f84395b80c0473a1"
+  integrity sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-function-name" "^7.18.9"
-    "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/helper-replace-supers" "^7.18.9"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-    globals "^11.1.0"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-classes@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz#3501a8f3f4c7d5697c27a3eedbee71d68312669f"
-  integrity sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==
+"@babel/plugin-transform-class-properties@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f"
+  integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-function-name" "^7.18.6"
-    "@babel/helper-optimise-call-expression" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-replace-supers" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
+    "@babel/helper-create-class-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-class-static-block@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0"
+  integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-classes@^7.2.0", "@babel/plugin-transform-classes@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52"
+  integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-compilation-targets" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-replace-supers" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e"
-  integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==
+"@babel/plugin-transform-computed-properties@^7.2.0", "@babel/plugin-transform-computed-properties@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b"
+  integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/template" "^7.25.9"
 
-"@babel/plugin-transform-computed-properties@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz#5d15eb90e22e69604f3348344c91165c5395d032"
-  integrity sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==
+"@babel/plugin-transform-destructuring@^7.2.0", "@babel/plugin-transform-destructuring@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1"
+  integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-destructuring@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292"
-  integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==
+"@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a"
+  integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-destructuring@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz#a98b0e42c7ffbf5eefcbcf33280430f230895c6f"
-  integrity sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==
+"@babel/plugin-transform-duplicate-keys@^7.2.0", "@babel/plugin-transform-duplicate-keys@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d"
+  integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.4.4":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8"
-  integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31"
+  integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-duplicate-keys@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e"
-  integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==
+"@babel/plugin-transform-dynamic-import@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8"
+  integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-duplicate-keys@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz#e6c94e8cd3c9dd8a88144f7b78ae22975a7ff473"
-  integrity sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==
+"@babel/plugin-transform-exponentiation-operator@^7.2.0", "@babel/plugin-transform-exponentiation-operator@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f"
+  integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-exponentiation-operator@^7.18.6", "@babel/plugin-transform-exponentiation-operator@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd"
-  integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==
+"@babel/plugin-transform-export-namespace-from@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2"
+  integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-for-of@^7.18.8":
-  version "7.18.8"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1"
-  integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==
+"@babel/plugin-transform-for-of@^7.2.0", "@babel/plugin-transform-for-of@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz#4bdc7d42a213397905d89f02350c5267866d5755"
+  integrity sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
 
-"@babel/plugin-transform-for-of@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz#e0fdb813be908e91ccc9ec87b30cc2eabf046f7c"
-  integrity sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==
+"@babel/plugin-transform-function-name@^7.2.0", "@babel/plugin-transform-function-name@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97"
+  integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-compilation-targets" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
 
-"@babel/plugin-transform-function-name@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0"
-  integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==
+"@babel/plugin-transform-json-strings@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660"
+  integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==
   dependencies:
-    "@babel/helper-compilation-targets" "^7.18.9"
-    "@babel/helper-function-name" "^7.18.9"
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-function-name@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz#6a7e4ae2893d336fd1b8f64c9f92276391d0f1b4"
-  integrity sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==
+"@babel/plugin-transform-literals@^7.2.0", "@babel/plugin-transform-literals@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de"
+  integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==
   dependencies:
-    "@babel/helper-compilation-targets" "^7.18.6"
-    "@babel/helper-function-name" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-literals@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc"
-  integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==
+"@babel/plugin-transform-logical-assignment-operators@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7"
+  integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-literals@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz#9d6af353b5209df72960baf4492722d56f39a205"
-  integrity sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==
+"@babel/plugin-transform-member-expression-literals@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de"
+  integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-member-expression-literals@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e"
-  integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==
+"@babel/plugin-transform-modules-amd@^7.2.0", "@babel/plugin-transform-modules-amd@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5"
+  integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-module-transforms" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-modules-amd@^7.18.6", "@babel/plugin-transform-modules-amd@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21"
-  integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
+"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.25.9", "@babel/plugin-transform-modules-commonjs@^7.7.5":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686"
+  integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==
   dependencies:
-    "@babel/helper-module-transforms" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    babel-plugin-dynamic-import-node "^2.3.3"
+    "@babel/helper-module-transforms" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-simple-access" "^7.25.9"
 
-"@babel/plugin-transform-modules-commonjs@^7.18.6", "@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.7.5":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
-  integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
+"@babel/plugin-transform-modules-systemjs@^7.2.0", "@babel/plugin-transform-modules-systemjs@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8"
+  integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-simple-access" "^7.18.6"
-    babel-plugin-dynamic-import-node "^2.3.3"
+    "@babel/helper-module-transforms" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-validator-identifier" "^7.25.9"
+    "@babel/traverse" "^7.25.9"
 
-"@babel/plugin-transform-modules-systemjs@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06"
-  integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==
+"@babel/plugin-transform-modules-umd@^7.2.0", "@babel/plugin-transform-modules-umd@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9"
+  integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.18.6"
-    "@babel/helper-module-transforms" "^7.18.9"
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/helper-validator-identifier" "^7.18.6"
-    babel-plugin-dynamic-import-node "^2.3.3"
+    "@babel/helper-module-transforms" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-modules-systemjs@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz#026511b7657d63bf5d4cf2fd4aeb963139914a54"
-  integrity sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a"
+  integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.18.6"
-    "@babel/helper-module-transforms" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-validator-identifier" "^7.18.6"
-    babel-plugin-dynamic-import-node "^2.3.3"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-modules-umd@^7.18.6", "@babel/plugin-transform-modules-umd@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9"
-  integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==
+"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd"
+  integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==
   dependencies:
-    "@babel/helper-module-transforms" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6", "@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d"
-  integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz#bcb1b0d9e948168102d5f7104375ca21c3266949"
+  integrity sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8"
-  integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==
+"@babel/plugin-transform-numeric-separator@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1"
+  integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-object-super@^7.18.6", "@babel/plugin-transform-object-super@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c"
-  integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==
+"@babel/plugin-transform-object-rest-spread@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18"
+  integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-replace-supers" "^7.18.6"
+    "@babel/helper-compilation-targets" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/plugin-transform-parameters" "^7.25.9"
 
-"@babel/plugin-transform-parameters@^7.18.6", "@babel/plugin-transform-parameters@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz#cbe03d5a4c6385dd756034ac1baa63c04beab8dc"
-  integrity sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==
+"@babel/plugin-transform-object-super@^7.2.0", "@babel/plugin-transform-object-super@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03"
+  integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-replace-supers" "^7.25.9"
 
-"@babel/plugin-transform-parameters@^7.18.8":
-  version "7.18.8"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a"
-  integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==
+"@babel/plugin-transform-optional-catch-binding@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3"
+  integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-property-literals@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3"
-  integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==
+"@babel/plugin-transform-optional-chaining@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd"
+  integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
 
-"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415"
-  integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==
+"@babel/plugin-transform-parameters@^7.2.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257"
+  integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-react-jsx-development@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5"
-  integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==
+"@babel/plugin-transform-private-methods@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57"
+  integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-private-property-in-object@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33"
+  integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-create-class-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-property-literals@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f"
+  integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==
   dependencies:
-    "@babel/plugin-transform-react-jsx" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz#4b79746b59efa1f38c8695065a92a9f5afb24f7d"
+  integrity sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-react-jsx-development@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz#8fd220a77dd139c07e25225a903b8be8c829e0d7"
+  integrity sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==
+  dependencies:
+    "@babel/plugin-transform-react-jsx" "^7.25.9"
 
 "@babel/plugin-transform-react-jsx-self@^7.0.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7"
-  integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858"
+  integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
 "@babel/plugin-transform-react-jsx-source@^7.0.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz#06e9ae8a14d2bc19ce6e3c447d842032a50598fc"
-  integrity sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503"
+  integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz#2721e96d31df96e3b7ad48ff446995d26bc028ff"
-  integrity sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==
+"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz#06367940d8325b36edff5e2b9cbe782947ca4166"
+  integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-module-imports" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-jsx" "^7.18.6"
-    "@babel/types" "^7.18.6"
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-module-imports" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/plugin-syntax-jsx" "^7.25.9"
+    "@babel/types" "^7.25.9"
 
-"@babel/plugin-transform-react-pure-annotations@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844"
-  integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==
+"@babel/plugin-transform-react-pure-annotations@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz#ea1c11b2f9dbb8e2d97025f43a3b5bc47e18ae62"
+  integrity sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73"
-  integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==
+"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz#03a8a4670d6cebae95305ac6defac81ece77740b"
+  integrity sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    regenerator-transform "^0.15.0"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    regenerator-transform "^0.15.2"
 
-"@babel/plugin-transform-reserved-words@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a"
-  integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==
+"@babel/plugin-transform-regexp-modifiers@^7.26.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850"
+  integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+
+"@babel/plugin-transform-reserved-words@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce"
+  integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.25.9"
 
 "@babel/plugin-transform-runtime@7.2.0":
   version "7.2.0"
@@ -1254,111 +978,95 @@
     resolve "^1.8.1"
     semver "^5.5.1"
 
-"@babel/plugin-transform-runtime@^7.16.4":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz#37d14d1fa810a368fd635d4d1476c0154144a96f"
-  integrity sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==
-  dependencies:
-    "@babel/helper-module-imports" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.9"
-    babel-plugin-polyfill-corejs2 "^0.3.2"
-    babel-plugin-polyfill-corejs3 "^0.5.3"
-    babel-plugin-polyfill-regenerator "^0.4.0"
-    semver "^6.3.0"
-
-"@babel/plugin-transform-runtime@^7.8.3":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.6.tgz#77b14416015ea93367ca06979710f5000ff34ccb"
-  integrity sha512-8uRHk9ZmRSnWqUgyae249EJZ94b0yAGLBIqzZzl+0iEdbno55Pmlt/32JZsHwXD9k/uZj18Aqqk35wBX4CBTXA==
-  dependencies:
-    "@babel/helper-module-imports" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    babel-plugin-polyfill-corejs2 "^0.3.1"
-    babel-plugin-polyfill-corejs3 "^0.5.2"
-    babel-plugin-polyfill-regenerator "^0.3.1"
-    semver "^6.3.0"
-
-"@babel/plugin-transform-shorthand-properties@^7.18.6", "@babel/plugin-transform-shorthand-properties@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9"
-  integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==
+"@babel/plugin-transform-runtime@^7.16.4", "@babel/plugin-transform-runtime@^7.8.3":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz#62723ea3f5b31ffbe676da9d6dae17138ae580ea"
+  integrity sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-module-imports" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    babel-plugin-polyfill-corejs2 "^0.4.10"
+    babel-plugin-polyfill-corejs3 "^0.10.6"
+    babel-plugin-polyfill-regenerator "^0.6.1"
+    semver "^6.3.1"
 
-"@babel/plugin-transform-spread@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664"
-  integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==
+"@babel/plugin-transform-shorthand-properties@^7.2.0", "@babel/plugin-transform-shorthand-properties@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2"
+  integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-spread@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz#82b080241965f1689f0a60ecc6f1f6575dbdb9d6"
-  integrity sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==
+"@babel/plugin-transform-spread@^7.2.0", "@babel/plugin-transform-spread@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9"
+  integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
 
-"@babel/plugin-transform-sticky-regex@^7.18.6", "@babel/plugin-transform-sticky-regex@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc"
-  integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==
+"@babel/plugin-transform-sticky-regex@^7.2.0", "@babel/plugin-transform-sticky-regex@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32"
+  integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-template-literals@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e"
-  integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==
+"@babel/plugin-transform-template-literals@^7.2.0", "@babel/plugin-transform-template-literals@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz#6dbd4a24e8fad024df76d1fac6a03cf413f60fe1"
+  integrity sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-template-literals@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz#b763f4dc9d11a7cce58cf9a490d82e80547db9c2"
-  integrity sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==
+"@babel/plugin-transform-typeof-symbol@^7.2.0", "@babel/plugin-transform-typeof-symbol@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz#224ba48a92869ddbf81f9b4a5f1204bbf5a2bc4b"
+  integrity sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-typeof-symbol@^7.18.9":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0"
-  integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==
+"@babel/plugin-transform-typescript@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849"
+  integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-annotate-as-pure" "^7.25.9"
+    "@babel/helper-create-class-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9"
+    "@babel/plugin-syntax-typescript" "^7.25.9"
 
-"@babel/plugin-transform-typeof-symbol@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz#486bb39d5a18047358e0d04dc0d2f322f0b92e92"
-  integrity sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==
+"@babel/plugin-transform-unicode-escapes@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82"
+  integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-typescript@^7.18.6":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.6.tgz#8f4ade1a9cf253e5cf7c7c20173082c2c08a50a7"
-  integrity sha512-ijHNhzIrLj5lQCnI6aaNVRtGVuUZhOXFLRVFs7lLrkXTHip4FKty5oAuQdk4tywG0/WjXmjTfQCWmuzrvFer1w==
+"@babel/plugin-transform-unicode-property-regex@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3"
+  integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/plugin-syntax-typescript" "^7.18.6"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-unicode-escapes@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246"
-  integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==
+"@babel/plugin-transform-unicode-regex@^7.2.0", "@babel/plugin-transform-unicode-regex@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1"
+  integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
-"@babel/plugin-transform-unicode-regex@^7.18.6", "@babel/plugin-transform-unicode-regex@^7.2.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca"
-  integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==
+"@babel/plugin-transform-unicode-sets-regex@^7.25.9":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe"
+  integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
-    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-create-regexp-features-plugin" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
 
 "@babel/polyfill@^7.10.4":
   version "7.12.1"
@@ -1418,94 +1126,86 @@
     semver "^5.3.0"
 
 "@babel/preset-env@^7.16.4":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.10.tgz#83b8dfe70d7eea1aae5a10635ab0a5fe60dfc0f4"
-  integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==
-  dependencies:
-    "@babel/compat-data" "^7.18.8"
-    "@babel/helper-compilation-targets" "^7.18.9"
-    "@babel/helper-plugin-utils" "^7.18.9"
-    "@babel/helper-validator-option" "^7.18.6"
-    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
-    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9"
-    "@babel/plugin-proposal-async-generator-functions" "^7.18.10"
-    "@babel/plugin-proposal-class-properties" "^7.18.6"
-    "@babel/plugin-proposal-class-static-block" "^7.18.6"
-    "@babel/plugin-proposal-dynamic-import" "^7.18.6"
-    "@babel/plugin-proposal-export-namespace-from" "^7.18.9"
-    "@babel/plugin-proposal-json-strings" "^7.18.6"
-    "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
-    "@babel/plugin-proposal-numeric-separator" "^7.18.6"
-    "@babel/plugin-proposal-object-rest-spread" "^7.18.9"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
-    "@babel/plugin-proposal-optional-chaining" "^7.18.9"
-    "@babel/plugin-proposal-private-methods" "^7.18.6"
-    "@babel/plugin-proposal-private-property-in-object" "^7.18.6"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
-    "@babel/plugin-syntax-async-generators" "^7.8.4"
-    "@babel/plugin-syntax-class-properties" "^7.12.13"
-    "@babel/plugin-syntax-class-static-block" "^7.14.5"
-    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
-    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-    "@babel/plugin-syntax-import-assertions" "^7.18.6"
-    "@babel/plugin-syntax-json-strings" "^7.8.3"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
-    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-    "@babel/plugin-syntax-top-level-await" "^7.14.5"
-    "@babel/plugin-transform-arrow-functions" "^7.18.6"
-    "@babel/plugin-transform-async-to-generator" "^7.18.6"
-    "@babel/plugin-transform-block-scoped-functions" "^7.18.6"
-    "@babel/plugin-transform-block-scoping" "^7.18.9"
-    "@babel/plugin-transform-classes" "^7.18.9"
-    "@babel/plugin-transform-computed-properties" "^7.18.9"
-    "@babel/plugin-transform-destructuring" "^7.18.9"
-    "@babel/plugin-transform-dotall-regex" "^7.18.6"
-    "@babel/plugin-transform-duplicate-keys" "^7.18.9"
-    "@babel/plugin-transform-exponentiation-operator" "^7.18.6"
-    "@babel/plugin-transform-for-of" "^7.18.8"
-    "@babel/plugin-transform-function-name" "^7.18.9"
-    "@babel/plugin-transform-literals" "^7.18.9"
-    "@babel/plugin-transform-member-expression-literals" "^7.18.6"
-    "@babel/plugin-transform-modules-amd" "^7.18.6"
-    "@babel/plugin-transform-modules-commonjs" "^7.18.6"
-    "@babel/plugin-transform-modules-systemjs" "^7.18.9"
-    "@babel/plugin-transform-modules-umd" "^7.18.6"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6"
-    "@babel/plugin-transform-new-target" "^7.18.6"
-    "@babel/plugin-transform-object-super" "^7.18.6"
-    "@babel/plugin-transform-parameters" "^7.18.8"
-    "@babel/plugin-transform-property-literals" "^7.18.6"
-    "@babel/plugin-transform-regenerator" "^7.18.6"
-    "@babel/plugin-transform-reserved-words" "^7.18.6"
-    "@babel/plugin-transform-shorthand-properties" "^7.18.6"
-    "@babel/plugin-transform-spread" "^7.18.9"
-    "@babel/plugin-transform-sticky-regex" "^7.18.6"
-    "@babel/plugin-transform-template-literals" "^7.18.9"
-    "@babel/plugin-transform-typeof-symbol" "^7.18.9"
-    "@babel/plugin-transform-unicode-escapes" "^7.18.10"
-    "@babel/plugin-transform-unicode-regex" "^7.18.6"
-    "@babel/preset-modules" "^0.1.5"
-    "@babel/types" "^7.18.10"
-    babel-plugin-polyfill-corejs2 "^0.3.2"
-    babel-plugin-polyfill-corejs3 "^0.5.3"
-    babel-plugin-polyfill-regenerator "^0.4.0"
-    core-js-compat "^3.22.1"
-    semver "^6.3.0"
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.0.tgz#30e5c6bc1bcc54865bff0c5a30f6d4ccdc7fa8b1"
+  integrity sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==
+  dependencies:
+    "@babel/compat-data" "^7.26.0"
+    "@babel/helper-compilation-targets" "^7.25.9"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-validator-option" "^7.25.9"
+    "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9"
+    "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9"
+    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9"
+    "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+    "@babel/plugin-syntax-import-assertions" "^7.26.0"
+    "@babel/plugin-syntax-import-attributes" "^7.26.0"
+    "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+    "@babel/plugin-transform-arrow-functions" "^7.25.9"
+    "@babel/plugin-transform-async-generator-functions" "^7.25.9"
+    "@babel/plugin-transform-async-to-generator" "^7.25.9"
+    "@babel/plugin-transform-block-scoped-functions" "^7.25.9"
+    "@babel/plugin-transform-block-scoping" "^7.25.9"
+    "@babel/plugin-transform-class-properties" "^7.25.9"
+    "@babel/plugin-transform-class-static-block" "^7.26.0"
+    "@babel/plugin-transform-classes" "^7.25.9"
+    "@babel/plugin-transform-computed-properties" "^7.25.9"
+    "@babel/plugin-transform-destructuring" "^7.25.9"
+    "@babel/plugin-transform-dotall-regex" "^7.25.9"
+    "@babel/plugin-transform-duplicate-keys" "^7.25.9"
+    "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9"
+    "@babel/plugin-transform-dynamic-import" "^7.25.9"
+    "@babel/plugin-transform-exponentiation-operator" "^7.25.9"
+    "@babel/plugin-transform-export-namespace-from" "^7.25.9"
+    "@babel/plugin-transform-for-of" "^7.25.9"
+    "@babel/plugin-transform-function-name" "^7.25.9"
+    "@babel/plugin-transform-json-strings" "^7.25.9"
+    "@babel/plugin-transform-literals" "^7.25.9"
+    "@babel/plugin-transform-logical-assignment-operators" "^7.25.9"
+    "@babel/plugin-transform-member-expression-literals" "^7.25.9"
+    "@babel/plugin-transform-modules-amd" "^7.25.9"
+    "@babel/plugin-transform-modules-commonjs" "^7.25.9"
+    "@babel/plugin-transform-modules-systemjs" "^7.25.9"
+    "@babel/plugin-transform-modules-umd" "^7.25.9"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9"
+    "@babel/plugin-transform-new-target" "^7.25.9"
+    "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.9"
+    "@babel/plugin-transform-numeric-separator" "^7.25.9"
+    "@babel/plugin-transform-object-rest-spread" "^7.25.9"
+    "@babel/plugin-transform-object-super" "^7.25.9"
+    "@babel/plugin-transform-optional-catch-binding" "^7.25.9"
+    "@babel/plugin-transform-optional-chaining" "^7.25.9"
+    "@babel/plugin-transform-parameters" "^7.25.9"
+    "@babel/plugin-transform-private-methods" "^7.25.9"
+    "@babel/plugin-transform-private-property-in-object" "^7.25.9"
+    "@babel/plugin-transform-property-literals" "^7.25.9"
+    "@babel/plugin-transform-regenerator" "^7.25.9"
+    "@babel/plugin-transform-regexp-modifiers" "^7.26.0"
+    "@babel/plugin-transform-reserved-words" "^7.25.9"
+    "@babel/plugin-transform-shorthand-properties" "^7.25.9"
+    "@babel/plugin-transform-spread" "^7.25.9"
+    "@babel/plugin-transform-sticky-regex" "^7.25.9"
+    "@babel/plugin-transform-template-literals" "^7.25.9"
+    "@babel/plugin-transform-typeof-symbol" "^7.25.9"
+    "@babel/plugin-transform-unicode-escapes" "^7.25.9"
+    "@babel/plugin-transform-unicode-property-regex" "^7.25.9"
+    "@babel/plugin-transform-unicode-regex" "^7.25.9"
+    "@babel/plugin-transform-unicode-sets-regex" "^7.25.9"
+    "@babel/preset-modules" "0.1.6-no-external-plugins"
+    babel-plugin-polyfill-corejs2 "^0.4.10"
+    babel-plugin-polyfill-corejs3 "^0.10.6"
+    babel-plugin-polyfill-regenerator "^0.6.1"
+    core-js-compat "^3.38.1"
+    semver "^6.3.1"
 
-"@babel/preset-modules@^0.1.5":
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
-  integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
+"@babel/preset-modules@0.1.6-no-external-plugins":
+  version "0.1.6-no-external-plugins"
+  resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+  integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
-    "@babel/plugin-transform-dotall-regex" "^7.4.4"
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
@@ -1521,33 +1221,35 @@
     "@babel/plugin-transform-react-jsx-source" "^7.0.0"
 
 "@babel/preset-react@^7.16.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d"
-  integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.9.tgz#5f473035dc2094bcfdbc7392d0766bd42dce173e"
+  integrity sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-validator-option" "^7.18.6"
-    "@babel/plugin-transform-react-display-name" "^7.18.6"
-    "@babel/plugin-transform-react-jsx" "^7.18.6"
-    "@babel/plugin-transform-react-jsx-development" "^7.18.6"
-    "@babel/plugin-transform-react-pure-annotations" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-validator-option" "^7.25.9"
+    "@babel/plugin-transform-react-display-name" "^7.25.9"
+    "@babel/plugin-transform-react-jsx" "^7.25.9"
+    "@babel/plugin-transform-react-jsx-development" "^7.25.9"
+    "@babel/plugin-transform-react-pure-annotations" "^7.25.9"
 
 "@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.7.4":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399"
-  integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz#4a570f1b8d104a242d923957ffa1eaff142a106d"
+  integrity sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.18.6"
-    "@babel/helper-validator-option" "^7.18.6"
-    "@babel/plugin-transform-typescript" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.25.9"
+    "@babel/helper-validator-option" "^7.25.9"
+    "@babel/plugin-syntax-jsx" "^7.25.9"
+    "@babel/plugin-transform-modules-commonjs" "^7.25.9"
+    "@babel/plugin-transform-typescript" "^7.25.9"
 
 "@babel/runtime-corejs3@^7.12.1":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.18.6.tgz#6f02c5536911f4b445946a2179554b95c8838635"
-  integrity sha512-cOu5wH2JFBgMjje+a+fz2JNIWU4GzYpl05oSob3UDvBEh6EuIn+TXFHMmBbhSb+k/4HMzgKCQfEEDArAWNF9Cw==
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz#5af6bed16073eb4a0191233d61e158a5c768c430"
+  integrity sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==
   dependencies:
-    core-js-pure "^3.20.2"
-    regenerator-runtime "^0.13.4"
+    core-js-pure "^3.30.2"
+    regenerator-runtime "^0.14.0"
 
 "@babel/runtime@7.0.0":
   version "7.0.0"
@@ -1563,148 +1265,42 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.6", "@babel/runtime@^7.15.4", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580"
-  integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==
-  dependencies:
-    regenerator-runtime "^0.13.4"
-
-"@babel/runtime@^7.12.1":
-  version "7.22.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438"
-  integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==
-  dependencies:
-    regenerator-runtime "^0.13.11"
-
-"@babel/runtime@^7.12.5":
-  version "7.24.4"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
-  integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.2.0", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+  integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
   dependencies:
     regenerator-runtime "^0.14.0"
 
-"@babel/runtime@^7.16.3":
-  version "7.18.9"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
-  integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==
-  dependencies:
-    regenerator-runtime "^0.13.4"
-
-"@babel/runtime@^7.23.2":
-  version "7.23.2"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
-  integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
-  dependencies:
-    regenerator-runtime "^0.14.0"
-
-"@babel/runtime@^7.7.6":
-  version "7.20.13"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
-  integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
-  dependencies:
-    regenerator-runtime "^0.13.11"
-
-"@babel/template@^7.10.0", "@babel/template@^7.22.15":
-  version "7.22.15"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
-  integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
-  dependencies:
-    "@babel/code-frame" "^7.22.13"
-    "@babel/parser" "^7.22.15"
-    "@babel/types" "^7.22.15"
-
-"@babel/template@^7.16.7", "@babel/template@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
-  integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==
-  dependencies:
-    "@babel/code-frame" "^7.18.6"
-    "@babel/parser" "^7.18.10"
-    "@babel/types" "^7.18.10"
-
-"@babel/template@^7.18.6", "@babel/template@^7.2.2", "@babel/template@^7.3.3":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31"
-  integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==
-  dependencies:
-    "@babel/code-frame" "^7.18.6"
-    "@babel/parser" "^7.18.6"
-    "@babel/types" "^7.18.6"
-
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.18.6", "@babel/traverse@^7.2.2", "@babel/traverse@^7.7.0":
-  version "7.18.6"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.6.tgz#a228562d2f46e89258efa4ddd0416942e2fd671d"
-  integrity sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==
-  dependencies:
-    "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.18.6"
-    "@babel/helper-environment-visitor" "^7.18.6"
-    "@babel/helper-function-name" "^7.18.6"
-    "@babel/helper-hoist-variables" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/parser" "^7.18.6"
-    "@babel/types" "^7.18.6"
-    debug "^4.1.0"
+"@babel/template@^7.10.0", "@babel/template@^7.16.7", "@babel/template@^7.2.2", "@babel/template@^7.25.9", "@babel/template@^7.3.3":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+  integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+  dependencies:
+    "@babel/code-frame" "^7.25.9"
+    "@babel/parser" "^7.25.9"
+    "@babel/types" "^7.25.9"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.0", "@babel/traverse@^7.16.10", "@babel/traverse@^7.2.2", "@babel/traverse@^7.25.9", "@babel/traverse@^7.7.0":
+  version "7.25.9"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
+  integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
+  dependencies:
+    "@babel/code-frame" "^7.25.9"
+    "@babel/generator" "^7.25.9"
+    "@babel/parser" "^7.25.9"
+    "@babel/template" "^7.25.9"
+    "@babel/types" "^7.25.9"
+    debug "^4.3.1"
     globals "^11.1.0"
 
-"@babel/traverse@^7.10.0", "@babel/traverse@^7.23.0":
-  version "7.23.0"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53"
-  integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==
-  dependencies:
-    "@babel/code-frame" "^7.22.13"
-    "@babel/generator" "^7.23.0"
-    "@babel/helper-environment-visitor" "^7.22.20"
-    "@babel/helper-function-name" "^7.23.0"
-    "@babel/helper-hoist-variables" "^7.22.5"
-    "@babel/helper-split-export-declaration" "^7.22.6"
-    "@babel/parser" "^7.23.0"
-    "@babel/types" "^7.23.0"
-    debug "^4.1.0"
-    globals "^11.1.0"
-
-"@babel/traverse@^7.16.10", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.9":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.10.tgz#37ad97d1cb00efa869b91dd5d1950f8a6cf0cb08"
-  integrity sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==
+"@babel/types@^7.0.0", "@babel/types@^7.10.0", "@babel/types@^7.16.8", "@babel/types@^7.2.2", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+  version "7.26.0"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff"
+  integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
   dependencies:
-    "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.18.10"
-    "@babel/helper-environment-visitor" "^7.18.9"
-    "@babel/helper-function-name" "^7.18.9"
-    "@babel/helper-hoist-variables" "^7.18.6"
-    "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/parser" "^7.18.10"
-    "@babel/types" "^7.18.10"
-    debug "^4.1.0"
-    globals "^11.1.0"
-
-"@babel/types@^7.0.0", "@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
-  version "7.18.7"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.7.tgz#a4a2c910c15040ea52cdd1ddb1614a65c8041726"
-  integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==
-  dependencies:
-    "@babel/helper-validator-identifier" "^7.18.6"
-    to-fast-properties "^2.0.0"
-
-"@babel/types@^7.10.0", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0":
-  version "7.23.0"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
-  integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
-  dependencies:
-    "@babel/helper-string-parser" "^7.22.5"
-    "@babel/helper-validator-identifier" "^7.22.20"
-    to-fast-properties "^2.0.0"
-
-"@babel/types@^7.16.8", "@babel/types@^7.18.10", "@babel/types@^7.18.9":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6"
-  integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==
-  dependencies:
-    "@babel/helper-string-parser" "^7.18.10"
-    "@babel/helper-validator-identifier" "^7.18.6"
-    to-fast-properties "^2.0.0"
+    "@babel/helper-string-parser" "^7.25.9"
+    "@babel/helper-validator-identifier" "^7.25.9"
 
 "@bcoe/v8-coverage@^0.2.3":
   version "0.2.3"
@@ -1731,114 +1327,221 @@
   dependencies:
     microee "0.0.6"
 
-"@emotion/babel-plugin@^11.7.1":
-  version "11.9.2"
-  resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.9.2.tgz#723b6d394c89fb2ef782229d92ba95a740576e95"
-  integrity sha512-Pr/7HGH6H6yKgnVFNEj2MVlreu3ADqftqjqwUvDy/OJzKFgxKeTQ+eeUf20FOTuHVkDON2iNa25rAXVYtWJCjw==
-  dependencies:
-    "@babel/helper-module-imports" "^7.12.13"
-    "@babel/plugin-syntax-jsx" "^7.12.13"
-    "@babel/runtime" "^7.13.10"
-    "@emotion/hash" "^0.8.0"
-    "@emotion/memoize" "^0.7.5"
-    "@emotion/serialize" "^1.0.2"
-    babel-plugin-macros "^2.6.1"
+"@emotion/babel-plugin@^11.12.0":
+  version "11.12.0"
+  resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
+  integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==
+  dependencies:
+    "@babel/helper-module-imports" "^7.16.7"
+    "@babel/runtime" "^7.18.3"
+    "@emotion/hash" "^0.9.2"
+    "@emotion/memoize" "^0.9.0"
+    "@emotion/serialize" "^1.2.0"
+    babel-plugin-macros "^3.1.0"
     convert-source-map "^1.5.0"
     escape-string-regexp "^4.0.0"
     find-root "^1.1.0"
     source-map "^0.5.7"
-    stylis "4.0.13"
+    stylis "4.2.0"
 
-"@emotion/cache@^11.4.0", "@emotion/cache@^11.9.3":
-  version "11.9.3"
-  resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.9.3.tgz#96638449f6929fd18062cfe04d79b29b44c0d6cb"
-  integrity sha512-0dgkI/JKlCXa+lEXviaMtGBL0ynpx4osh7rjOXE71q9bIF8G+XhJgvi+wDu0B0IdCVx37BffiwXlN9I3UuzFvg==
+"@emotion/cache@^11.13.0", "@emotion/cache@^11.4.0":
+  version "11.13.1"
+  resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.1.tgz#fecfc54d51810beebf05bf2a161271a1a91895d7"
+  integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==
   dependencies:
-    "@emotion/memoize" "^0.7.4"
-    "@emotion/sheet" "^1.1.1"
-    "@emotion/utils" "^1.0.0"
-    "@emotion/weak-memoize" "^0.2.5"
-    stylis "4.0.13"
+    "@emotion/memoize" "^0.9.0"
+    "@emotion/sheet" "^1.4.0"
+    "@emotion/utils" "^1.4.0"
+    "@emotion/weak-memoize" "^0.4.0"
+    stylis "4.2.0"
 
 "@emotion/hash@^0.8.0":
   version "0.8.0"
   resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
   integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
 
-"@emotion/memoize@^0.7.4", "@emotion/memoize@^0.7.5":
-  version "0.7.5"
-  resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.5.tgz#2c40f81449a4e554e9fc6396910ed4843ec2be50"
-  integrity sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==
+"@emotion/hash@^0.9.2":
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b"
+  integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
+
+"@emotion/memoize@^0.9.0":
+  version "0.9.0"
+  resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102"
+  integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
 
 "@emotion/react@^11.1.1":
-  version "11.9.3"
-  resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.9.3.tgz#f4f4f34444f6654a2e550f5dab4f2d360c101df9"
-  integrity sha512-g9Q1GcTOlzOEjqwuLF/Zd9LC+4FljjPjDfxSM7KmEakm+hsHXk+bYZ2q+/hTJzr0OUNkujo72pXLQvXj6H+GJQ==
-  dependencies:
-    "@babel/runtime" "^7.13.10"
-    "@emotion/babel-plugin" "^11.7.1"
-    "@emotion/cache" "^11.9.3"
-    "@emotion/serialize" "^1.0.4"
-    "@emotion/utils" "^1.1.0"
-    "@emotion/weak-memoize" "^0.2.5"
+  version "11.13.3"
+  resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.3.tgz#a69d0de2a23f5b48e0acf210416638010e4bd2e4"
+  integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==
+  dependencies:
+    "@babel/runtime" "^7.18.3"
+    "@emotion/babel-plugin" "^11.12.0"
+    "@emotion/cache" "^11.13.0"
+    "@emotion/serialize" "^1.3.1"
+    "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0"
+    "@emotion/utils" "^1.4.0"
+    "@emotion/weak-memoize" "^0.4.0"
     hoist-non-react-statics "^3.3.1"
 
-"@emotion/serialize@^1.0.2", "@emotion/serialize@^1.0.4":
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.0.4.tgz#ff31fd11bb07999611199c2229e152faadc21a3c"
-  integrity sha512-1JHamSpH8PIfFwAMryO2bNka+y8+KA5yga5Ocf2d7ZEiJjb7xlLW7aknBGZqJLajuLOvJ+72vN+IBSwPlXD1Pg==
+"@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.1":
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a"
+  integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==
   dependencies:
-    "@emotion/hash" "^0.8.0"
-    "@emotion/memoize" "^0.7.4"
-    "@emotion/unitless" "^0.7.5"
-    "@emotion/utils" "^1.0.0"
+    "@emotion/hash" "^0.9.2"
+    "@emotion/memoize" "^0.9.0"
+    "@emotion/unitless" "^0.10.0"
+    "@emotion/utils" "^1.4.1"
     csstype "^3.0.2"
 
-"@emotion/sheet@^1.1.1":
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.1.1.tgz#015756e2a9a3c7c5f11d8ec22966a8dbfbfac787"
-  integrity sha512-J3YPccVRMiTZxYAY0IOq3kd+hUP8idY8Kz6B/Cyo+JuXq52Ek+zbPbSQUrVQp95aJ+lsAW7DPL1P2Z+U1jGkKA==
+"@emotion/sheet@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c"
+  integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
 
-"@emotion/unitless@^0.7.5":
-  version "0.7.5"
-  resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
-  integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
+"@emotion/unitless@^0.10.0":
+  version "0.10.0"
+  resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745"
+  integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
 
-"@emotion/utils@^1.0.0", "@emotion/utils@^1.1.0":
+"@emotion/use-insertion-effect-with-fallbacks@^1.1.0":
   version "1.1.0"
-  resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.1.0.tgz#86b0b297f3f1a0f2bdb08eeac9a2f49afd40d0cf"
-  integrity sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==
+  resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf"
+  integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==
 
-"@emotion/weak-memoize@^0.2.5":
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
-  integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
+"@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1":
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad"
+  integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==
+
+"@emotion/weak-memoize@^0.4.0":
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6"
+  integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
 
-"@es-joy/jsdoccomment@~0.41.0":
-  version "0.41.0"
-  resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz#4a2f7db42209c0425c71a1476ef1bdb6dcd836f6"
-  integrity sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==
+"@es-joy/jsdoccomment@~0.49.0":
+  version "0.49.0"
+  resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz#e5ec1eda837c802eca67d3b29e577197f14ba1db"
+  integrity sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==
   dependencies:
     comment-parser "1.4.1"
-    esquery "^1.5.0"
-    jsdoc-type-pratt-parser "~4.0.0"
+    esquery "^1.6.0"
+    jsdoc-type-pratt-parser "~4.1.0"
 
-"@eslint-community/eslint-utils@^4.2.0":
-  version "4.3.0"
-  resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz#a556790523a351b4e47e9d385f47265eaaf9780a"
-  integrity sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+  version "4.4.1"
+  resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56"
+  integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==
   dependencies:
-    eslint-visitor-keys "^3.3.0"
+    eslint-visitor-keys "^3.4.3"
 
-"@eslint-community/regexpp@^4.4.0":
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403"
-  integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==
+"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
+  version "4.12.1"
+  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
+  integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
+
+"@eslint-react/ast@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/ast/-/ast-1.15.2.tgz#fe56aaaf4d303a19f18ab616f9c3fe42f745c822"
+  integrity sha512-Dtn6Ai/P74CLoZ4mPR/9Mm4xXuulXULaXNXAzusZSNfa3+4podw6LCxKHpLcLqsvfZN3mciW3cC8CAyH7/MZwg==
+  dependencies:
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/typescript-estree" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    birecord "^0.1.1"
+    string-ts "^2.2.0"
+    ts-pattern "^5.5.0"
+
+"@eslint-react/core@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/core/-/core-1.15.2.tgz#4988224d4067f793dba72feb036bc29a8e5aa435"
+  integrity sha512-F8qh1oeqdXrepTQKp0kbQ8UTVDhSbJGvsQhO6YMSOC/Bci98Z2ad/VZXfZtMcYtvj+/4s0nmifzrYfvjt7easw==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/type-utils" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    birecord "^0.1.1"
+    short-unique-id "^5.2.0"
+    ts-pattern "^5.5.0"
+
+"@eslint-react/eslint-plugin@^1.14.3":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/eslint-plugin/-/eslint-plugin-1.15.2.tgz#83dbf51a8e77dec45a8882f2cdaa8875d035668f"
+  integrity sha512-j4O+dVFG24VrEu0lfiY7PTiAdKpYBWrc16/J4OymTERxwJYAZLuedoIYextSYjpJ7Hn9RhQyhGq4jqbcIpyVwg==
+  dependencies:
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/type-utils" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    eslint-plugin-react-debug "1.15.2"
+    eslint-plugin-react-dom "1.15.2"
+    eslint-plugin-react-hooks-extra "1.15.2"
+    eslint-plugin-react-naming-convention "1.15.2"
+    eslint-plugin-react-web-api "1.15.2"
+    eslint-plugin-react-x "1.15.2"
+
+"@eslint-react/jsx@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/jsx/-/jsx-1.15.2.tgz#a0a0133ef4cbb45cad338f3af8a497c562374eb7"
+  integrity sha512-IwkmPazUhEpMQgu6gVzCWuvWU7Za7SmddKowNIelSfoX0o5uZVh42anrVnGyX0jgx9X7XcZOUYll3F701Ftyqw==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    ts-pattern "^5.5.0"
+
+"@eslint-react/shared@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/shared/-/shared-1.15.2.tgz#9dbf8c7ad4faf1802ff30ad85cab45fa81e2f621"
+  integrity sha512-5xOCUbf+AhWcMKdQSPRmqJrnsepiP1SYyoc0w8M69DLhkuRfTnzVsJsvXNGS74+8oG8jBfRU/C1dkQxNWoODWg==
+  dependencies:
+    "@eslint-react/tools" "1.15.2"
+    "@typescript-eslint/utils" "^8.12.1"
+    picomatch "^4.0.2"
 
-"@eslint-community/regexpp@^4.6.1":
-  version "4.8.0"
-  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005"
-  integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==
+"@eslint-react/tools@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/tools/-/tools-1.15.2.tgz#64027a168cc53c6fdd1ebba87c9791b030046d1f"
+  integrity sha512-u5vASGC6Ui+5G0AkorTZHevHE1w6Spaun9UdmadMDTuZdPLbfIUPoD4dfZ5AaqH6wVfdpmieHFXsItuvRWHWxw==
+
+"@eslint-react/types@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/types/-/types-1.15.2.tgz#1eda7a19792b92f6a986c728c1bddeafbaf18a93"
+  integrity sha512-s8HfvVPl8aCb+coIPrFULDugR22GiRKU6keXwdRqQaHR4U0a6YtSqNFssoxEvMdkesNAQ2kIhZEE4oXRyR7gFw==
+  dependencies:
+    "@eslint-react/tools" "1.15.2"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+
+"@eslint-react/var@1.15.2":
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/@eslint-react/var/-/var-1.15.2.tgz#8b7fd5a12cd477196c6e85292397e4fe68b43659"
+  integrity sha512-Kd37TnpjGWXUshTruUxH2wyo4ODItf/yn8P8VbgOAirkKg/Y7cSsep3hXuY4hXlpOd/ZgoGmtGE8JHsm65Vfxw==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    ts-pattern "^5.5.0"
 
 "@eslint/eslintrc@^0.4.3":
   version "0.4.3"
@@ -1855,25 +1558,10 @@
     minimatch "^3.0.4"
     strip-json-comments "^3.1.1"
 
-"@eslint/eslintrc@^1.3.0":
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
-  integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
-  dependencies:
-    ajv "^6.12.4"
-    debug "^4.3.2"
-    espree "^9.3.2"
-    globals "^13.15.0"
-    ignore "^5.2.0"
-    import-fresh "^3.2.1"
-    js-yaml "^4.1.0"
-    minimatch "^3.1.2"
-    strip-json-comments "^3.1.1"
-
-"@eslint/eslintrc@^2.1.2":
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396"
-  integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==
+"@eslint/eslintrc@^2.1.4":
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+  integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
@@ -1885,23 +1573,23 @@
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@8.49.0":
-  version "8.49.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333"
-  integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==
+"@eslint/js@8.57.1":
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
+  integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
 
 "@gar/promisify@^1.0.1":
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
   integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
 
-"@humanwhocodes/config-array@^0.11.11":
-  version "0.11.11"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844"
-  integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==
+"@humanwhocodes/config-array@^0.13.0":
+  version "0.13.0"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
+  integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
   dependencies:
-    "@humanwhocodes/object-schema" "^1.2.1"
-    debug "^4.1.1"
+    "@humanwhocodes/object-schema" "^2.0.3"
+    debug "^4.3.1"
     minimatch "^3.0.5"
 
 "@humanwhocodes/config-array@^0.5.0":
@@ -1913,30 +1601,38 @@
     debug "^4.1.1"
     minimatch "^3.0.4"
 
-"@humanwhocodes/config-array@^0.9.2":
-  version "0.9.5"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
-  integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
-  dependencies:
-    "@humanwhocodes/object-schema" "^1.2.1"
-    debug "^4.1.1"
-    minimatch "^3.0.4"
-
 "@humanwhocodes/module-importer@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
   integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
 
-"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1":
+"@humanwhocodes/object-schema@^1.2.0":
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
   integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
 
+"@humanwhocodes/object-schema@^2.0.3":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
+  integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
+
 "@hutson/parse-repository-url@^3.0.0":
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340"
   integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==
 
+"@isaacs/cliui@^8.0.2":
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+  integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+  dependencies:
+    string-width "^5.1.2"
+    string-width-cjs "npm:string-width@^4.2.0"
+    strip-ansi "^7.0.1"
+    strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+    wrap-ansi "^8.1.0"
+    wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
 "@istanbuljs/load-nyc-config@^1.0.0":
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@@ -2009,12 +1705,12 @@
     "@types/node" "*"
     jest-mock "^26.6.2"
 
-"@jest/expect-utils@^29.0.3":
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.0.3.tgz#f5bb86f5565bf2dacfca31ccbd887684936045b2"
-  integrity sha512-i1xUkau7K/63MpdwiRqaxgZOjxYs4f0WMTGJnYwUKubsNRZSeQbLorS7+I4uXVF9KQ5r61BUPAUMZ7Lf66l64Q==
+"@jest/expect-utils@^29.7.0":
+  version "29.7.0"
+  resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6"
+  integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==
   dependencies:
-    jest-get-type "^29.0.0"
+    jest-get-type "^29.6.3"
 
 "@jest/fake-timers@^25.1.0":
   version "25.5.0"
@@ -2080,13 +1776,6 @@
   optionalDependencies:
     node-notifier "^8.0.0"
 
-"@jest/schemas@^29.0.0":
-  version "29.0.0"
-  resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a"
-  integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==
-  dependencies:
-    "@sinclair/typebox" "^0.24.1"
-
 "@jest/schemas@^29.6.3":
   version "29.6.3"
   resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
@@ -2166,80 +1855,54 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
-"@jest/types@^29.0.3":
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.0.3.tgz#0be78fdddb1a35aeb2041074e55b860561c8ef63"
-  integrity sha512-coBJmOQvurXjN1Hh5PzF7cmsod0zLIOXpP8KD161mqNlroMhLcwpODiEzi7ZsRl5Z/AIuxpeNm8DCl43F4kz8A==
+"@jest/types@^29.6.3":
+  version "29.6.3"
+  resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
+  integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
   dependencies:
-    "@jest/schemas" "^29.0.0"
+    "@jest/schemas" "^29.6.3"
     "@types/istanbul-lib-coverage" "^2.0.0"
     "@types/istanbul-reports" "^3.0.0"
     "@types/node" "*"
     "@types/yargs" "^17.0.8"
     chalk "^4.0.0"
 
-"@jridgewell/gen-mapping@^0.1.0":
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
-  integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
-  dependencies:
-    "@jridgewell/set-array" "^1.0.0"
-    "@jridgewell/sourcemap-codec" "^1.4.10"
-
-"@jridgewell/gen-mapping@^0.3.2":
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
-  integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+"@jridgewell/gen-mapping@^0.3.5":
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+  integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
   dependencies:
-    "@jridgewell/set-array" "^1.0.1"
+    "@jridgewell/set-array" "^1.2.1"
     "@jridgewell/sourcemap-codec" "^1.4.10"
-    "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/resolve-uri@^3.0.3":
-  version "3.0.8"
-  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz#687cc2bbf243f4e9a868ecf2262318e2658873a1"
-  integrity sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==
+    "@jridgewell/trace-mapping" "^0.3.24"
 
 "@jridgewell/resolve-uri@^3.1.0":
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
-  integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
-
-"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
-  integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+  integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
 
-"@jridgewell/sourcemap-codec@^1.4.10":
-  version "1.4.14"
-  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
-  integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+"@jridgewell/set-array@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+  integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
 
-"@jridgewell/sourcemap-codec@^1.4.14":
-  version "1.4.15"
-  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
-  integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+  integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
 
-"@jridgewell/trace-mapping@^0.3.17":
-  version "0.3.19"
-  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811"
-  integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+  version "0.3.25"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+  integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
   dependencies:
     "@jridgewell/resolve-uri" "^3.1.0"
     "@jridgewell/sourcemap-codec" "^1.4.14"
 
-"@jridgewell/trace-mapping@^0.3.9":
-  version "0.3.14"
-  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
-  integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
-  dependencies:
-    "@jridgewell/resolve-uri" "^3.0.3"
-    "@jridgewell/sourcemap-codec" "^1.4.10"
-
 "@juggle/resize-observer@^3.1.3":
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.3.1.tgz#b50a781709c81e10701004214340f25475a171a0"
-  integrity sha512-zMM9Ds+SawiUkakS7y94Ymqx+S0ORzpG3frZirN3l+UlXUmSUR7hF4wxCVqW+ei94JzV5kt0uXBcoOEAuiydrw==
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
+  integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
 
 "@material-ui/core@4.12.3":
   version "4.12.3"
@@ -2334,6 +1997,13 @@
     prop-types "^15.7.2"
     react-is "^16.8.0 || ^17.0.0"
 
+"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
+  version "5.1.1-v1"
+  resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129"
+  integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==
+  dependencies:
+    eslint-scope "5.1.1"
+
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -2371,17 +2041,123 @@
     mkdirp "^1.0.4"
     rimraf "^3.0.2"
 
-"@pkgr/utils@^2.3.1":
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc"
-  integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==
+"@one-ini/wasm@0.1.1":
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323"
+  integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
+
+"@parcel/watcher-android-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a"
+  integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==
+
+"@parcel/watcher-darwin-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f"
+  integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==
+
+"@parcel/watcher-darwin-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb"
+  integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==
+
+"@parcel/watcher-freebsd-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82"
+  integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==
+
+"@parcel/watcher-linux-arm-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42"
+  integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==
+
+"@parcel/watcher-linux-arm-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4"
+  integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==
+
+"@parcel/watcher-linux-arm64-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03"
+  integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==
+
+"@parcel/watcher-linux-arm64-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732"
+  integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==
+
+"@parcel/watcher-linux-x64-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d"
+  integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==
+
+"@parcel/watcher-linux-x64-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef"
+  integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==
+
+"@parcel/watcher-win32-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154"
+  integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==
+
+"@parcel/watcher-win32-ia32@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220"
+  integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==
+
+"@parcel/watcher-win32-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7"
+  integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==
+
+"@parcel/watcher@^2.4.1":
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10"
+  integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==
   dependencies:
-    cross-spawn "^7.0.3"
-    fast-glob "^3.3.0"
+    detect-libc "^1.0.3"
     is-glob "^4.0.3"
-    open "^9.1.0"
-    picocolors "^1.0.0"
-    tslib "^2.6.0"
+    micromatch "^4.0.5"
+    node-addon-api "^7.0.0"
+  optionalDependencies:
+    "@parcel/watcher-android-arm64" "2.5.0"
+    "@parcel/watcher-darwin-arm64" "2.5.0"
+    "@parcel/watcher-darwin-x64" "2.5.0"
+    "@parcel/watcher-freebsd-x64" "2.5.0"
+    "@parcel/watcher-linux-arm-glibc" "2.5.0"
+    "@parcel/watcher-linux-arm-musl" "2.5.0"
+    "@parcel/watcher-linux-arm64-glibc" "2.5.0"
+    "@parcel/watcher-linux-arm64-musl" "2.5.0"
+    "@parcel/watcher-linux-x64-glibc" "2.5.0"
+    "@parcel/watcher-linux-x64-musl" "2.5.0"
+    "@parcel/watcher-win32-arm64" "2.5.0"
+    "@parcel/watcher-win32-ia32" "2.5.0"
+    "@parcel/watcher-win32-x64" "2.5.0"
+
+"@pdf-lib/standard-fonts@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/@pdf-lib/standard-fonts/-/standard-fonts-1.0.0.tgz#8ba691c4421f71662ed07c9a0294b44528af2d7f"
+  integrity sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA==
+  dependencies:
+    pako "^1.0.6"
+
+"@pdf-lib/upng@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@pdf-lib/upng/-/upng-1.0.1.tgz#7dc9c636271aca007a9df4deaf2dd7e7960280cb"
+  integrity sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ==
+  dependencies:
+    pako "^1.0.10"
+
+"@pkgjs/parseargs@^0.11.0":
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+  integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@pkgr/core@^0.1.0":
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31"
+  integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==
 
 "@pollyjs/adapter-node-http@5.1.1":
   version "5.1.1"
@@ -2457,9 +2233,9 @@
     url-parse "^1.4.7"
 
 "@popperjs/core@^2.4.4":
-  version "2.11.5"
-  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64"
-  integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==
+  version "2.11.8"
+  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
+  integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
 
 "@react-spring/animated@9.0.0-rc.3":
   version "9.0.0-rc.3"
@@ -2541,30 +2317,71 @@
     "@react-spring/core" "9.0.0-rc.3"
     "@react-spring/shared" "9.0.0-rc.3"
 
-"@reduxjs/toolkit@^1.9.5":
-  version "1.9.5"
-  resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-1.9.5.tgz#d3987849c24189ca483baa7aa59386c8e52077c4"
-  integrity sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==
+"@reduxjs/toolkit@^2.2.7":
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/@reduxjs/toolkit/-/toolkit-2.3.0.tgz#d00134634d6c1678e8563ac50026e429e3b64420"
+  integrity sha512-WC7Yd6cNGfHx8zf+iu+Q1UPTfEcXhQ+ATi7CV1hlrSAaQBdlPzg7Ww/wJHNQem7qG9rxmWoFCDCPubSvFObGzA==
   dependencies:
-    immer "^9.0.21"
-    redux "^4.2.1"
-    redux-thunk "^2.4.2"
-    reselect "^4.1.8"
-
-"@remix-run/router@1.2.1":
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.2.1.tgz#812edd4104a15a493dda1ccac0b352270d7a188c"
-  integrity sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ==
+    immer "^10.0.3"
+    redux "^5.0.1"
+    redux-thunk "^3.1.0"
+    reselect "^5.1.0"
 
-"@sentry/browser@7.21.1":
-  version "7.21.1"
-  resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.21.1.tgz#bffa3ea19050c06400107d2297b9802f9719f98b"
-  integrity sha512-cS2Jz2+fs9+4pJqLJPtYqGyY97ywJDWAWIR1Yla3hs1QQuH6m0Nz3ojZD1gE2eKH9mHwkGbnNAh+hHcrYrfGzw==
-  dependencies:
-    "@sentry/core" "7.21.1"
-    "@sentry/types" "7.21.1"
-    "@sentry/utils" "7.21.1"
-    tslib "^1.9.3"
+"@remix-run/router@1.20.0":
+  version "1.20.0"
+  resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4"
+  integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==
+
+"@sentry-internal/browser-utils@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.37.1.tgz#374028d8e37047aeda14b226707e6601de65996e"
+  integrity sha512-OSR/V5GCsSCG7iapWtXCT/y22uo3HlawdEgfM1NIKk1mkP15UyGQtGEzZDdih2H+SNuX1mp9jQLTjr5FFp1A5w==
+  dependencies:
+    "@sentry/core" "8.37.1"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
+
+"@sentry-internal/feedback@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-8.37.1.tgz#e2d5fc934ca3b4925a5f5d0e63549830a1cf147e"
+  integrity sha512-Se25NXbSapgS2S+JssR5YZ48b3OY4UGmAuBOafgnMW91LXMxRNWRbehZuNUmjjHwuywABMxjgu+Yp5uJDATX+g==
+  dependencies:
+    "@sentry/core" "8.37.1"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
+
+"@sentry-internal/replay-canvas@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-8.37.1.tgz#e8a5e350e486b16938b3dd99886be23b7b6eff18"
+  integrity sha512-1JLAaPtn1VL5vblB0BMELFV0D+KUm/iMGsrl4/JpRm0Ws5ESzQl33DhXVv1IX/ZAbx9i14EjR7MG9+Hj70tieQ==
+  dependencies:
+    "@sentry-internal/replay" "8.37.1"
+    "@sentry/core" "8.37.1"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
+
+"@sentry-internal/replay@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-8.37.1.tgz#6dc2e3955879f6e7ab830db1ddee54e0a9b401f3"
+  integrity sha512-E/Plhisk/pXJjOdOU12sg8m/APTXTA21iEniidP6jW3/+O0tD/H/UovEqa4odNTqxPMa798xHQSQNt5loYiaLA==
+  dependencies:
+    "@sentry-internal/browser-utils" "8.37.1"
+    "@sentry/core" "8.37.1"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
+
+"@sentry/browser@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-8.37.1.tgz#2e6e4accc395ad9e6313e07b09415370c71e5874"
+  integrity sha512-5ym+iGiIpjIKKpMWi9S3/tXh9xneS+jqxwRTJqed3cb8i4ydfMAAP8sM3U8xMCWWABpWyIUW+fpewC0tkhE1aQ==
+  dependencies:
+    "@sentry-internal/browser-utils" "8.37.1"
+    "@sentry-internal/feedback" "8.37.1"
+    "@sentry-internal/replay" "8.37.1"
+    "@sentry-internal/replay-canvas" "8.37.1"
+    "@sentry/core" "8.37.1"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
 
 "@sentry/browser@^6.0.1":
   version "6.19.7"
@@ -2587,14 +2404,13 @@
     "@sentry/utils" "6.19.7"
     tslib "^1.9.3"
 
-"@sentry/core@7.21.1":
-  version "7.21.1"
-  resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.21.1.tgz#d0423282d90875625802dfe380f9657e9242b72b"
-  integrity sha512-Og5wEEsy24fNvT/T7IKjcV4EvVK5ryY2kxbJzKY6GU2eX+i+aBl+n/vp7U0Es351C/AlTkS+0NOUsp2TQQFxZA==
+"@sentry/core@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry/core/-/core-8.37.1.tgz#4bafb25c762ec8680874056f6160df276c1cc7c6"
+  integrity sha512-82csXby589iDupM3VgCHJeWZagUyEEaDnbFcoZ/Z91QX2Sjq8FcF5OsforoXjw09i0XTFqlkFAnQVpDBmMXcpQ==
   dependencies:
-    "@sentry/types" "7.21.1"
-    "@sentry/utils" "7.21.1"
-    tslib "^1.9.3"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
 
 "@sentry/hub@6.19.7":
   version "6.19.7"
@@ -2614,36 +2430,26 @@
     "@sentry/types" "6.19.7"
     tslib "^1.9.3"
 
-"@sentry/react@^7.21.1":
-  version "7.21.1"
-  resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.21.1.tgz#275e6fd46212f608f382c7dde46d21e748f93491"
-  integrity sha512-w91PIUyX07mErKgrBQA+7ID8zFKrYDUYSOrFSHufg5DdPq4EpHiNDe/Yngg3e9ELhtr1AbCnEvx9wlvqLi3nZQ==
+"@sentry/react@^8.26.0":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry/react/-/react-8.37.1.tgz#25ba2703b79436c9154e6f287959a8a3c040e8cb"
+  integrity sha512-HanDqBFTgIUhUsYztAHhSti+sEhQ8YopAymXgnpqkJ7j1PLHXZgQAre6M4Uvixu28WS5MDHC1onnAIBDgYRDYw==
   dependencies:
-    "@sentry/browser" "7.21.1"
-    "@sentry/types" "7.21.1"
-    "@sentry/utils" "7.21.1"
+    "@sentry/browser" "8.37.1"
+    "@sentry/core" "8.37.1"
+    "@sentry/types" "8.37.1"
+    "@sentry/utils" "8.37.1"
     hoist-non-react-statics "^3.3.2"
-    tslib "^1.9.3"
-
-"@sentry/tracing@^7.21.1":
-  version "7.21.1"
-  resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.21.1.tgz#db02643e84960f1ea14b35fe75a93fc0bbca1fcb"
-  integrity sha512-b1BTPsRaNQpohzegoz59KGuBl+To651vEq0vMS4tCzSyIdxkYso3JCrjDdEqW/2MliQYANNVrUai2bmwmU9h1g==
-  dependencies:
-    "@sentry/core" "7.21.1"
-    "@sentry/types" "7.21.1"
-    "@sentry/utils" "7.21.1"
-    tslib "^1.9.3"
 
 "@sentry/types@6.19.7":
   version "6.19.7"
   resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.7.tgz#c6b337912e588083fc2896eb012526cf7cfec7c7"
   integrity sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==
 
-"@sentry/types@7.21.1":
-  version "7.21.1"
-  resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.21.1.tgz#408a7b95a66ddc30c4359979594e03bee8f9fbdc"
-  integrity sha512-3/IKnd52Ol21amQvI+kz+WB76s8/LR5YvFJzMgIoI2S8d82smIr253zGijRXxHPEif8kMLX4Yt+36VzrLxg6+A==
+"@sentry/types@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry/types/-/types-8.37.1.tgz#e92a7d346cfa29116568f4ffb58f65caedee0149"
+  integrity sha512-ryMOTROLSLINKFEbHWvi7GigNrsQhsaScw2NddybJGztJQ5UhxIGESnxGxWCufBmWFDwd7+5u0jDPCVUJybp7w==
 
 "@sentry/utils@6.19.7":
   version "6.19.7"
@@ -2653,23 +2459,12 @@
     "@sentry/types" "6.19.7"
     tslib "^1.9.3"
 
-"@sentry/utils@7.21.1":
-  version "7.21.1"
-  resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.21.1.tgz#96582345178015fd32fe9159c25c44ccf2f99d2a"
-  integrity sha512-F0W0AAi8tgtTx6ApZRI2S9HbXEA9ENX1phTZgdNNWcMFm1BNbc21XEwLqwXBNjub5nlA6CE8xnjXRgdZKx4kzQ==
+"@sentry/utils@8.37.1":
+  version "8.37.1"
+  resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-8.37.1.tgz#6e020cd222d56d79953ea9d4630d91b3e323ceda"
+  integrity sha512-Qtn2IfpII12K17txG/ZtTci35XYjYi4CxbQ3j7nXY7toGv/+MqPXwV5q2i9g94XaSXlE5Wy9/hoCZoZpZs/djA==
   dependencies:
-    "@sentry/types" "7.21.1"
-    tslib "^1.9.3"
-
-"@simbathesailor/use-what-changed@^2.0.0":
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/@simbathesailor/use-what-changed/-/use-what-changed-2.0.0.tgz#7f82d78f92c8588b5fadd702065dde93bd781403"
-  integrity sha512-ulBNrPSvfho9UN6zS2fii3AsdEcp2fMaKeqUZZeCNPaZbB6aXyTUhpEN9atjMAbu/eyK3AY8L4SYJUG62Ekocw==
-
-"@sinclair/typebox@^0.24.1":
-  version "0.24.43"
-  resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.43.tgz#2e2bce0e5e493aaf639beed0cd6c88cfde7dd3d7"
-  integrity sha512-1orQTvtazZmsPeBroJjysvsOQCYV2yjWlebkSY38pl5vr2tdLjEJ+LoxITlGNZaH2RE19WlAwQMkH/7C14wLfw==
+    "@sentry/types" "8.37.1"
 
 "@sinclair/typebox@^0.27.8":
   version "0.27.8"
@@ -2682,9 +2477,9 @@
   integrity sha512-5ezb/dBSTWtKQ4sLQwMgOJyREXJcZZkTMbendMwKrXTghUhWjZhstzkkmt4/WkFy/GSTSGzfJOKU7dEXv3C/XQ==
 
 "@sinonjs/commons@^1.7.0":
-  version "1.8.3"
-  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
-  integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+  version "1.8.6"
+  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9"
+  integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==
   dependencies:
     type-detect "4.0.8"
 
@@ -2695,7 +2490,7 @@
   dependencies:
     "@sinonjs/commons" "^1.7.0"
 
-"@testing-library/dom@^9.0.0":
+"@testing-library/dom@^9.0.0", "@testing-library/dom@^9.3.3":
   version "9.3.4"
   resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce"
   integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==
@@ -2709,38 +2504,23 @@
     lz-string "^1.5.0"
     pretty-format "^27.0.2"
 
-"@testing-library/dom@^9.3.3":
-  version "9.3.3"
-  resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5"
-  integrity sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/runtime" "^7.12.5"
-    "@types/aria-query" "^5.0.1"
-    aria-query "5.1.3"
-    chalk "^4.1.0"
-    dom-accessibility-api "^0.5.9"
-    lz-string "^1.5.0"
-    pretty-format "^27.0.2"
-
 "@testing-library/jest-dom@^6.4.2":
-  version "6.4.2"
-  resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz#38949f6b63722900e2d75ba3c6d9bf8cffb3300e"
-  integrity sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==
+  version "6.6.3"
+  resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz#26ba906cf928c0f8172e182c6fe214eb4f9f2bd2"
+  integrity sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==
   dependencies:
-    "@adobe/css-tools" "^4.3.2"
-    "@babel/runtime" "^7.9.2"
+    "@adobe/css-tools" "^4.4.0"
     aria-query "^5.0.0"
     chalk "^3.0.0"
     css.escape "^1.5.1"
     dom-accessibility-api "^0.6.3"
-    lodash "^4.17.15"
+    lodash "^4.17.21"
     redent "^3.0.0"
 
 "@testing-library/react@^14.3.0":
-  version "14.3.0"
-  resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.3.0.tgz#8183eb5a5f465b5b8cc495fcbd9bad0a16b8dd3b"
-  integrity sha512-AYJGvNFMbCa5vt1UtDCa/dcaABrXq8gph6VN+cffIx0UeA0qiGqS+sT60+sb+Gjc8tGXdECWYQgaF0khf8b+Lg==
+  version "14.3.1"
+  resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.3.1.tgz#29513fc3770d6fb75245c4e1245c470e4ffdd830"
+  integrity sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==
   dependencies:
     "@babel/runtime" "^7.12.5"
     "@testing-library/dom" "^9.0.0"
@@ -2767,257 +2547,257 @@
   integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==
 
 "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7":
-  version "7.1.19"
-  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
-  integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==
+  version "7.20.5"
+  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+  integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
   dependencies:
-    "@babel/parser" "^7.1.0"
-    "@babel/types" "^7.0.0"
+    "@babel/parser" "^7.20.7"
+    "@babel/types" "^7.20.7"
     "@types/babel__generator" "*"
     "@types/babel__template" "*"
     "@types/babel__traverse" "*"
 
 "@types/babel__generator@*":
-  version "7.6.4"
-  resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
-  integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
+  version "7.6.8"
+  resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab"
+  integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==
   dependencies:
     "@babel/types" "^7.0.0"
 
 "@types/babel__template@*":
-  version "7.4.1"
-  resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
-  integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
+  version "7.4.4"
+  resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+  integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
   dependencies:
     "@babel/parser" "^7.1.0"
     "@babel/types" "^7.0.0"
 
 "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
-  version "7.17.1"
-  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.17.1.tgz#1a0e73e8c28c7e832656db372b779bfd2ef37314"
-  integrity sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==
+  version "7.20.6"
+  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7"
+  integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==
   dependencies:
-    "@babel/types" "^7.3.0"
+    "@babel/types" "^7.20.7"
 
-"@types/d3-array@^2":
-  version "2.12.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-2.12.3.tgz#8d16d51fb04ad5a5a8ebe14eb8263a579f1efdd1"
-  integrity sha512-hN879HLPTVqZV3FQEXy7ptt083UXwguNbnxdTGzVW4y4KjX5uyNKljrQixZcSJfLyFirbpUokxpXtvR+N5+KIg==
+"@types/d3-array@*":
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5"
+  integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==
 
-"@types/d3-axis@^2":
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-2.1.3.tgz#348cca877f6643030aa8c866d08ccae06821a0e2"
-  integrity sha512-QjXjwZ0xzyrW2ndkmkb09ErgWDEYtbLBKGui73QLMFm3woqWpxptfD5Y7vqQdybMcu7WEbjZ5q+w2w5+uh2IjA==
+"@types/d3-axis@*":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795"
+  integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==
   dependencies:
-    "@types/d3-selection" "^2"
+    "@types/d3-selection" "*"
 
-"@types/d3-brush@^2":
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-2.1.2.tgz#c75890d1ccaef24fba1811daae3f896c1806418b"
-  integrity sha512-DnZmjdK1ycX1CMiW9r5E3xSf1tL+bp3yob1ON8bf0xB0/odfmGXeYOTafU+2SmU1F0/dvcqaO4SMjw62onOu6A==
+"@types/d3-brush@*":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c"
+  integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==
   dependencies:
-    "@types/d3-selection" "^2"
+    "@types/d3-selection" "*"
 
-"@types/d3-chord@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-2.0.3.tgz#3009b792b754da964d893b4269d1fe7757f21370"
-  integrity sha512-koIqSNQLPRQPXt7c55hgRF6Lr9Ps72r1+Biv55jdYR+SHJ463MsB2lp4ktzttFNmrQw/9yWthf/OmSUj5dNXKw==
+"@types/d3-chord@*":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d"
+  integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==
 
-"@types/d3-color@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82"
-  integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w==
+"@types/d3-color@*":
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2"
+  integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==
 
-"@types/d3-contour@^2":
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-2.0.4.tgz#2fc5aa8949c1a1d12d183633603923025e3d14fd"
-  integrity sha512-WMac1xV/mXAgkgr5dUvzsBV5OrgNZDBDpJk9s3v2SadTqGgDRirKABb2Ek2H1pFlYVH4Oly9XJGnuzxKDduqWA==
+"@types/d3-contour@*":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231"
+  integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==
   dependencies:
-    "@types/d3-array" "^2"
+    "@types/d3-array" "*"
     "@types/geojson" "*"
 
-"@types/d3-delaunay@^5":
-  version "5.3.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-5.3.1.tgz#47ae03af6b78cb3aa39d3d3c42ca71daca488aef"
-  integrity sha512-F6itHi2DxdatHil1rJ2yEFUNhejj8+0Acd55LZ6Ggwbdoks0+DxVY2cawNj16sjCBiWvubVlh6eBMVsYRNGLew==
+"@types/d3-delaunay@*":
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1"
+  integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==
 
-"@types/d3-dispatch@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-2.0.1.tgz#d7dc50f9b679996ccf70f3c79dbbf99505a93107"
-  integrity sha512-eT2K8uG3rXkmRiCpPn0rNrekuSLdBfV83vbTvfZliA5K7dbeaqWS/CBHtJ9SQoF8aDTsWSY4A0RU67U/HcKdJQ==
+"@types/d3-dispatch@*":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7"
+  integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==
 
-"@types/d3-drag@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-2.0.2.tgz#ed538d24456c839967a9ac7aab5e1b63b28bac7f"
-  integrity sha512-m9USoFaTgVw2mmE7vLjWTApT9dMxMlql/dl3Gj503x+1a2n6K455iDWydqy2dfCpkUBCoF82yRGDgcSk9FUEyQ==
+"@types/d3-drag@*":
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02"
+  integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==
   dependencies:
-    "@types/d3-selection" "^2"
+    "@types/d3-selection" "*"
 
-"@types/d3-dsv@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-2.0.2.tgz#e10fa57576b50ded27e261db9984b9a92efec2f3"
-  integrity sha512-T4aL2ZzaILkLGKbxssipYVRs8334PSR9FQzTGftZbc3jIPGkiXXS7qUCh8/q8UWFzxBZQ92dvR0v7+AM9wL2PA==
+"@types/d3-dsv@*":
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17"
+  integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==
 
-"@types/d3-ease@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-2.0.2.tgz#e6fadfffcf5e93bca1629699ad8ee0f61d2129fb"
-  integrity sha512-29Y73Tg6o6aL+3/S/kEun84m5BO4bjRNau6pMWv9N9rZHcJv/O/07mW6EjqxrePZZS64fj0wiB5LMHr4Jzf3eQ==
+"@types/d3-ease@*":
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b"
+  integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==
 
-"@types/d3-fetch@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-2.0.2.tgz#628c65d14b3a0d02fe1b9c2f3098b81a47e370bc"
-  integrity sha512-sllsCSWrNdSvzOJWN5RnxkmtvW9pCttONGajSxHX9FUQ9kOkGE391xlz6VDBdZxLnpwjp3I+mipbwsaCjq4m5A==
+"@types/d3-fetch@*":
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980"
+  integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==
   dependencies:
-    "@types/d3-dsv" "^2"
+    "@types/d3-dsv" "*"
 
-"@types/d3-force@^2":
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-2.1.4.tgz#98919b87db8a0ca5011d189c598d69251d20344d"
-  integrity sha512-1XVRc2QbeUSL1FRVE53Irdz7jY+drTwESHIMVirCwkAAMB/yVC8ezAfx/1Alq0t0uOnphoyhRle1ht5CuPgSJQ==
+"@types/d3-force@*":
+  version "3.0.10"
+  resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a"
+  integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==
 
-"@types/d3-format@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-2.0.2.tgz#97b2ac314430ae9f7768cc9efba8b23b63af82ef"
-  integrity sha512-OhQPuTeeMhD9A0Ksqo4q1S9Z1Q57O/t4tTPBxBQxRB4IERnxeoEYLPe72fA/GYpPSUrfKZVOgLHidkxwbzLdJA==
+"@types/d3-format@*":
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90"
+  integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==
 
-"@types/d3-geo@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-2.0.3.tgz#4af0f33c9e796aad6c3fc0dd8cadda9886d1fea9"
-  integrity sha512-kFwLEMXq1mGJ2Eho7KrOUYvLcc2YTDeKj+kTFt87JlEbRQ0rgo8ZENNb5vTYmZrJ2xL/vVM5M7yqVZGOPH2JFg==
+"@types/d3-geo@*":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440"
+  integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==
   dependencies:
     "@types/geojson" "*"
 
-"@types/d3-hierarchy@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-2.0.2.tgz#afd09d509c36e8cd4907333556f8b591f23589e9"
-  integrity sha512-6PlBRwbjUPPt0ZFq/HTUyOAdOF3p73EUYots74lHMUyAVtdFSOS/hAeNXtEIM9i7qRDntuIblXxHGUMb9MuNRA==
+"@types/d3-hierarchy@*":
+  version "3.1.7"
+  resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b"
+  integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==
 
-"@types/d3-interpolate@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz#78eddf7278b19e48e8652603045528d46897aba0"
-  integrity sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw==
+"@types/d3-interpolate@*":
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c"
+  integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==
   dependencies:
-    "@types/d3-color" "^2"
+    "@types/d3-color" "*"
 
-"@types/d3-path@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.2.tgz#6052f38f6186319769dfabab61b5514b0e02c75c"
-  integrity sha512-3YHpvDw9LzONaJzejXLOwZ3LqwwkoXb9LI2YN7Hbd6pkGo5nIlJ09ul4bQhBN4hQZJKmUpX8HkVqbzgUKY48cg==
+"@types/d3-path@*":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.0.tgz#2b907adce762a78e98828f0b438eaca339ae410a"
+  integrity sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==
 
-"@types/d3-polygon@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-2.0.1.tgz#c2056594f85b512bc2b4f741caddd4b5448bc115"
-  integrity sha512-X3XTIwBxlzRIWe4yaD1KsmcfItjSPLTGL04QDyP08jyHDVsnz3+NZJMwtD4vCaTAVpGSjbqS+jrBo8cO2V/xMA==
+"@types/d3-polygon@*":
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c"
+  integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==
 
-"@types/d3-quadtree@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-2.0.2.tgz#e3cd92b4e05318f98b0a16e780ba99ce7b13eb77"
-  integrity sha512-KgWL4jlz8QJJZX01E4HKXJ9FLU94RTuObsAYqsPp8YOAcYDmEgJIQJ+ojZcnKUAnrUb78ik8JBKWas5XZPqJnQ==
+"@types/d3-quadtree@*":
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f"
+  integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==
 
-"@types/d3-random@^2":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-2.2.1.tgz#551edbb71cb317dea2cf9c76ebe059d311eefacb"
-  integrity sha512-5vvxn6//poNeOxt1ZwC7QU//dG9QqABjy1T7fP/xmFHY95GnaOw3yABf29hiu5SR1Oo34XcpyHFbzod+vemQjA==
+"@types/d3-random@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb"
+  integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==
 
-"@types/d3-scale-chromatic@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-2.0.1.tgz#495cbbae7273e0d0ff564cdc19aa6d2b9928da83"
-  integrity sha512-3EuZlbPu+pvclZcb1DhlymTWT2W+lYsRKBjvkH2ojDbCWDYavifqu1vYX9WGzlPgCgcS4Alhk1+zapXbGEGylQ==
+"@types/d3-scale-chromatic@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644"
+  integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==
 
-"@types/d3-scale@^3":
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06"
-  integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ==
+"@types/d3-scale@*":
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb"
+  integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==
   dependencies:
-    "@types/d3-time" "^2"
+    "@types/d3-time" "*"
 
-"@types/d3-selection@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-2.0.1.tgz#bc2816c96faff285d204dda72b79734d4f37d583"
-  integrity sha512-3mhtPnGE+c71rl/T5HMy+ykg7migAZ4T6gzU0HxpgBFKcasBrSnwRbYV1/UZR6o5fkpySxhWxAhd7yhjj8jL7g==
+"@types/d3-selection@*":
+  version "3.0.11"
+  resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3"
+  integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==
 
-"@types/d3-shape@^2":
-  version "2.1.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3"
-  integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ==
+"@types/d3-shape@*":
+  version "3.1.6"
+  resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.6.tgz#65d40d5a548f0a023821773e39012805e6e31a72"
+  integrity sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==
   dependencies:
-    "@types/d3-path" "^2"
+    "@types/d3-path" "*"
 
-"@types/d3-time-format@^3":
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-3.0.1.tgz#1680fb6c41ab3a85db261ede296626668592246a"
-  integrity sha512-5GIimz5IqaRsdnxs4YlyTZPwAMfALu/wA4jqSiuqgdbCxUZ2WjrnwANqOtoBJQgeaUTdYNfALJO0Yb0YrDqduA==
+"@types/d3-time-format@*":
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2"
+  integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==
 
-"@types/d3-time@^2":
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342"
-  integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg==
+"@types/d3-time@*":
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be"
+  integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==
 
-"@types/d3-timer@^2":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-2.0.1.tgz#ffb6620d290624f3726aa362c0c8a4b44c8d7200"
-  integrity sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA==
+"@types/d3-timer@*":
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70"
+  integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==
 
-"@types/d3-transition@^2":
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-2.0.2.tgz#d5ba1c26a3daeb0c5527d573d44b4c5ca9fae027"
-  integrity sha512-376TICEykdXOEA9uUIYpjshEkxfGwCPnkHUl8+6gphzKbf5NMnUhKT7wR59Yxrd9wtJ/rmE3SVLx6/8w4eY6Zg==
+"@types/d3-transition@*":
+  version "3.0.9"
+  resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706"
+  integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==
   dependencies:
-    "@types/d3-selection" "^2"
+    "@types/d3-selection" "*"
 
-"@types/d3-zoom@^2":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-2.0.3.tgz#9eef8763600fa8be11b8cb0ed9144a395df6dffb"
-  integrity sha512-9X9uDYKk2U8w775OHj36s9Q7GkNAnJKGw6+sbkP5DpHSjELwKvTGzEK6+IISYfLpJRL/V3mRXMhgDnnJ5LkwJg==
-  dependencies:
-    "@types/d3-interpolate" "^2"
-    "@types/d3-selection" "^2"
-
-"@types/d3@^6.0.0":
-  version "6.7.5"
-  resolved "https://registry.yarnpkg.com/@types/d3/-/d3-6.7.5.tgz#6ae8034ea21db10fa3e31db1f670c5887d91d8a3"
-  integrity sha512-TUZ6zuT/KIvbHSv81kwAiO5gG5aTuoiLGnWR/KxHJ15Idy/xmGUXaaF5zMG+UMIsndcGlSHTmrvwRgdvZlNKaA==
-  dependencies:
-    "@types/d3-array" "^2"
-    "@types/d3-axis" "^2"
-    "@types/d3-brush" "^2"
-    "@types/d3-chord" "^2"
-    "@types/d3-color" "^2"
-    "@types/d3-contour" "^2"
-    "@types/d3-delaunay" "^5"
-    "@types/d3-dispatch" "^2"
-    "@types/d3-drag" "^2"
-    "@types/d3-dsv" "^2"
-    "@types/d3-ease" "^2"
-    "@types/d3-fetch" "^2"
-    "@types/d3-force" "^2"
-    "@types/d3-format" "^2"
-    "@types/d3-geo" "^2"
-    "@types/d3-hierarchy" "^2"
-    "@types/d3-interpolate" "^2"
-    "@types/d3-path" "^2"
-    "@types/d3-polygon" "^2"
-    "@types/d3-quadtree" "^2"
-    "@types/d3-random" "^2"
-    "@types/d3-scale" "^3"
-    "@types/d3-scale-chromatic" "^2"
-    "@types/d3-selection" "^2"
-    "@types/d3-shape" "^2"
-    "@types/d3-time" "^2"
-    "@types/d3-time-format" "^3"
-    "@types/d3-timer" "^2"
-    "@types/d3-transition" "^2"
-    "@types/d3-zoom" "^2"
+"@types/d3-zoom@*":
+  version "3.0.8"
+  resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b"
+  integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==
+  dependencies:
+    "@types/d3-interpolate" "*"
+    "@types/d3-selection" "*"
+
+"@types/d3@^7.4.3":
+  version "7.4.3"
+  resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2"
+  integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==
+  dependencies:
+    "@types/d3-array" "*"
+    "@types/d3-axis" "*"
+    "@types/d3-brush" "*"
+    "@types/d3-chord" "*"
+    "@types/d3-color" "*"
+    "@types/d3-contour" "*"
+    "@types/d3-delaunay" "*"
+    "@types/d3-dispatch" "*"
+    "@types/d3-drag" "*"
+    "@types/d3-dsv" "*"
+    "@types/d3-ease" "*"
+    "@types/d3-fetch" "*"
+    "@types/d3-force" "*"
+    "@types/d3-format" "*"
+    "@types/d3-geo" "*"
+    "@types/d3-hierarchy" "*"
+    "@types/d3-interpolate" "*"
+    "@types/d3-path" "*"
+    "@types/d3-polygon" "*"
+    "@types/d3-quadtree" "*"
+    "@types/d3-random" "*"
+    "@types/d3-scale" "*"
+    "@types/d3-scale-chromatic" "*"
+    "@types/d3-selection" "*"
+    "@types/d3-shape" "*"
+    "@types/d3-time" "*"
+    "@types/d3-time-format" "*"
+    "@types/d3-timer" "*"
+    "@types/d3-transition" "*"
+    "@types/d3-zoom" "*"
 
 "@types/file-saver@^2.0.5":
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7"
-  integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ==
+  version "2.0.7"
+  resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.7.tgz#8dbb2f24bdc7486c54aa854eb414940bbd056f7d"
+  integrity sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==
 
 "@types/geojson@*":
-  version "7946.0.8"
-  resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.8.tgz#30744afdb385e2945e22f3b033f897f76b1f12ca"
-  integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==
+  version "7946.0.14"
+  resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.14.tgz#319b63ad6df705ee2a65a73ef042c8271e696613"
+  integrity sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==
 
 "@types/glob@^7.1.1":
   version "7.2.0"
@@ -3028,9 +2808,9 @@
     "@types/node" "*"
 
 "@types/graceful-fs@^4.1.2":
-  version "4.1.5"
-  resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
-  integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+  version "4.1.9"
+  resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4"
+  integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==
   dependencies:
     "@types/node" "*"
 
@@ -3041,23 +2821,23 @@
   dependencies:
     history "*"
 
-"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1":
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
-  integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
+"@types/hoist-non-react-statics@^3.3.0":
+  version "3.3.5"
+  resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494"
+  integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==
   dependencies:
     "@types/react" "*"
     hoist-non-react-statics "^3.3.0"
 
 "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
-  integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+  integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
 
 "@types/istanbul-lib-report@*":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
-  integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf"
+  integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==
   dependencies:
     "@types/istanbul-lib-coverage" "*"
 
@@ -3070,9 +2850,9 @@
     "@types/istanbul-lib-report" "*"
 
 "@types/istanbul-reports@^3.0.0":
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
-  integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54"
+  integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==
   dependencies:
     "@types/istanbul-lib-report" "*"
 
@@ -3085,55 +2865,57 @@
     pretty-format "^26.0.0"
 
 "@types/jest@^29.4.0":
-  version "29.4.0"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206"
-  integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==
+  version "29.5.14"
+  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5"
+  integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==
   dependencies:
     expect "^29.0.0"
     pretty-format "^29.0.0"
 
-"@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
-  version "7.0.11"
-  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
-  integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+  version "7.0.15"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+  integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
 
 "@types/lodash@^4.14.149", "@types/lodash@^4.14.170", "@types/lodash@^4.14.175":
-  version "4.14.182"
-  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2"
-  integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==
+  version "4.17.13"
+  resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.13.tgz#786e2d67cfd95e32862143abe7463a7f90c300eb"
+  integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==
 
 "@types/luxon@^3.0.0":
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.0.1.tgz#2b1657096473e24b049bdedf3710f99645f3a17f"
-  integrity sha512-/LAvk1cMOJt0ghzMFrZEvByUhsiEfeeT2IF53Le+Ki3A538yEL9pRZ7a6MuCxdrYK+YNqNIDmrKU/r2nnw04zQ==
+  version "3.4.2"
+  resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.4.2.tgz#e4fc7214a420173cea47739c33cdf10874694db7"
+  integrity sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==
 
 "@types/minimatch@*":
-  version "3.0.5"
-  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
-  integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
+  integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
 
 "@types/minimist@^1.2.0":
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
-  integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e"
+  integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==
 
 "@types/node-fetch@^2.5.7":
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da"
-  integrity sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==
+  version "2.6.11"
+  resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
+  integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
   dependencies:
     "@types/node" "*"
-    form-data "^3.0.0"
+    form-data "^4.0.0"
 
 "@types/node@*":
-  version "18.0.0"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
-  integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
+  version "22.9.0"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.0.tgz#b7f16e5c3384788542c72dc3d561a7ceae2c0365"
+  integrity sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==
+  dependencies:
+    undici-types "~6.19.8"
 
 "@types/normalize-package-data@^2.4.0":
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
-  integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+  integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
 
 "@types/object-hash@^2.0.0":
   version "2.2.1"
@@ -3141,50 +2923,43 @@
   integrity sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ==
 
 "@types/parse-json@^4.0.0":
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
-  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
+  integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
 
 "@types/prettier@^2.0.0":
-  version "2.6.3"
-  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.3.tgz#68ada76827b0010d0db071f739314fa429943d0a"
-  integrity sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==
+  version "2.7.3"
+  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
+  integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
 
 "@types/prop-types@*":
-  version "15.7.12"
-  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
-  integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
+  version "15.7.13"
+  resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
+  integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
 
 "@types/q@^1.5.1":
-  version "1.5.5"
-  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df"
-  integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==
-
-"@types/react-dom@^18.0.0":
-  version "18.2.24"
-  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759"
-  integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==
-  dependencies:
-    "@types/react" "*"
+  version "1.5.8"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837"
+  integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==
 
-"@types/react-dom@^18.2.11":
-  version "18.2.11"
-  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.11.tgz#4332c315544698a0875dfdb6e320dda59e1b3d58"
-  integrity sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg==
+"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.11":
+  version "18.3.1"
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.1.tgz#1e4654c08a9cdcfb6594c780ac59b55aad42fe07"
+  integrity sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==
   dependencies:
     "@types/react" "*"
 
 "@types/react-lottie@^1.2.3":
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/@types/react-lottie/-/react-lottie-1.2.6.tgz#4f351dfdf5f93a46a3a9714fbb319f1e0f030eaf"
-  integrity sha512-fvGJHD7SeUdVESHo7f7erRnXkTWaa/6Mo5TB+R0/ieSftKoFspA4sMlF2qMH6BljXI7ehFJbBtrD5bzDxPCkGg==
+  version "1.2.10"
+  resolved "https://registry.yarnpkg.com/@types/react-lottie/-/react-lottie-1.2.10.tgz#220f68a2dfa0d4b131ab4930e8bf166b9442c68c"
+  integrity sha512-rCd1p3US4ELKJlqwVnP0h5b24zt5p9OCvKUoNpYExLqwbFZMWEiJ6EGLMmH7nmq5V7KomBIbWO2X/XRFsL0vCA==
   dependencies:
     "@types/react" "*"
 
 "@types/react-redux@^7.1.20":
-  version "7.1.24"
-  resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.24.tgz#6caaff1603aba17b27d20f8ad073e4c077e975c0"
-  integrity sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==
+  version "7.1.34"
+  resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.34.tgz#83613e1957c481521e6776beeac4fd506d11bd0e"
+  integrity sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==
   dependencies:
     "@types/hoist-non-react-statics" "^3.3.0"
     "@types/react" "*"
@@ -3192,45 +2967,31 @@
     redux "^4.0.0"
 
 "@types/react-transition-group@^4.2.0":
-  version "4.4.5"
-  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
-  integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==
+  version "4.4.11"
+  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.11.tgz#d963253a611d757de01ebb241143b1017d5d63d5"
+  integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==
   dependencies:
     "@types/react" "*"
 
-"@types/react@*":
-  version "18.2.74"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.74.tgz#2d52eb80e4e7c4ea8812c89181d6d590b53f958c"
-  integrity sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw==
-  dependencies:
-    "@types/prop-types" "*"
-    csstype "^3.0.2"
-
-"@types/react@^18.2.25":
-  version "18.2.25"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.25.tgz#99fa44154132979e870ff409dc5b6e67f06f0199"
-  integrity sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw==
+"@types/react@*", "@types/react@^18.2.25":
+  version "18.3.12"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60"
+  integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==
   dependencies:
     "@types/prop-types" "*"
-    "@types/scheduler" "*"
     csstype "^3.0.2"
 
-"@types/redux-mock-store@^1.0.2":
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.3.tgz#895de4a364bc4836661570aec82f2eef5989d1fb"
-  integrity sha512-Wqe3tJa6x9MxMN4DJnMfZoBRBRak1XTPklqj4qkVm5VBpZnC8PSADf4kLuFQ9NAdHaowfWoEeUMz7NWc2GMtnA==
+"@types/redux-mock-store@^1.0.6":
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/@types/redux-mock-store/-/redux-mock-store-1.0.6.tgz#0a03b2655028b7cf62670d41ac1de5ca1b1f5958"
+  integrity sha512-eg5RDfhJTXuoJjOMyXiJbaDb1B8tfTaJixscmu+jOusj6adGC0Krntz09Tf4gJgXeCqCrM5bBMd+B7ez0izcAQ==
   dependencies:
     redux "^4.0.5"
 
-"@types/scheduler@*":
-  version "0.23.0"
-  resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.23.0.tgz#0a6655b3e2708eaabca00b7372fafd7a792a7b09"
-  integrity sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==
-
-"@types/semver@^7.3.12":
-  version "7.3.13"
-  resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
-  integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
+"@types/semver@^7.3.12", "@types/semver@^7.5.0":
+  version "7.5.8"
+  resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
+  integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
 
 "@types/stack-utils@^1.0.1":
   version "1.0.1"
@@ -3238,9 +2999,9 @@
   integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
 
 "@types/stack-utils@^2.0.0":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
-  integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
+  integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
 
 "@types/use-sync-external-store@^0.0.3":
   version "0.0.3"
@@ -3248,69 +3009,52 @@
   integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
 
 "@types/yargs-parser@*":
-  version "21.0.0"
-  resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
-  integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
+  version "21.0.3"
+  resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+  integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
 
 "@types/yargs@^15.0.0":
-  version "15.0.14"
-  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06"
-  integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==
+  version "15.0.19"
+  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.19.tgz#328fb89e46109ecbdb70c295d96ff2f46dfd01b9"
+  integrity sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==
   dependencies:
     "@types/yargs-parser" "*"
 
 "@types/yargs@^17.0.8":
-  version "17.0.13"
-  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.13.tgz#34cced675ca1b1d51fcf4d34c3c6f0fa142a5c76"
-  integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==
+  version "17.0.33"
+  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d"
+  integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==
   dependencies:
     "@types/yargs-parser" "*"
 
-"@typescript-eslint/eslint-plugin@^5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz#e4fbb4d6dd8dab3e733485c1a44a02189ae75364"
-  integrity sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==
-  dependencies:
-    "@eslint-community/regexpp" "^4.4.0"
-    "@typescript-eslint/scope-manager" "5.56.0"
-    "@typescript-eslint/type-utils" "5.56.0"
-    "@typescript-eslint/utils" "5.56.0"
-    debug "^4.3.4"
-    grapheme-splitter "^1.0.4"
-    ignore "^5.2.0"
-    natural-compare-lite "^1.4.0"
-    semver "^7.3.7"
-    tsutils "^3.21.0"
-
-"@typescript-eslint/parser@^5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.56.0.tgz#42eafb44b639ef1dbd54a3dbe628c446ca753ea6"
-  integrity sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==
+"@typescript-eslint/eslint-plugin@^6.0.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3"
+  integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==
   dependencies:
-    "@typescript-eslint/scope-manager" "5.56.0"
-    "@typescript-eslint/types" "5.56.0"
-    "@typescript-eslint/typescript-estree" "5.56.0"
+    "@eslint-community/regexpp" "^4.5.1"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/type-utils" "6.21.0"
+    "@typescript-eslint/utils" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
     debug "^4.3.4"
+    graphemer "^1.4.0"
+    ignore "^5.2.4"
+    natural-compare "^1.4.0"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
 
-"@typescript-eslint/parser@^6.7.5":
-  version "6.19.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.19.1.tgz#68a87bb21afaf0b1689e9cdce0e6e75bc91ada78"
-  integrity sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ==
+"@typescript-eslint/parser@^6.0.0", "@typescript-eslint/parser@^6.7.5":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b"
+  integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
   dependencies:
-    "@typescript-eslint/scope-manager" "6.19.1"
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/typescript-estree" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
     debug "^4.3.4"
 
-"@typescript-eslint/scope-manager@5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz#62b4055088903b5254fa20403010e1c16d6ab725"
-  integrity sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==
-  dependencies:
-    "@typescript-eslint/types" "5.56.0"
-    "@typescript-eslint/visitor-keys" "5.56.0"
-
 "@typescript-eslint/scope-manager@5.62.0":
   version "5.62.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c"
@@ -3319,51 +3063,56 @@
     "@typescript-eslint/types" "5.62.0"
     "@typescript-eslint/visitor-keys" "5.62.0"
 
-"@typescript-eslint/scope-manager@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz#2f527ee30703a6169a52b31d42a1103d80acd51b"
-  integrity sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w==
+"@typescript-eslint/scope-manager@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1"
+  integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==
+  dependencies:
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
+
+"@typescript-eslint/scope-manager@8.13.0", "@typescript-eslint/scope-manager@^8.12.1":
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz#2f4aed0b87d72360e64e4ea194b1fde14a59082e"
+  integrity sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==
+  dependencies:
+    "@typescript-eslint/types" "8.13.0"
+    "@typescript-eslint/visitor-keys" "8.13.0"
+
+"@typescript-eslint/type-utils@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e"
+  integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==
   dependencies:
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    "@typescript-eslint/utils" "6.21.0"
+    debug "^4.3.4"
+    ts-api-utils "^1.0.1"
 
-"@typescript-eslint/type-utils@5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz#e6f004a072f09c42e263dc50e98c70b41a509685"
-  integrity sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==
+"@typescript-eslint/type-utils@^8.0.0", "@typescript-eslint/type-utils@^8.12.1":
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz#8c8fa68490dcb9ae1687ffc7de8fbe23c26417bd"
+  integrity sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==
   dependencies:
-    "@typescript-eslint/typescript-estree" "5.56.0"
-    "@typescript-eslint/utils" "5.56.0"
+    "@typescript-eslint/typescript-estree" "8.13.0"
+    "@typescript-eslint/utils" "8.13.0"
     debug "^4.3.4"
-    tsutils "^3.21.0"
-
-"@typescript-eslint/types@5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.56.0.tgz#b03f0bfd6fa2afff4e67c5795930aff398cbd834"
-  integrity sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==
+    ts-api-utils "^1.3.0"
 
 "@typescript-eslint/types@5.62.0":
   version "5.62.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
   integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
 
-"@typescript-eslint/types@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.19.1.tgz#2d4c9d492a63ede15e7ba7d129bdf7714b77f771"
-  integrity sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg==
+"@typescript-eslint/types@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d"
+  integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==
 
-"@typescript-eslint/typescript-estree@5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz#48342aa2344649a03321e74cab9ccecb9af086c3"
-  integrity sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==
-  dependencies:
-    "@typescript-eslint/types" "5.56.0"
-    "@typescript-eslint/visitor-keys" "5.56.0"
-    debug "^4.3.4"
-    globby "^11.1.0"
-    is-glob "^4.0.3"
-    semver "^7.3.7"
-    tsutils "^3.21.0"
+"@typescript-eslint/types@8.13.0", "@typescript-eslint/types@^8.12.1":
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.13.0.tgz#3f35dead2b2491a04339370dcbcd17bbdfc204d8"
+  integrity sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==
 
 "@typescript-eslint/typescript-estree@5.62.0":
   version "5.62.0"
@@ -3378,13 +3127,13 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/typescript-estree@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz#796d88d88882f12e85bb33d6d82d39e1aea54ed1"
-  integrity sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA==
+"@typescript-eslint/typescript-estree@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46"
+  integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==
   dependencies:
-    "@typescript-eslint/types" "6.19.1"
-    "@typescript-eslint/visitor-keys" "6.19.1"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/visitor-keys" "6.21.0"
     debug "^4.3.4"
     globby "^11.1.0"
     is-glob "^4.0.3"
@@ -3392,21 +3141,44 @@
     semver "^7.5.4"
     ts-api-utils "^1.0.1"
 
-"@typescript-eslint/utils@5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.56.0.tgz#db64705409b9a15546053fb4deb2888b37df1f41"
-  integrity sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==
+"@typescript-eslint/typescript-estree@8.13.0", "@typescript-eslint/typescript-estree@^8.12.1":
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz#db8c93dd5437ca3ce417a255fb35ddc3c12c3e95"
+  integrity sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==
   dependencies:
-    "@eslint-community/eslint-utils" "^4.2.0"
-    "@types/json-schema" "^7.0.9"
-    "@types/semver" "^7.3.12"
-    "@typescript-eslint/scope-manager" "5.56.0"
-    "@typescript-eslint/types" "5.56.0"
-    "@typescript-eslint/typescript-estree" "5.56.0"
-    eslint-scope "^5.1.1"
-    semver "^7.3.7"
+    "@typescript-eslint/types" "8.13.0"
+    "@typescript-eslint/visitor-keys" "8.13.0"
+    debug "^4.3.4"
+    fast-glob "^3.3.2"
+    is-glob "^4.0.3"
+    minimatch "^9.0.4"
+    semver "^7.6.0"
+    ts-api-utils "^1.3.0"
+
+"@typescript-eslint/utils@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134"
+  integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.4.0"
+    "@types/json-schema" "^7.0.12"
+    "@types/semver" "^7.5.0"
+    "@typescript-eslint/scope-manager" "6.21.0"
+    "@typescript-eslint/types" "6.21.0"
+    "@typescript-eslint/typescript-estree" "6.21.0"
+    semver "^7.5.4"
+
+"@typescript-eslint/utils@8.13.0", "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.12.1":
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.13.0.tgz#f6d40e8b5053dcaeabbd2e26463857abf27d62c0"
+  integrity sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.4.0"
+    "@typescript-eslint/scope-manager" "8.13.0"
+    "@typescript-eslint/types" "8.13.0"
+    "@typescript-eslint/typescript-estree" "8.13.0"
 
-"@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.58.0":
+"@typescript-eslint/utils@^5.62.0":
   version "5.62.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86"
   integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==
@@ -3420,14 +3192,6 @@
     eslint-scope "^5.1.1"
     semver "^7.3.7"
 
-"@typescript-eslint/visitor-keys@5.56.0":
-  version "5.56.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz#f19eb297d972417eb13cb69b35b3213e13cc214f"
-  integrity sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==
-  dependencies:
-    "@typescript-eslint/types" "5.56.0"
-    eslint-visitor-keys "^3.3.0"
-
 "@typescript-eslint/visitor-keys@5.62.0":
   version "5.62.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e"
@@ -3436,14 +3200,27 @@
     "@typescript-eslint/types" "5.62.0"
     eslint-visitor-keys "^3.3.0"
 
-"@typescript-eslint/visitor-keys@6.19.1":
-  version "6.19.1"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz#2164073ed4fc34a5ff3b5e25bb5a442100454c4c"
-  integrity sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ==
+"@typescript-eslint/visitor-keys@6.21.0":
+  version "6.21.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47"
+  integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==
   dependencies:
-    "@typescript-eslint/types" "6.19.1"
+    "@typescript-eslint/types" "6.21.0"
     eslint-visitor-keys "^3.4.1"
 
+"@typescript-eslint/visitor-keys@8.13.0":
+  version "8.13.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz#e97b0d92b266ef38a1faf40a74da289b66683a5b"
+  integrity sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==
+  dependencies:
+    "@typescript-eslint/types" "8.13.0"
+    eslint-visitor-keys "^3.4.3"
+
+"@ungap/structured-clone@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+  integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
 "@webassemblyjs/ast@1.9.0":
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
@@ -3612,12 +3389,12 @@ abab@^2.0.3, abab@^2.0.5:
   resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
   integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
 
-abbrev@1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
-  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+abbrev@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf"
+  integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==
 
-accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
+accepts@~1.3.4, accepts@~1.3.8:
   version "1.3.8"
   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
   integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
@@ -3653,15 +3430,10 @@ acorn@^7.1.1, acorn@^7.4.0:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
-acorn@^8.2.4, acorn@^8.7.1:
-  version "8.7.1"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
-  integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
-
-acorn@^8.9.0:
-  version "8.10.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
-  integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
+acorn@^8.14.0, acorn@^8.2.4, acorn@^8.9.0:
+  version "8.14.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
+  integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
 
 add-stream@^1.0.0:
   version "1.0.0"
@@ -3709,14 +3481,14 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv
     uri-js "^4.2.2"
 
 ajv@^8.0.1:
-  version "8.11.0"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f"
-  integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
+  version "8.17.1"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+  integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
   dependencies:
-    fast-deep-equal "^3.1.1"
+    fast-deep-equal "^3.1.3"
+    fast-uri "^3.0.1"
     json-schema-traverse "^1.0.0"
     require-from-string "^2.0.2"
-    uri-js "^4.2.2"
 
 ansi-colors@^3.0.0:
   version "3.2.4"
@@ -3772,6 +3544,11 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
 
+ansi-regex@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
+  integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
+
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -3796,6 +3573,11 @@ ansi-styles@^5.0.0:
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
   integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
 
+ansi-styles@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+  integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
 ansi-wrap@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
@@ -3815,9 +3597,9 @@ anymatch@^2.0.0:
     normalize-path "^2.1.1"
 
 anymatch@^3.0.1, anymatch@^3.0.3, anymatch@~3.1.2:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
-  integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+  integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
   dependencies:
     normalize-path "^3.0.0"
     picomatch "^2.0.4"
@@ -3856,12 +3638,10 @@ aria-query@5.1.3:
   dependencies:
     deep-equal "^2.0.5"
 
-aria-query@^5.0.0, aria-query@^5.3.0:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e"
-  integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==
-  dependencies:
-    dequal "^2.0.3"
+aria-query@^5.0.0, aria-query@^5.3.2:
+  version "5.3.2"
+  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.2.tgz#93f81a43480e33a338f19163a3d10a50c01dcd59"
+  integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==
 
 arr-diff@^4.0.0:
   version "4.0.0"
@@ -3878,7 +3658,7 @@ arr-union@^3.1.0:
   resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
   integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
 
-array-buffer-byte-length@^1.0.0:
+array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
   integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
@@ -3901,37 +3681,16 @@ array-ify@^1.0.0:
   resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
   integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==
 
-array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.5:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb"
-  integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.19.5"
-    get-intrinsic "^1.1.1"
-    is-string "^1.0.7"
-
-array-includes@^3.1.6:
-  version "3.1.6"
-  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f"
-  integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
-    get-intrinsic "^1.1.3"
-    is-string "^1.0.7"
-
-array-includes@^3.1.7:
-  version "3.1.7"
-  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda"
-  integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==
+array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.6, array-includes@^3.1.8:
+  version "3.1.8"
+  resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+  integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
-    get-intrinsic "^1.2.1"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-object-atoms "^1.0.0"
+    get-intrinsic "^1.2.4"
     is-string "^1.0.7"
 
 array-union@^1.0.1:
@@ -3956,6 +3715,18 @@ array-unique@^0.3.2:
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
   integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
 
+array.prototype.findlast@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904"
+  integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
+    es-shim-unscopables "^1.0.2"
+
 array.prototype.flat@^1.3.1:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
@@ -3966,16 +3737,6 @@ array.prototype.flat@^1.3.1:
     es-abstract "^1.22.1"
     es-shim-unscopables "^1.0.0"
 
-array.prototype.flatmap@^1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183"
-  integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
-    es-shim-unscopables "^1.0.0"
-
 array.prototype.flatmap@^1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
@@ -3987,50 +3748,54 @@ array.prototype.flatmap@^1.3.2:
     es-shim-unscopables "^1.0.0"
 
 array.prototype.foreach@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/array.prototype.foreach/-/array.prototype.foreach-1.0.2.tgz#592b177c8d6abb84e14de1649eb6e7cc5eb9c9ae"
-  integrity sha512-gCOgyBKIaFL5hekfQLhsNmF0TY4Y5JdtOyFKtbSpL72oiCAZ9Zi7TFvcfSsM1LnBFMog1RYVJF0PHgtnY+U5nA==
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/array.prototype.foreach/-/array.prototype.foreach-1.0.7.tgz#e4bfbfb16ed9d9f04409e900ac85a7bb6a58f940"
+  integrity sha512-T6Y2wgc24suLW78a3Iq/Iu0zgucdBRtj11GElARgGZaqNC8ESFZV8qeJR9/I7bHCB3Vh5N6ATYUOBIZLLl9WCw==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.0"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
     es-array-method-boxes-properly "^1.0.0"
-    get-intrinsic "^1.1.1"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
     is-string "^1.0.7"
 
-array.prototype.reduce@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz#8167e80089f78bff70a99e20bd4201d4663b0a6f"
-  integrity sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==
+array.prototype.reduce@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7"
+  integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.2"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
     es-array-method-boxes-properly "^1.0.0"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
     is-string "^1.0.7"
 
-array.prototype.tosorted@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532"
-  integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==
+array.prototype.tosorted@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
+  integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
-    es-shim-unscopables "^1.0.0"
-    get-intrinsic "^1.1.3"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.3"
+    es-errors "^1.3.0"
+    es-shim-unscopables "^1.0.2"
 
-arraybuffer.prototype.slice@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12"
-  integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==
+arraybuffer.prototype.slice@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+  integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
   dependencies:
-    array-buffer-byte-length "^1.0.0"
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
-    get-intrinsic "^1.2.1"
-    is-array-buffer "^3.0.2"
+    array-buffer-byte-length "^1.0.1"
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.2.1"
+    get-intrinsic "^1.2.3"
+    is-array-buffer "^3.0.4"
     is-shared-array-buffer "^1.0.2"
 
 arrify@^1.0.1:
@@ -4038,15 +3803,14 @@ arrify@^1.0.1:
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
   integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
 
-asn1.js@^5.2.0:
-  version "5.4.1"
-  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
-  integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+asn1.js@^4.10.1:
+  version "4.10.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
   dependencies:
     bn.js "^4.0.0"
     inherits "^2.0.1"
     minimalistic-assert "^1.0.0"
-    safer-buffer "^2.1.0"
 
 asn1@~0.2.3:
   version "0.2.6"
@@ -4061,12 +3825,12 @@ assert-plus@1.0.0, assert-plus@^1.0.0:
   integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
 
 assert@^1.1.1:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
-  integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76"
+  integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==
   dependencies:
-    object-assign "^4.1.1"
-    util "0.10.3"
+    object.assign "^4.1.4"
+    util "^0.10.4"
 
 assign-symbols@^1.0.0:
   version "1.0.0"
@@ -4089,9 +3853,9 @@ astral-regex@^2.0.0:
   integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
 
 async-each@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
-  integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77"
+  integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==
 
 async-limiter@~1.0.0:
   version "1.0.1"
@@ -4108,17 +3872,17 @@ async@3.2.3:
   resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9"
   integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==
 
-async@^2.6.2:
+async@^2.6.4:
   version "2.6.4"
   resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
   integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
   dependencies:
     lodash "^4.17.14"
 
-async@^3.2.2, async@^3.2.3:
-  version "3.2.4"
-  resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
-  integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
+async@^3.2.2:
+  version "3.2.6"
+  resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
+  integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
 
 async@~0.9.0:
   version "0.9.2"
@@ -4130,13 +3894,6 @@ async@~1.0.0:
   resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
   integrity sha512-5mO7DX4CbJzp9zjaFXusQQ4tzKJARjNB1Ih1pVBi8wkbmXy/xzIDgEMXxWePLzt2OdFwaxfneIlT1nCiXubrPQ==
 
-asynciterator.prototype@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62"
-  integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==
-  dependencies:
-    has-symbols "^1.0.3"
-
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -4160,7 +3917,7 @@ autoprefixer@9.7.6:
     postcss "^7.0.27"
     postcss-value-parser "^4.0.3"
 
-available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.7:
+available-typed-arrays@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
   integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
@@ -4173,14 +3930,14 @@ aws-sign2@~0.7.0:
   integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
 
 aws4@^1.8.0:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
-  integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef"
+  integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==
 
-axe-core@=4.7.0:
-  version "4.7.0"
-  resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf"
-  integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==
+axe-core@^4.10.0:
+  version "4.10.2"
+  resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.2.tgz#85228e3e1d8b8532a27659b332e39b7fa0e022df"
+  integrity sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==
 
 axios@^0.21.1:
   version "0.21.4"
@@ -4190,20 +3947,18 @@ axios@^0.21.1:
     follow-redirects "^1.14.0"
 
 axios@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.0.tgz#4cb0d72213989dec08d4b10129e42063bcb3dc78"
-  integrity sha512-oCye5nHhTypzkdLIvF9SaHfr8UAquqCn1KY3j8vsrjeol8yohAdGxIpRPbF1bOLsx33HOAatdfMX1yzsj2cHwg==
+  version "1.7.7"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f"
+  integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
   dependencies:
-    follow-redirects "^1.15.0"
+    follow-redirects "^1.15.6"
     form-data "^4.0.0"
     proxy-from-env "^1.1.0"
 
-axobject-query@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a"
-  integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==
-  dependencies:
-    dequal "^2.0.3"
+axobject-query@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee"
+  integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==
 
 babel-core@7.0.0-bridge.0:
   version "7.0.0-bridge.0"
@@ -4259,13 +4014,6 @@ babel-loader@8.1.0:
     pify "^4.0.1"
     schema-utils "^2.6.5"
 
-babel-plugin-dynamic-import-node@^2.3.3:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
-  integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
-  dependencies:
-    object.assign "^4.1.0"
-
 babel-plugin-istanbul@^6.0.0:
   version "6.1.1"
   resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
@@ -4287,62 +4035,38 @@ babel-plugin-jest-hoist@^26.6.2:
     "@types/babel__core" "^7.0.0"
     "@types/babel__traverse" "^7.0.6"
 
-babel-plugin-macros@^2.6.1:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138"
-  integrity sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==
-  dependencies:
-    "@babel/runtime" "^7.7.2"
-    cosmiconfig "^6.0.0"
-    resolve "^1.12.0"
-
-babel-plugin-polyfill-corejs2@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
-  integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
-  dependencies:
-    "@babel/compat-data" "^7.13.11"
-    "@babel/helper-define-polyfill-provider" "^0.3.1"
-    semver "^6.1.1"
-
-babel-plugin-polyfill-corejs2@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d"
-  integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==
-  dependencies:
-    "@babel/compat-data" "^7.17.7"
-    "@babel/helper-define-polyfill-provider" "^0.3.2"
-    semver "^6.1.1"
-
-babel-plugin-polyfill-corejs3@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
-  integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
+babel-plugin-macros@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
+  integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
   dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.1"
-    core-js-compat "^3.21.0"
+    "@babel/runtime" "^7.12.5"
+    cosmiconfig "^7.0.0"
+    resolve "^1.19.0"
 
-babel-plugin-polyfill-corejs3@^0.5.3:
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7"
-  integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==
+babel-plugin-polyfill-corejs2@^0.4.10:
+  version "0.4.11"
+  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33"
+  integrity sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==
   dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.2"
-    core-js-compat "^3.21.0"
+    "@babel/compat-data" "^7.22.6"
+    "@babel/helper-define-polyfill-provider" "^0.6.2"
+    semver "^6.3.1"
 
-babel-plugin-polyfill-regenerator@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
-  integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
+babel-plugin-polyfill-corejs3@^0.10.6:
+  version "0.10.6"
+  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
+  integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
   dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.1"
+    "@babel/helper-define-polyfill-provider" "^0.6.2"
+    core-js-compat "^3.38.0"
 
-babel-plugin-polyfill-regenerator@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe"
-  integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==
+babel-plugin-polyfill-regenerator@^0.6.1:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e"
+  integrity sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==
   dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.2"
+    "@babel/helper-define-polyfill-provider" "^0.6.2"
 
 babel-polyfill@^6.26.0:
   version "6.26.0"
@@ -4389,22 +4113,25 @@ babel-preset-cozy-app@2.1.0:
     typescript "^4.5.2"
 
 babel-preset-current-node-syntax@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
-  integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30"
+  integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==
   dependencies:
     "@babel/plugin-syntax-async-generators" "^7.8.4"
     "@babel/plugin-syntax-bigint" "^7.8.3"
-    "@babel/plugin-syntax-class-properties" "^7.8.3"
-    "@babel/plugin-syntax-import-meta" "^7.8.3"
+    "@babel/plugin-syntax-class-properties" "^7.12.13"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+    "@babel/plugin-syntax-import-attributes" "^7.24.7"
+    "@babel/plugin-syntax-import-meta" "^7.10.4"
     "@babel/plugin-syntax-json-strings" "^7.8.3"
-    "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-    "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
-    "@babel/plugin-syntax-top-level-await" "^7.8.3"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+    "@babel/plugin-syntax-top-level-await" "^7.14.5"
 
 babel-preset-jest@^26.6.2:
   version "26.6.2"
@@ -4485,9 +4212,9 @@ bfj@^6.1.1:
     tryer "^1.0.1"
 
 big-integer@^1.6.44:
-  version "1.6.51"
-  resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
-  integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
+  version "1.6.52"
+  resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85"
+  integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==
 
 big.js@^3.1.3:
   version "3.2.0"
@@ -4505,9 +4232,9 @@ binary-extensions@^1.0.0:
   integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
 
 binary-extensions@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
-  integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+  integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
 
 bindings@^1.5.0:
   version "1.5.0"
@@ -4516,6 +4243,11 @@ bindings@^1.5.0:
   dependencies:
     file-uri-to-path "1.0.0"
 
+birecord@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/birecord/-/birecord-0.1.1.tgz#abc07c8187bf24fb1e0055cd9feb18b30e477a03"
+  integrity sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==
+
 bl@^2.0.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5"
@@ -4544,26 +4276,42 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
   integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
 
-bn.js@^5.0.0, bn.js@^5.1.1:
+bn.js@^5.2.1:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
   integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
 
-body-parser@1.20.0, body-parser@^1.19.0:
-  version "1.20.0"
-  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5"
-  integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+body-parser@1.19.0:
+  version "1.19.0"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+  integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
   dependencies:
-    bytes "3.1.2"
+    bytes "3.1.0"
     content-type "~1.0.4"
     debug "2.6.9"
+    depd "~1.1.2"
+    http-errors "1.7.2"
+    iconv-lite "0.4.24"
+    on-finished "~2.3.0"
+    qs "6.7.0"
+    raw-body "2.4.0"
+    type-is "~1.6.17"
+
+body-parser@1.20.3, body-parser@^1.19.0:
+  version "1.20.3"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+  integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+  dependencies:
+    bytes "3.1.2"
+    content-type "~1.0.5"
+    debug "2.6.9"
     depd "2.0.0"
     destroy "1.2.0"
     http-errors "2.0.0"
     iconv-lite "0.4.24"
     on-finished "2.4.1"
-    qs "6.10.3"
-    raw-body "2.5.1"
+    qs "6.13.0"
+    raw-body "2.5.2"
     type-is "~1.6.18"
     unpipe "1.0.0"
 
@@ -4594,13 +4342,6 @@ bowser@^2.4.0:
   resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.11.0.tgz#5ca3c35757a7aa5771500c70a73a9f91ef420a8f"
   integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==
 
-bplist-parser@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
-  integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
-  dependencies:
-    big-integer "^1.6.44"
-
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -4632,12 +4373,12 @@ braces@^2.2.2, braces@^2.3.1, braces@^2.3.2:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
-braces@^3.0.2, braces@~3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
-  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+braces@^3.0.2, braces@^3.0.3, braces@~3.0.2:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+  integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
   dependencies:
-    fill-range "^7.0.1"
+    fill-range "^7.1.1"
 
 brorand@^1.0.1, brorand@^1.1.0:
   version "1.1.0"
@@ -4656,7 +4397,7 @@ browser-process-hrtime@^1.0.0:
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
   integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
 
-browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+browserify-aes@^1.0.4, browserify-aes@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
   integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
@@ -4668,7 +4409,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-browserify-cipher@^1.0.0:
+browserify-cipher@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
   integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
@@ -4687,28 +4428,30 @@ browserify-des@^1.0.0:
     inherits "^2.0.1"
     safe-buffer "^5.1.2"
 
-browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
-  integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.1.tgz#06e530907fe2949dc21fc3c2e2302e10b1437238"
+  integrity sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==
   dependencies:
-    bn.js "^5.0.0"
-    randombytes "^2.0.1"
+    bn.js "^5.2.1"
+    randombytes "^2.1.0"
+    safe-buffer "^5.2.1"
 
-browserify-sign@^4.0.0:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3"
-  integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==
+browserify-sign@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208"
+  integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==
   dependencies:
-    bn.js "^5.1.1"
-    browserify-rsa "^4.0.1"
+    bn.js "^5.2.1"
+    browserify-rsa "^4.1.0"
     create-hash "^1.2.0"
     create-hmac "^1.1.7"
-    elliptic "^6.5.3"
+    elliptic "^6.5.5"
+    hash-base "~3.0"
     inherits "^2.0.4"
-    parse-asn1 "^5.1.5"
-    readable-stream "^3.6.0"
-    safe-buffer "^5.2.0"
+    parse-asn1 "^5.1.7"
+    readable-stream "^2.3.8"
+    safe-buffer "^5.2.1"
 
 browserify-zlib@^0.2.0:
   version "0.2.0"
@@ -4723,19 +4466,19 @@ browserslist-config-cozy@^0.3.1:
   integrity sha512-d3wUIrKK8OYUPpgY3FJdb2I3xoDLtia7s2hhNfVUvQMldhw/xivmbtrPlkDdtsOjXa/SXKNhJT45uiS1QOhqVg==
 
 browserslist-config-cozy@^0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/browserslist-config-cozy/-/browserslist-config-cozy-0.5.0.tgz#e62ba62dcef91fde9742faa7dec98e08bf8c0d51"
-  integrity sha512-R3l2v6LqWuoUEDIt0U3dFtObOcBgkCrs6YUB4GLF3C1oE26ltJEBpz3DUQRmIcWrjKQOTKlGHe9MgDsqyuxFNA==
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/browserslist-config-cozy/-/browserslist-config-cozy-0.5.2.tgz#cf96780ab5499b9a371d2767a01ad8056311dc1f"
+  integrity sha512-q6QkSW4acIMpzL0YkD9RuWMtThdnAh8yexlwXiJJBXhQxDPyCpkVh0Tre8nxOo76WMkqodd4i3uBvmJ0xAPvTQ==
 
-browserslist@^4.11.1, browserslist@^4.20.2, browserslist@^4.21.0, browserslist@^4.3.4:
-  version "4.21.1"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00"
-  integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==
+browserslist@^4.11.1, browserslist@^4.24.0, browserslist@^4.24.2, browserslist@^4.3.4:
+  version "4.24.2"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580"
+  integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==
   dependencies:
-    caniuse-lite "^1.0.30001359"
-    electron-to-chromium "^1.4.172"
-    node-releases "^2.0.5"
-    update-browserslist-db "^1.0.4"
+    caniuse-lite "^1.0.30001669"
+    electron-to-chromium "^1.5.41"
+    node-releases "^2.0.18"
+    update-browserslist-db "^1.1.1"
 
 bser@2.1.1:
   version "2.1.1"
@@ -4786,11 +4529,6 @@ buffer@^5.5.0:
     base64-js "^1.3.1"
     ieee754 "^1.1.13"
 
-builtin-modules@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
-  integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
-
 builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
@@ -4801,17 +4539,10 @@ builtins@^1.0.3:
   resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
   integrity sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==
 
-bundle-name@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
-  integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
-  dependencies:
-    run-applescript "^5.0.0"
-
 bundlemon-utils@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/bundlemon-utils/-/bundlemon-utils-1.0.0.tgz#9c3e10f09107568913db2e69a3d3317a82b00633"
-  integrity sha512-+rc1Zautuch9MT7+n4O7T1+ASxcudaxisAIBVqN2xjOCaA+wYn5lyQnMPx2Ky2Cg8N4GrvuSfjNopli/GFrqVQ==
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/bundlemon-utils/-/bundlemon-utils-1.2.1.tgz#5585df0072c04c572a52abe0dc794578f96813ff"
+  integrity sha512-ydFZrI68L5j6hB9y88XGlbOp2lEwZHsDZl31ljHoi+wKE32glbuXMU0d0vQJLiR7Eq6uS0nDNYSmeoFHiV9R2g==
   dependencies:
     bytes "^3.1.0"
 
@@ -4831,10 +4562,10 @@ bundlemon@^1.3.2:
     micromatch "^4.0.4"
     yup "^0.32.11"
 
-bytes@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
-  integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
+bytes@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
 bytes@3.1.2, bytes@^3.1.0:
   version "3.1.2"
@@ -4920,7 +4651,7 @@ cache-base@^1.0.1:
     union-value "^1.0.0"
     unset-value "^1.0.0"
 
-call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7:
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
   integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
@@ -4931,15 +4662,6 @@ call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.7:
     get-intrinsic "^1.2.4"
     set-function-length "^1.2.1"
 
-call-bind@^1.0.4, call-bind@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
-  integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
-  dependencies:
-    function-bind "^1.1.2"
-    get-intrinsic "^1.2.1"
-    set-function-length "^1.1.1"
-
 caller-callsite@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
@@ -4996,10 +4718,10 @@ camelcase@^6.0.0:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
   integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
 
-caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001359:
-  version "1.0.30001538"
-  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz"
-  integrity sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==
+caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001669:
+  version "1.0.30001677"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001677.tgz#27c2e2c637e007cfa864a16f7dfe7cde66b38b5f"
+  integrity sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==
 
 capture-exit@^2.0.0:
   version "2.0.0"
@@ -5040,7 +4762,7 @@ chalk@3, chalk@^3.0.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
-chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
+chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
   integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -5097,17 +4819,6 @@ check-types@^8.0.3:
   resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
   integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
 
-cheerio-select@^1.5.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.6.0.tgz#489f36604112c722afa147dedd0d4609c09e1696"
-  integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==
-  dependencies:
-    css-select "^4.3.0"
-    css-what "^6.0.1"
-    domelementtype "^2.2.0"
-    domhandler "^4.3.1"
-    domutils "^2.8.0"
-
 cheerio-select@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
@@ -5120,19 +4831,6 @@ cheerio-select@^2.1.0:
     domhandler "^5.0.3"
     domutils "^3.0.1"
 
-cheerio@1.0.0-rc.10, cheerio@^1.0.0-rc.3, cheerio@^1.0.0-rc.9:
-  version "1.0.0-rc.10"
-  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e"
-  integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==
-  dependencies:
-    cheerio-select "^1.5.0"
-    dom-serializer "^1.3.2"
-    domhandler "^4.2.0"
-    htmlparser2 "^6.1.0"
-    parse5 "^6.0.1"
-    parse5-htmlparser2-tree-adapter "^6.0.1"
-    tslib "^2.2.0"
-
 cheerio@1.0.0-rc.12:
   version "1.0.0-rc.12"
   resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683"
@@ -5146,6 +4844,23 @@ cheerio@1.0.0-rc.12:
     parse5 "^7.0.0"
     parse5-htmlparser2-tree-adapter "^7.0.0"
 
+cheerio@^1.0.0-rc.9:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81"
+  integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==
+  dependencies:
+    cheerio-select "^2.1.0"
+    dom-serializer "^2.0.0"
+    domhandler "^5.0.3"
+    domutils "^3.1.0"
+    encoding-sniffer "^0.2.0"
+    htmlparser2 "^9.1.0"
+    parse5 "^7.1.2"
+    parse5-htmlparser2-tree-adapter "^7.0.0"
+    parse5-parser-stream "^7.1.2"
+    undici "^6.19.5"
+    whatwg-mimetype "^4.0.0"
+
 chokidar@3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.0.2.tgz#0d1cd6d04eb2df0327446188cd13736a3367d681"
@@ -5161,21 +4876,6 @@ chokidar@3.0.2:
   optionalDependencies:
     fsevents "^2.0.6"
 
-"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.4.1:
-  version "3.5.3"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
-  integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
-  dependencies:
-    anymatch "~3.1.2"
-    braces "~3.0.2"
-    glob-parent "~5.1.2"
-    is-binary-path "~2.1.0"
-    is-glob "~4.0.1"
-    normalize-path "~3.0.0"
-    readdirp "~3.6.0"
-  optionalDependencies:
-    fsevents "~2.3.2"
-
 chokidar@^2.1.8:
   version "2.1.8"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@@ -5195,6 +4895,28 @@ chokidar@^2.1.8:
   optionalDependencies:
     fsevents "^1.2.7"
 
+chokidar@^3.0.0, chokidar@^3.4.1:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+  integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+  dependencies:
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+chokidar@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41"
+  integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==
+  dependencies:
+    readdirp "^4.0.1"
+
 chownr@^1.0.1, chownr@^1.1.1, chownr@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
@@ -5206,9 +4928,9 @@ chownr@^2.0.0:
   integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
 
 chrome-trace-event@^1.0.2:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
-  integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b"
+  integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==
 
 ci-info@^2.0.0:
   version "2.0.0"
@@ -5216,9 +4938,9 @@ ci-info@^2.0.0:
   integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
 
 ci-info@^3.2.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251"
-  integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug==
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+  integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
 
 cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
   version "1.0.4"
@@ -5250,15 +4972,10 @@ classificator@^0.3.3:
   dependencies:
     decimal.js "^10.0.0"
 
-classnames@^2.2.5, classnames@^2.2.6:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
-  integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
-
-classnames@^2.3.2:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924"
-  integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==
+classnames@^2.2.5, classnames@^2.2.6, classnames@^2.5.1:
+  version "2.5.1"
+  resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
+  integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
 
 clean-css@4.2.x, clean-css@^4.2.1:
   version "4.2.4"
@@ -5332,6 +5049,15 @@ cliui@^7.0.2:
     strip-ansi "^6.0.0"
     wrap-ansi "^7.0.0"
 
+cliui@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+  integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.1"
+    wrap-ansi "^7.0.0"
+
 clone-buffer@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
@@ -5357,9 +5083,9 @@ clone@^2.1.1:
   integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
 
 clsx@^1.0.4:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188"
-  integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12"
+  integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
 
 co@^4.6.0:
   version "4.6.0"
@@ -5391,9 +5117,9 @@ collapse-white-space@^1.0.2:
   integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
 
 collect-v8-coverage@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
-  integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9"
+  integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==
 
 collection-visit@^1.0.0:
   version "1.0.0"
@@ -5457,11 +5183,6 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@2, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0:
-  version "2.20.3"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
-  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-
 commander@2.17.x:
   version "2.17.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
@@ -5472,15 +5193,25 @@ commander@2.19.0, commander@~2.19.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
   integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
 
-commander@7.2.0:
+commander@7, commander@7.2.0:
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
   integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
 
-commander@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
-  integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
+commander@^10.0.0:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+  integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
+commander@^2.18.0, commander@^2.19.0, commander@^2.20.0:
+  version "2.20.3"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^6.1.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c"
+  integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==
 
 commander@^8.0.0:
   version "8.3.0"
@@ -5511,11 +5242,11 @@ compare-func@^2.0.0:
     dot-prop "^5.1.0"
 
 component-emitter@^1.2.1:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
-  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
+  integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
 
-compressible@~2.0.16:
+compressible@~2.0.18:
   version "2.0.18"
   resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
   integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
@@ -5523,16 +5254,16 @@ compressible@~2.0.16:
     mime-db ">= 1.43.0 < 2"
 
 compression@^1.7.4:
-  version "1.7.4"
-  resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
-  integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+  version "1.7.5"
+  resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.5.tgz#fdd256c0a642e39e314c478f6c2cd654edd74c93"
+  integrity sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==
   dependencies:
-    accepts "~1.3.5"
-    bytes "3.0.0"
-    compressible "~2.0.16"
+    bytes "3.1.2"
+    compressible "~2.0.18"
     debug "2.6.9"
+    negotiator "~0.6.4"
     on-headers "~1.0.2"
-    safe-buffer "5.1.2"
+    safe-buffer "5.2.1"
     vary "~1.1.2"
 
 concat-map@0.0.1:
@@ -5599,10 +5330,10 @@ content-disposition@0.5.4:
   dependencies:
     safe-buffer "5.2.1"
 
-content-type@~1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
-  integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+content-type@~1.0.4, content-type@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+  integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
 
 conventional-changelog-angular@^5.0.12:
   version "5.0.13"
@@ -5768,11 +5499,14 @@ conventional-recommended-bump@6.1.0:
     q "^1.5.1"
 
 convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
-  integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
-  dependencies:
-    safe-buffer "~5.1.1"
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+  integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+convert-source-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+  integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
 
 cookie-signature@1.0.6:
   version "1.0.6"
@@ -5784,10 +5518,10 @@ cookie@0.3.1:
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
   integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==
 
-cookie@0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b"
-  integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+cookie@0.7.1:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+  integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
 
 copy-concurrently@^1.0.0:
   version "1.0.5"
@@ -5837,18 +5571,17 @@ copy-webpack-plugin@6.4.1:
     serialize-javascript "^5.0.1"
     webpack-sources "^1.4.3"
 
-core-js-compat@^3.21.0, core-js-compat@^3.22.1:
-  version "3.23.3"
-  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.3.tgz#7d8503185be76bb6d8d592c291a4457a8e440aa9"
-  integrity sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==
+core-js-compat@^3.38.0, core-js-compat@^3.38.1:
+  version "3.39.0"
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.39.0.tgz#b12dccb495f2601dc860bdbe7b4e3ffa8ba63f61"
+  integrity sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==
   dependencies:
-    browserslist "^4.21.0"
-    semver "7.0.0"
+    browserslist "^4.24.2"
 
-core-js-pure@^3.20.2:
-  version "3.23.3"
-  resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.3.tgz#bcd02d3d8ec68ad871ef50d5ccbb248ddb54f401"
-  integrity sha512-XpoouuqIj4P+GWtdyV8ZO3/u4KftkeDVMfvp+308eGMhCrA3lVDSmAxO0c6GGOcmgVlaKDrgWVMo49h2ab/TDA==
+core-js-pure@^3.30.2:
+  version "3.39.0"
+  resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.39.0.tgz#aa0d54d70a15bdc13e7c853db87c10abc30d68f3"
+  integrity sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==
 
 core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
   version "2.6.12"
@@ -5856,9 +5589,9 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5:
   integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
 
 core-js@^3.6.5:
-  version "3.23.3"
-  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.23.3.tgz#3b977612b15da6da0c9cc4aec487e8d24f371112"
-  integrity sha512-oAKwkj9xcWNBAvGbT//WiCdOMpb9XQG92/Fe3ABFM/R16BsHgePG00mFOgKf7IsCtfj8tA1kHtf/VwErhriz5Q==
+  version "3.39.0"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.39.0.tgz#57f7647f4d2d030c32a72ea23a0555b2eaa30f83"
+  integrity sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==
 
 core-util-is@1.0.2:
   version "1.0.2"
@@ -5888,21 +5621,10 @@ cosmiconfig@^5.0.0:
     js-yaml "^3.13.1"
     parse-json "^4.0.0"
 
-cosmiconfig@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982"
-  integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==
-  dependencies:
-    "@types/parse-json" "^4.0.0"
-    import-fresh "^3.1.0"
-    parse-json "^5.0.0"
-    path-type "^4.0.0"
-    yaml "^1.7.2"
-
 cosmiconfig@^7.0.0:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
-  integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
+  integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
   dependencies:
     "@types/parse-json" "^4.0.0"
     import-fresh "^3.2.1"
@@ -5941,10 +5663,10 @@ cozy-app-publish@^0.33.0:
     tar "^6.1.11"
     verror "^1.10.1"
 
-cozy-bar@8.15.0:
-  version "8.15.0"
-  resolved "https://registry.yarnpkg.com/cozy-bar/-/cozy-bar-8.15.0.tgz#10e811f3d6abc976cfa0da79c550131b26c2e8d7"
-  integrity sha512-D1Oo2I65/wgqUbqQY3nVLF9R2krGvkS0STTdRbtcVTjg/usvJZ/bhOohepZDuO/zVPcbp8Oo7j6ZUQDgHk2qbw==
+cozy-bar@10.0.0:
+  version "10.0.0"
+  resolved "https://registry.yarnpkg.com/cozy-bar/-/cozy-bar-10.0.0.tgz#74f7b18225f9d7c569bf51442db957a6b3db444c"
+  integrity sha512-eZ5NDACEaiVxFBfxb1cRBsqwMl8+BNF0uyVow75qXzyVWLK/nnB1iPZ3I0SOCPHcTorzdH3L0iy52FAadF0jQg==
   dependencies:
     hammerjs "2.0.8"
     lodash.debounce "4.0.8"
@@ -5976,16 +5698,17 @@ cozy-client-js@^0.20.0:
     pouchdb-browser "7.0.0"
     pouchdb-find "7.0.0"
 
-cozy-client@29.2.0:
-  version "29.2.0"
-  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-29.2.0.tgz#d474fd4268311ae7e23af4966e189a83d348a4ab"
-  integrity sha512-BtWTB+s+YIqPxvvvyrWELVBxVuVfDeI7RFEU2gn+tU4Ef2AKLuciy3hBX14tuHiAB6U+FHYpqCDK2JW8SdNo8w==
+cozy-client@45.14.1:
+  version "45.14.1"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-45.14.1.tgz#dc0e77e93b48b0a8a302a6f7dc3217d8a6d046c1"
+  integrity sha512-K2Fm1J60XFeRyAhfPywSU9+Kj7FHVcBP+B2K/lwWVOS3dob/iCBlrjgpRNjViErY0kVevgemt3oscZjbnr0mdQ==
   dependencies:
     "@cozy/minilog" "1.0.0"
     "@types/jest" "^26.0.20"
     "@types/lodash" "^4.14.170"
     btoa "^1.2.1"
-    cozy-stack-client "^29.2.0"
+    cozy-stack-client "^45.13.0"
+    date-fns "2.29.3"
     json-stable-stringify "^1.0.1"
     lodash "^4.17.13"
     microee "^0.0.6"
@@ -6000,16 +5723,16 @@ cozy-client@29.2.0:
     sift "^6.0.0"
     url-search-params-polyfill "^8.0.0"
 
-cozy-client@40.6.0:
-  version "40.6.0"
-  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-40.6.0.tgz#69fb48acd23fc34c5b50e1e22533090cde7a42fa"
-  integrity sha512-iNpEzbU93EVW/0KybtzqIPTz3f+JbnlaT0mLmdoBBLPM+NUQFNx2FeV1q8l8qzVjVG/yvFtcE7kBDRswpocc2A==
+cozy-client@49.1.1:
+  version "49.1.1"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-49.1.1.tgz#076cd590fe06112a9fcfa93f9fad99269b563d5e"
+  integrity sha512-ORjQzl3LZNJVh7rWqjM2quSMsG9nq3JZRrhYWVXttjrL/bq9NTQ0EhQIm6MR7yUd3fKjjlIjIs4/Vhc9gFTCow==
   dependencies:
     "@cozy/minilog" "1.0.0"
     "@types/jest" "^26.0.20"
     "@types/lodash" "^4.14.170"
     btoa "^1.2.1"
-    cozy-stack-client "^40.2.1"
+    cozy-stack-client "^49.0.0"
     date-fns "2.29.3"
     json-stable-stringify "^1.0.1"
     lodash "^4.17.13"
@@ -6025,16 +5748,17 @@ cozy-client@40.6.0:
     sift "^6.0.0"
     url-search-params-polyfill "^8.0.0"
 
-cozy-client@^33.2.0:
-  version "33.4.0"
-  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-33.4.0.tgz#39e713656b3ce847dd453714564b665523001d09"
-  integrity sha512-2e8hg9pOHnmScpIyeHM4TjZ45hW/uTV+CCO7lS9LN1AsGsEdNdKjD+d4fvLYIX1zUcaqRDhFNUYzCCdz1t5Mag==
+cozy-client@^45.14.1:
+  version "45.15.0"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-45.15.0.tgz#bb95b20f331676ee09e425233c36758cca10ce38"
+  integrity sha512-/137/DInGvMTitlhqLrtKXa+7Co2dnlbvu1jRwZ9+qaFbKZ1NMCPYi5mBWVcRy2HHqB++ph9HrjXEORVVky0/g==
   dependencies:
     "@cozy/minilog" "1.0.0"
     "@types/jest" "^26.0.20"
     "@types/lodash" "^4.14.170"
     btoa "^1.2.1"
-    cozy-stack-client "^33.4.0"
+    cozy-stack-client "^45.13.0"
+    date-fns "2.29.3"
     json-stable-stringify "^1.0.1"
     lodash "^4.17.13"
     microee "^0.0.6"
@@ -6049,53 +5773,49 @@ cozy-client@^33.2.0:
     sift "^6.0.0"
     url-search-params-polyfill "^8.0.0"
 
-cozy-device-helper@>=2.1.0, cozy-device-helper@^2.1.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-2.2.1.tgz#d5822afd818919fa871527e6f78b0265fc1e009b"
-  integrity sha512-1zVQag2OI+6sEGEC70w77urnk4GpWa/ncvCYuyrOOgib4bH6v2YbBrymOD9T3MH0yVF/LVMnXnugSHQfhNLVhA==
+cozy-device-helper@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-3.1.0.tgz#140079bf4a6844b21d6ac0a3a2d75741dba15faa"
+  integrity sha512-KorbuWN+oZ+v7okbXQTbLuW6nt7IyVnIIsDXB3Ay6zdtl5nV13+fOGKeRsjaecgBDLSXWJ07j0ooT7l6orZpDg==
   dependencies:
     lodash "^4.17.19"
 
-cozy-device-helper@^1.7.5:
-  version "1.18.0"
-  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.18.0.tgz#45b37e68c30ec1104c8c40180b472d3662bc2534"
-  integrity sha512-/s9X5oUH/Fpu3NKx1RS5T/iYzpfOlBD3tRGGsjth4VDYhqATlApUZLghmzvFvskEeC4eCAvNYfEkyo9UPrZbFQ==
+cozy-device-helper@^2.1.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-2.7.0.tgz#573749997f18e5a1f11f720faec8c9bf2406beeb"
+  integrity sha512-jMzW7s4IDuMivbsP8fo1IWW1z5l0wJ0u440E0fQmdsi+Zm/L9GXFKthLuuceYqXlH6c/APUCfpozJqjFMMHU1A==
   dependencies:
     lodash "^4.17.19"
 
-cozy-device-helper@^2.5.0:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-2.5.0.tgz#4a5b18ad07a2c66c468988ae9daee014ba876e5b"
-  integrity sha512-+KKX6obYg8UmdmPvBuZDFMfzdSMOSKbnCf6ZIJTkW3Xs95aDZYhh/6x61Ok5+oTusHBL/khd6A+P1Qx5tL7mrw==
+cozy-device-helper@^3.0.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-3.4.1.tgz#e8edb82e1a767504fa002e9241ab1eed1ec16925"
+  integrity sha512-Wc/x+NUwaOzejXB5iQRuNI6AIl8eiQGUihMdxrAUKiSLSQi84dM1MS4pIp03LqMdCEbqQ55h+TOOBLFkUPaPEQ==
   dependencies:
     lodash "^4.17.19"
 
-cozy-doctypes@^1.83.8:
-  version "1.83.8"
-  resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.83.8.tgz#99ec864059034bd032f6f01e322b57fea130a5d3"
-  integrity sha512-S88VzjnfZTHo7Mix7M3qId0YF6gOmL+C0X2LZnQp6F2cEOKa7sOlDiMD18u2kfPwyvlxxM+tQBI9ArEM/Xqkog==
+cozy-doctypes@^1.83.8, cozy-doctypes@^1.85.3:
+  version "1.94.1"
+  resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.94.1.tgz#a4da30740afecb83e6280f90fc6a75a5732f5b74"
+  integrity sha512-bs0NxUR/qsccmmvFrZUr4ojvv3IDvf3onTyR8Hrd3Td5b3dZUT1OhLDbyzOUtdF2jPFexpYToZ6ofaY4gDbAyA==
   dependencies:
-    cozy-logger "^1.9.0"
+    cozy-logger "^1.13.1"
     date-fns "^1.30.1"
     es6-promise-pool "^2.5.0"
     lodash "^4.17.19"
     prop-types "^15.7.2"
 
-cozy-doctypes@^1.85.3:
-  version "1.85.3"
-  resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.85.3.tgz#9a59856161a4e54af248bec8ed6b1e8752bbbcff"
-  integrity sha512-ISHGpC4tlzcN4P8MzKV3vbsWmx6AfPIZjO60KSHNfHuD1TFfOaAWKQXpg2Eo4KWExImzRXmrs1uMTuYFEdYZTA==
+cozy-flags@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-4.0.0.tgz#047f9a93f826808bfd23ab206d0bf8235c162237"
+  integrity sha512-us+XDoqPCnDflu7gJrZAmE5SDmkIx2QEhs+fItQOf2JjnGpfBvmIhLMv51/P5INPL4bAQSUHE6ddwNFwOruqBw==
   dependencies:
-    cozy-logger "^1.9.1"
-    date-fns "^1.30.1"
-    es6-promise-pool "^2.5.0"
-    lodash "^4.17.19"
-    prop-types "^15.7.2"
+    microee "^0.0.6"
 
-cozy-flags@>2.8.6, cozy-flags@^2.8.7:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-2.9.0.tgz#9f458c0eb71f549a2ae12198d55de89434bff96b"
-  integrity sha512-2iezzIS3WtnZ+b8Kupsa7aN5KINebdISS9L5OpGc320wcdmHrHShpZaqkwCQWLxLqhaXalxxe6OIeFLS84pIrQ==
+cozy-flags@^2.8.7:
+  version "2.12.0"
+  resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-2.12.0.tgz#bc3d689db9c91389c28f053223142d4684573ef1"
+  integrity sha512-s0et8aWChaqY4rMKkNKDACflU2h5s6s9UVU1guU3Il9GqktSPrhvMo+ntHLnQb2l+yLL6xV1S6/rK0qniR1q0A==
   dependencies:
     microee "^0.0.6"
 
@@ -6118,11 +5838,12 @@ cozy-harvest-lib@9.26.14:
     react-markdown "^4.2.2"
     uuid "^3.3.2"
 
-cozy-intent@^2.13.0:
-  version "2.13.0"
-  resolved "https://registry.yarnpkg.com/cozy-intent/-/cozy-intent-2.13.0.tgz#662fd3b5155bed0ca8494b5773fe3c4ea55ef077"
-  integrity sha512-AW+62w4oGxiOGYNK8OEZ22c4/hNK88fBoIS2187qFvsnirsFhPEbbamoS0SJOjqiBdQQqoDfKgOFbXxWwrSNhg==
+cozy-intent@^2.23.0:
+  version "2.26.1"
+  resolved "https://registry.yarnpkg.com/cozy-intent/-/cozy-intent-2.26.1.tgz#445c34bbf4745f0a0ce2dc35e17b4341b57d2f2a"
+  integrity sha512-6DKotwAtHTddhVlYqF0bXzop+luT3OuXCJ/DK9Ewck1unGdWrp4iYmCPDvFVuLPSap84B0jmBdOx1cpQqnx/lQ==
   dependencies:
+    cozy-minilog "^3.6.1"
     post-me "0.4.5"
 
 cozy-interapp@^0.5.4:
@@ -6131,9 +5852,9 @@ cozy-interapp@^0.5.4:
   integrity sha512-laIL/ATYV9oZnmqS+LMoO9qzk8XjJ1v2/YrA1Po2rI8ia/MDgjYO07424x2RuvHhNOBPGjD+JmqwQ0rNDlLW+Q==
 
 cozy-jobs-cli@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/cozy-jobs-cli/-/cozy-jobs-cli-2.0.2.tgz#5e2c13e9d7a671e916b7f8b776b424ab81a178b0"
-  integrity sha512-sMQXBQNpiIBBz/gTsU9ssc+/FmjAgD2n2LbP3QhU0v/Xgunr3ooVzJYRkYaJnWnQRlUuav991GOJuLoMRGLvKQ==
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/cozy-jobs-cli/-/cozy-jobs-cli-2.4.4.tgz#41b72d1ceed93f268c623abc806bd5bdd8edf161"
+  integrity sha512-fXXAwfdxbPh4RqQhYCv7sM9+Lev4RW7TQK+mqJhJAA/i3LnlCYC/bmMHh7iWLzGRUYiOemKFjM7VJr1u57PZAg==
   dependencies:
     "@pollyjs/adapter-node-http" "5.1.1"
     "@pollyjs/core" "5.1.1"
@@ -6144,26 +5865,28 @@ cozy-jobs-cli@^2.0.0:
     cheerio "1.0.0-rc.12"
     cli-highlight "2.1.11"
     commander "7.2.0"
-    cozy-client "29.2.0"
+    cozy-client "45.14.1"
     cozy-device-helper "^2.1.0"
     cozy-flags "^2.8.7"
-    cozy-konnector-libs "^5.2.0"
+    cozy-konnector-libs "^5.12.1"
     cozy-logger "1.9.0"
+    node-fetch "2.7.0"
     open "8.4.0"
     pretty "2.0.0"
     strip-json-comments "3.1.1"
 
-cozy-keys-lib@>=4.1.9:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/cozy-keys-lib/-/cozy-keys-lib-4.2.1.tgz#98bc71eb08d830ca9d5d9876c4851c68a91557ce"
-  integrity sha512-Zg4hcC5NfoD7ZjlqZhyOLydLbX3GOA+cawr/s+PmQH2eeL5wV+9vpnpkv9SleEUspJ/HwV5J9bgEPBPhwNvbRw==
+cozy-keys-lib@>=6.0.0:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/cozy-keys-lib/-/cozy-keys-lib-6.1.1.tgz#a9674ef2977e6bc26110d101bb47e78bab3ae670"
+  integrity sha512-C98kCQjyYiWz/ElUMjUqIoYIhc5eWrF8r8WfFCVQCAvt9j1tRmwsTvWC70rA/5/i/QfuFOln7U9hXpn3rdDnow==
   dependencies:
     "@aspnet/signalr" "^1.1.4"
     "@aspnet/signalr-protocol-msgpack" "^1.1.0"
     "@cozy/minilog" "^1.0.0"
     big-integer "^1.6.44"
     classnames "^2.2.6"
-    cozy-device-helper "^1.7.5"
+    cozy-device-helper "^2.1.0"
+    cozy-logger "^1.10.1"
     lodash "^4.17.15"
     lunr "^2.3.6"
     microee "^0.0.6"
@@ -6174,18 +5897,19 @@ cozy-keys-lib@>=4.1.9:
     tldjs "^2.3.1"
     zxcvbn "^4.4.2"
 
-cozy-konnector-libs@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/cozy-konnector-libs/-/cozy-konnector-libs-5.2.0.tgz#5ec5abe21bf33fea9cd24b48ad3b3a098e1b4f08"
-  integrity sha512-L9nirvz66TGxaBFJ4siDDkRGLAoYv/8dMfdRbhlCHDxvbf6gMa2mOYhwrI9Tu2NFHt+R6UoqJb5LqHPZFAk9nA==
+cozy-konnector-libs@^5.12.1:
+  version "5.12.1"
+  resolved "https://registry.yarnpkg.com/cozy-konnector-libs/-/cozy-konnector-libs-5.12.1.tgz#06962950df0997fcf1cccd28574c722a81467676"
+  integrity sha512-9JWYeTzg4l9KTcSlTmtw/9ttWcXo11+dZ2LhN9D/AjQoe8HqmNhKDvbBc52GHBXjZK6GHGFyOX5QjAP2mxzDnQ==
   dependencies:
     babel-runtime "^6.26.0"
     bluebird "^3.7.2"
     bluebird-retry "^0.11.0"
+    body-parser "1.19.0"
     btoa "1.2.1"
     cheerio "^1.0.0-rc.9"
     classificator "^0.3.3"
-    cozy-client "^33.2.0"
+    cozy-client "^45.14.1"
     cozy-client-js "^0.20.0"
     cozy-device-helper "^2.1.0"
     cozy-doctypes "^1.83.8"
@@ -6194,18 +5918,20 @@ cozy-konnector-libs@^5.2.0:
     date-fns "^2.22.1"
     file-type "^16.5.0"
     geco "git+https://github.com/konnectors/geco.git#0.11.2"
+    lodash "^4.17.21"
     lodash-id "^0.14.0"
     lowdb "^1.0.0"
     mime-types "^2.1.31"
-    node-fetch "^2.6.1"
+    node-fetch "^2.7.0"
     raven "^2.6.4"
     raw-body "^2.4.1"
     request "^2.88.2"
     request-debug "^0.2.0"
     request-promise "^4.2.6"
     strip-json-comments "^3.1.1"
+    tough-cookie "^2.5.0"
 
-cozy-logger@1.9.0, cozy-logger@>1.7.0, cozy-logger@^1.3.0, cozy-logger@^1.8.0, cozy-logger@^1.9.0:
+cozy-logger@1.9.0:
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.9.0.tgz#e3a2323d9a2945ca10da5c318ff2f63544a54415"
   integrity sha512-x/iFwFuNTbG4lwgeKPv6HtdixY+CcJm47sRd2za09aS1zZMHnN3HX7fFgoSSgEqFhpnIO/PpP2pVqJ4orSCp0g==
@@ -6213,21 +5939,28 @@ cozy-logger@1.9.0, cozy-logger@>1.7.0, cozy-logger@^1.3.0, cozy-logger@^1.8.0, c
     chalk "^2.4.2"
     json-stringify-safe "5.0.1"
 
-cozy-logger@^1.9.1:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.9.1.tgz#d5eb5a007eae6b4612fc6cc5a82fd70fe8c435bb"
-  integrity sha512-9P8A4chfSsdx5P32upo9SDx+ZyQj1RuFuggHd6BgVbcFo7folCulk6TCFRFEekT2fIYHbT2nRDc0RTOdz98lYw==
+cozy-logger@>1.7.0, cozy-logger@^1.10.1, cozy-logger@^1.13.1, cozy-logger@^1.3.0, cozy-logger@^1.8.0, cozy-logger@^1.9.1:
+  version "1.13.1"
+  resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.13.1.tgz#70b1e2f17772d63386aad337bd7f64a22352bab1"
+  integrity sha512-8FsY0m5l02v1wtl4o8HOm/9UxAj9T0N9hEMkiioYX/npz5e/L6CecSt7yTfRqpa74+kachfJ7VpwkyedTJKlVw==
   dependencies:
     chalk "^2.4.2"
     json-stringify-safe "5.0.1"
 
-cozy-realtime@4.2.8:
-  version "4.2.8"
-  resolved "https://registry.yarnpkg.com/cozy-realtime/-/cozy-realtime-4.2.8.tgz#25954c6a9038019c742757617f75e82a33e7de13"
-  integrity sha512-HMZLTO/A8jqjvsBDlCrwzug+DdwoNIbkw5IvSSE0VPobdIiOo5q3W8WyLbCu9fwC7GijE/Nyfsk1PCfh10a16Q==
+cozy-minilog@^3.6.1:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/cozy-minilog/-/cozy-minilog-3.6.1.tgz#fff651df7cc9d5a21546761145bedf6cf67393a2"
+  integrity sha512-fVrUoJw9uAAYW2OyjfaUnRhW2c93g2hpuFOO1BBurW8VjJ2s96mLMRyhUTiEhPxiyRoEntjeUTRF998wzrMdWQ==
+  dependencies:
+    microee "0.0.6"
+
+cozy-realtime@5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/cozy-realtime/-/cozy-realtime-5.0.1.tgz#402d15a79e1b83b1e5e6a468e1cc95508fe2ebec"
+  integrity sha512-3mtZwTnqpVOvauQDUOYa8F5qKnOXBQbs4syBqGrNbMehowPLXJEy6B4xGcT/HGUZwpXRr7p5NFPV7zD8D6el1Q==
   dependencies:
     "@cozy/minilog" "^1.0.0"
-    cozy-device-helper "^2.5.0"
+    cozy-device-helper "^3.0.0"
 
 cozy-release@1.10.0:
   version "1.10.0"
@@ -6236,10 +5969,10 @@ cozy-release@1.10.0:
   dependencies:
     exec-sh "0.3.2"
 
-cozy-scripts@8.1:
-  version "8.1.2"
-  resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-8.1.2.tgz#5ff1ef11328215f2955d8d7620992326fa86dcad"
-  integrity sha512-4MvcWim6nAAzSllnkQUsgXTkzKTvYnePk38kWS/14W5w7Ip0VZql0BtewWMc1Sm07yAcyik9Of/i1yX3CxcOQA==
+cozy-scripts@8.3:
+  version "8.3.0"
+  resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-8.3.0.tgz#dec3a5c9568a5e44e1baf6cd9983a7c55418ba95"
+  integrity sha512-UrzifMUyIleTs7M+H449uOm/3OA/7vqUVlpA6IYi+BftUG4WbOEmU3oG9dmxRK5kVK+VhJURBk+9LJ+C+84syg==
   dependencies:
     "@babel/core" "7.10.0"
     "@babel/polyfill" "^7.10.4"
@@ -6296,37 +6029,28 @@ cozy-scripts@8.1:
     webpack-dev-server "3.10.3"
     webpack-merge "4.2.2"
 
-cozy-stack-client@^29.2.0:
-  version "29.2.0"
-  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-29.2.0.tgz#48e9d043cc869c59155979bb1666e4455d5dd0e4"
-  integrity sha512-QD8Bn/t9gLcKdxc0L65zGed6L5KdP/tNt4z63XrAVR2HBuqJcrlt6NucP7TH2FJYOj46mp9fW7iODk9hRD03UA==
-  dependencies:
-    detect-node "^2.0.4"
-    mime "^2.4.0"
-    qs "^6.7.0"
-
-cozy-stack-client@^33.4.0:
-  version "33.4.0"
-  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-33.4.0.tgz#c0c7ce7f2d65987b10bc8b4a615a3de0eedcf8d4"
-  integrity sha512-DaCwOdNT+aZJL+BZH04iUe0709O5Pi6qTagRlM+hp7oKwXiJvU3lwYIFE1McGss4rdhlWhIXB107ZFSC1+eagw==
+cozy-stack-client@^45.13.0:
+  version "45.13.0"
+  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-45.13.0.tgz#394b21a153b752be99ac6c79d073159fd024a4f4"
+  integrity sha512-ruigDMH6XB1Pxa+e3doAMjXihgKSdNZpNPlEcpd7l8MfHazUaHVs/D8Kyop1n+VGM/4va2DU1c1nE7ainT7+jw==
   dependencies:
     detect-node "^2.0.4"
     mime "^2.4.0"
     qs "^6.7.0"
 
-cozy-stack-client@^40.2.1:
-  version "40.2.1"
-  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-40.2.1.tgz#ce67d260226d7cd9f4314c15428880fd87016812"
-  integrity sha512-BMhIn1/3y2zzEYx4WmIlMcGUrzfKj7fRZdtrIjYimNapW0Xsy6nJlDCInA3cH1tNKqKBMIC5F4UQn3vTo/9hGg==
+cozy-stack-client@^49.0.0:
+  version "49.8.0"
+  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-49.8.0.tgz#c57dfefe50e47f228fee7e1921c438d35f4e0877"
+  integrity sha512-sYJL2o+DsNs7V5eQghXpWKcMzxc39QAKtM8zAdmWl2MMCyiqO3lBehRomhstcJHtuZrMLXXPQPr1A0ONBlMmZg==
   dependencies:
     detect-node "^2.0.4"
     mime "^2.4.0"
     qs "^6.7.0"
 
-cozy-ui@^86.0.0:
-  version "86.3.0"
-  resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-86.3.0.tgz#02df54285e043c03489a53c9c83f7a49f47d5328"
-  integrity sha512-eUnkIWY4hszVYB5qMQ5U7wxagFPzpvIlpA+7ke52fjcs2Z8uJ5vsbNfHjIgwxDn+hzOm09nUkwjDmQXIbO33bA==
+cozy-ui@^111.9.0:
+  version "111.21.0"
+  resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-111.21.0.tgz#ecac0c446d65f87c07ffa24e245ab30dfcc130b3"
+  integrity sha512-mAFWSCVba18GBHe70Piij3RYr1hhdOpURD7Si1YyfiMJS9hlxZXJerzlJF6JWKq3CsNcKJAfYT4NiULyfp8y4g==
   dependencies:
     "@babel/runtime" "^7.3.4"
     "@material-ui/core" "4.12.3"
@@ -6342,8 +6066,9 @@ cozy-ui@^86.0.0:
     intersection-observer "0.11.0"
     mime-types "2.1.35"
     mui-bottom-sheet "https://github.com/cozy/mui-bottom-sheet.git#v1.0.9"
-    node-polyglot "^2.2.2"
+    node-polyglot "^2.5.0"
     normalize.css "^8.0.0"
+    pdf-lib "1.17.1"
     piwik-react-router "0.12.1"
     react-chartjs-2 "4.1.0"
     react-markdown "^4.0.8"
@@ -6359,7 +6084,7 @@ crc-32@~1.2.0, crc-32@~1.2.1:
   resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
   integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
 
-create-ecdh@^4.0.0:
+create-ecdh@^4.0.4:
   version "4.0.4"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
   integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
@@ -6378,7 +6103,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
     ripemd160 "^2.0.1"
     sha.js "^2.4.0"
 
-create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+create-hmac@^1.1.4, create-hmac@^1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
   integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
@@ -6391,11 +6116,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
     sha.js "^2.4.8"
 
 cross-fetch@^3.0.6:
-  version "3.1.5"
-  resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
-  integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
+  version "3.1.8"
+  resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82"
+  integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
   dependencies:
-    node-fetch "2.6.7"
+    node-fetch "^2.6.12"
 
 cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
   version "6.0.5"
@@ -6408,7 +6133,7 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
-cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+cross-spawn@^7.0.0, cross-spawn@^7.0.2:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
   integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -6423,21 +6148,22 @@ crypt@0.0.2:
   integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
 
 crypto-browserify@^3.11.0:
-  version "3.12.0"
-  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
-  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+  version "3.12.1"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.1.tgz#bb8921bec9acc81633379aa8f52d69b0b69e0dac"
+  integrity sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==
   dependencies:
-    browserify-cipher "^1.0.0"
-    browserify-sign "^4.0.0"
-    create-ecdh "^4.0.0"
-    create-hash "^1.1.0"
-    create-hmac "^1.1.0"
-    diffie-hellman "^5.0.0"
-    inherits "^2.0.1"
-    pbkdf2 "^3.0.3"
-    public-encrypt "^4.0.0"
-    randombytes "^2.0.0"
-    randomfill "^1.0.3"
+    browserify-cipher "^1.0.1"
+    browserify-sign "^4.2.3"
+    create-ecdh "^4.0.4"
+    create-hash "^1.2.0"
+    create-hmac "^1.1.7"
+    diffie-hellman "^5.0.3"
+    hash-base "~3.0.4"
+    inherits "^2.0.4"
+    pbkdf2 "^3.1.2"
+    public-encrypt "^4.0.3"
+    randombytes "^2.1.0"
+    randomfill "^1.0.4"
 
 css-loader@2.1.0:
   version "2.1.0"
@@ -6485,7 +6211,7 @@ css-select@^2.0.0:
     domutils "^1.7.0"
     nth-check "^1.0.2"
 
-css-select@^4.1.3, css-select@^4.3.0:
+css-select@^4.1.3:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
   integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
@@ -6591,9 +6317,9 @@ cssstyle@^2.3.0:
     cssom "~0.3.6"
 
 csstype@^2.5.2:
-  version "2.6.20"
-  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
-  integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
+  version "2.6.21"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e"
+  integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==
 
 csstype@^3.0.2:
   version "3.1.3"
@@ -6615,253 +6341,253 @@ cycle@1.0.x:
   integrity sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA==
 
 cyclist@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
-  integrity sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3"
+  integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==
 
-d3-array@2, d3-array@^2.3.0, d3-array@^2.5.0:
-  version "2.12.1"
-  resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81"
-  integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==
+"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0:
+  version "3.2.4"
+  resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5"
+  integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==
   dependencies:
-    internmap "^1.0.0"
+    internmap "1 - 2"
 
-d3-axis@2:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-2.1.0.tgz#978db534092711117d032fad5d733d206307f6a0"
-  integrity sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==
+d3-axis@3:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322"
+  integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==
 
-d3-brush@2:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-2.1.0.tgz#adadfbb104e8937af142e9a6e2028326f0471065"
-  integrity sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==
+d3-brush@3:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c"
+  integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==
   dependencies:
-    d3-dispatch "1 - 2"
-    d3-drag "2"
-    d3-interpolate "1 - 2"
-    d3-selection "2"
-    d3-transition "2"
+    d3-dispatch "1 - 3"
+    d3-drag "2 - 3"
+    d3-interpolate "1 - 3"
+    d3-selection "3"
+    d3-transition "3"
 
-d3-chord@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-2.0.0.tgz#32491b5665391180560f738e5c1ccd1e3c47ebae"
-  integrity sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==
+d3-chord@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966"
+  integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==
   dependencies:
-    d3-path "1 - 2"
+    d3-path "1 - 3"
 
-"d3-color@1 - 2", d3-color@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e"
-  integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==
+"d3-color@1 - 3", d3-color@3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2"
+  integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
 
-d3-contour@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-2.0.0.tgz#80ee834988563e3bea9d99ddde72c0f8c089ea40"
-  integrity sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==
+d3-contour@4:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc"
+  integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==
   dependencies:
-    d3-array "2"
+    d3-array "^3.2.0"
 
-d3-delaunay@5:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-5.3.0.tgz#b47f05c38f854a4e7b3cea80e0bb12e57398772d"
-  integrity sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==
+d3-delaunay@6:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b"
+  integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==
   dependencies:
-    delaunator "4"
+    delaunator "5"
 
-"d3-dispatch@1 - 2", d3-dispatch@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf"
-  integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==
+"d3-dispatch@1 - 3", d3-dispatch@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e"
+  integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==
 
-d3-drag@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-2.0.0.tgz#9eaf046ce9ed1c25c88661911c1d5a4d8eb7ea6d"
-  integrity sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==
+"d3-drag@2 - 3", d3-drag@3:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba"
+  integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==
   dependencies:
-    d3-dispatch "1 - 2"
-    d3-selection "2"
+    d3-dispatch "1 - 3"
+    d3-selection "3"
 
-"d3-dsv@1 - 2", d3-dsv@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-2.0.0.tgz#b37b194b6df42da513a120d913ad1be22b5fe7c5"
-  integrity sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==
+"d3-dsv@1 - 3", d3-dsv@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73"
+  integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==
   dependencies:
-    commander "2"
-    iconv-lite "0.4"
+    commander "7"
+    iconv-lite "0.6"
     rw "1"
 
-"d3-ease@1 - 2", d3-ease@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-2.0.0.tgz#fd1762bfca00dae4bacea504b1d628ff290ac563"
-  integrity sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==
+"d3-ease@1 - 3", d3-ease@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4"
+  integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==
 
-d3-fetch@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-2.0.0.tgz#ecd7ef2128d9847a3b41b548fec80918d645c064"
-  integrity sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==
+d3-fetch@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22"
+  integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==
   dependencies:
-    d3-dsv "1 - 2"
+    d3-dsv "1 - 3"
 
-d3-force@2:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-2.1.1.tgz#f20ccbf1e6c9e80add1926f09b51f686a8bc0937"
-  integrity sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==
+d3-force@3:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4"
+  integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==
   dependencies:
-    d3-dispatch "1 - 2"
-    d3-quadtree "1 - 2"
-    d3-timer "1 - 2"
+    d3-dispatch "1 - 3"
+    d3-quadtree "1 - 3"
+    d3-timer "1 - 3"
 
-"d3-format@1 - 2", d3-format@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767"
-  integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==
+"d3-format@1 - 3", d3-format@3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641"
+  integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==
 
-d3-geo@2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-2.0.2.tgz#c065c1b71fe8c5f1be657e5f43d9bdd010383c40"
-  integrity sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==
+d3-geo@3:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d"
+  integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==
   dependencies:
-    d3-array "^2.5.0"
+    d3-array "2.5.0 - 3"
 
-d3-hierarchy@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz#dab88a58ca3e7a1bc6cab390e89667fcc6d20218"
-  integrity sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==
+d3-hierarchy@3:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6"
+  integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==
 
-"d3-interpolate@1 - 2", "d3-interpolate@1.2.0 - 2", d3-interpolate@2:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163"
-  integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==
+"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d"
+  integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
   dependencies:
-    d3-color "1 - 2"
+    d3-color "1 - 3"
 
-"d3-path@1 - 2", d3-path@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8"
-  integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==
+"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526"
+  integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==
 
-d3-polygon@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-2.0.0.tgz#13608ef042fbec625ba1598327564f03c0396d8e"
-  integrity sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==
+d3-polygon@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398"
+  integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==
 
-"d3-quadtree@1 - 2", d3-quadtree@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d"
-  integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==
+"d3-quadtree@1 - 3", d3-quadtree@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f"
+  integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==
 
-d3-random@2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-2.2.2.tgz#5eebd209ef4e45a2b362b019c1fb21c2c98cbb6e"
-  integrity sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==
+d3-random@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4"
+  integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==
 
-d3-scale-chromatic@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz#c13f3af86685ff91323dc2f0ebd2dabbd72d8bab"
-  integrity sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==
+d3-scale-chromatic@3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314"
+  integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==
   dependencies:
-    d3-color "1 - 2"
-    d3-interpolate "1 - 2"
+    d3-color "1 - 3"
+    d3-interpolate "1 - 3"
 
-d3-scale@3:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3"
-  integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==
+d3-scale@4:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396"
+  integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==
   dependencies:
-    d3-array "^2.3.0"
-    d3-format "1 - 2"
-    d3-interpolate "1.2.0 - 2"
-    d3-time "^2.1.1"
-    d3-time-format "2 - 3"
+    d3-array "2.10.0 - 3"
+    d3-format "1 - 3"
+    d3-interpolate "1.2.0 - 3"
+    d3-time "2.1.1 - 3"
+    d3-time-format "2 - 4"
 
-d3-selection@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-2.0.0.tgz#94a11638ea2141b7565f883780dabc7ef6a61066"
-  integrity sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==
+"d3-selection@2 - 3", d3-selection@3:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31"
+  integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==
 
-d3-shape@2:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-2.1.0.tgz#3b6a82ccafbc45de55b57fcf956c584ded3b666f"
-  integrity sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==
+d3-shape@3:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5"
+  integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==
   dependencies:
-    d3-path "1 - 2"
+    d3-path "^3.1.0"
 
-"d3-time-format@2 - 3", d3-time-format@3:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-3.0.0.tgz#df8056c83659e01f20ac5da5fdeae7c08d5f1bb6"
-  integrity sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==
+"d3-time-format@2 - 4", d3-time-format@4:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a"
+  integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==
   dependencies:
-    d3-time "1 - 2"
+    d3-time "1 - 3"
 
-"d3-time@1 - 2", d3-time@2, d3-time@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682"
-  integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==
+"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7"
+  integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==
   dependencies:
-    d3-array "2"
+    d3-array "2 - 3"
 
-"d3-timer@1 - 2", d3-timer@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6"
-  integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==
-
-d3-transition@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-2.0.0.tgz#366ef70c22ef88d1e34105f507516991a291c94c"
-  integrity sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==
-  dependencies:
-    d3-color "1 - 2"
-    d3-dispatch "1 - 2"
-    d3-ease "1 - 2"
-    d3-interpolate "1 - 2"
-    d3-timer "1 - 2"
+"d3-timer@1 - 3", d3-timer@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0"
+  integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==
 
-d3-zoom@2:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-2.0.0.tgz#f04d0afd05518becce879d04709c47ecd93fba54"
-  integrity sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==
+"d3-transition@2 - 3", d3-transition@3:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f"
+  integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==
   dependencies:
-    d3-dispatch "1 - 2"
-    d3-drag "2"
-    d3-interpolate "1 - 2"
-    d3-selection "2"
-    d3-transition "2"
+    d3-color "1 - 3"
+    d3-dispatch "1 - 3"
+    d3-ease "1 - 3"
+    d3-interpolate "1 - 3"
+    d3-timer "1 - 3"
 
-d3@^6.0.0:
-  version "6.7.0"
-  resolved "https://registry.yarnpkg.com/d3/-/d3-6.7.0.tgz#adac458597b4a2cafe8e08cf30948af0c95cd61f"
-  integrity sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==
-  dependencies:
-    d3-array "2"
-    d3-axis "2"
-    d3-brush "2"
-    d3-chord "2"
-    d3-color "2"
-    d3-contour "2"
-    d3-delaunay "5"
-    d3-dispatch "2"
-    d3-drag "2"
-    d3-dsv "2"
-    d3-ease "2"
-    d3-fetch "2"
-    d3-force "2"
-    d3-format "2"
-    d3-geo "2"
-    d3-hierarchy "2"
-    d3-interpolate "2"
-    d3-path "2"
-    d3-polygon "2"
-    d3-quadtree "2"
-    d3-random "2"
-    d3-scale "3"
-    d3-scale-chromatic "2"
-    d3-selection "2"
-    d3-shape "2"
-    d3-time "2"
-    d3-time-format "3"
-    d3-timer "2"
-    d3-transition "2"
-    d3-zoom "2"
+d3-zoom@3:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3"
+  integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==
+  dependencies:
+    d3-dispatch "1 - 3"
+    d3-drag "2 - 3"
+    d3-interpolate "1 - 3"
+    d3-selection "2 - 3"
+    d3-transition "2 - 3"
+
+d3@^7.9.0:
+  version "7.9.0"
+  resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d"
+  integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==
+  dependencies:
+    d3-array "3"
+    d3-axis "3"
+    d3-brush "3"
+    d3-chord "3"
+    d3-color "3"
+    d3-contour "4"
+    d3-delaunay "6"
+    d3-dispatch "3"
+    d3-drag "3"
+    d3-dsv "3"
+    d3-ease "3"
+    d3-fetch "3"
+    d3-force "3"
+    d3-format "3"
+    d3-geo "3"
+    d3-hierarchy "3"
+    d3-interpolate "3"
+    d3-path "3"
+    d3-polygon "3"
+    d3-quadtree "3"
+    d3-random "3"
+    d3-scale "4"
+    d3-scale-chromatic "3"
+    d3-selection "3"
+    d3-shape "3"
+    d3-time "3"
+    d3-time-format "4"
+    d3-timer "3"
+    d3-transition "3"
+    d3-zoom "3"
 
 damerau-levenshtein@^1.0.8:
   version "1.0.8"
@@ -6889,6 +6615,33 @@ data-urls@^2.0.0:
     whatwg-mimetype "^2.3.0"
     whatwg-url "^8.0.0"
 
+data-view-buffer@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+  integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+  integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+  integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
 date-fns@2.29.3:
   version "2.29.3"
   resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8"
@@ -6900,9 +6653,11 @@ date-fns@^1.28.5, date-fns@^1.30.1:
   integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
 
 date-fns@^2.22.1:
-  version "2.28.0"
-  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2"
-  integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==
+  version "2.30.0"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0"
+  integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==
+  dependencies:
+    "@babel/runtime" "^7.21.0"
 
 dateformat@^3.0.0:
   version "3.0.3"
@@ -6921,14 +6676,14 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
   dependencies:
     ms "2.0.0"
 
-debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
-  version "4.3.4"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
-  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.6:
+  version "4.3.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+  integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
   dependencies:
-    ms "2.1.2"
+    ms "^2.1.3"
 
-debug@^3.1.1, debug@^3.2.5:
+debug@^3.2.5, debug@^3.2.7:
   version "3.2.7"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
   integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@@ -6943,9 +6698,9 @@ debug@~3.1.0:
     ms "2.0.0"
 
 decamelize-keys@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
-  integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8"
+  integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==
   dependencies:
     decamelize "^1.1.0"
     map-obj "^1.0.0"
@@ -6956,14 +6711,14 @@ decamelize@^1.1.0, decamelize@^1.1.1, decamelize@^1.2.0:
   integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
 
 decimal.js@^10.0.0, decimal.js@^10.2.1:
-  version "10.3.1"
-  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
-  integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
+  version "10.4.3"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+  integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
 
 decode-uri-component@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
-  integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+  integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
 
 deep-diff@^0.3.5:
   version "0.3.8"
@@ -6971,16 +6726,16 @@ deep-diff@^0.3.5:
   integrity sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==
 
 deep-equal@^1.0.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
-  integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761"
+  integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==
   dependencies:
-    is-arguments "^1.0.4"
-    is-date-object "^1.0.1"
-    is-regex "^1.0.4"
-    object-is "^1.0.1"
+    is-arguments "^1.1.1"
+    is-date-object "^1.0.5"
+    is-regex "^1.1.4"
+    object-is "^1.1.5"
     object-keys "^1.1.1"
-    regexp.prototype.flags "^1.2.0"
+    regexp.prototype.flags "^1.5.1"
 
 deep-equal@^2.0.5:
   version "2.2.3"
@@ -7022,27 +6777,9 @@ deepmerge@1.3.2:
   integrity sha512-qjMjTrk+RKv/sp4RPDpV5CnKhxjFI9p+GkLBOls5A8EEElldYWCWA9zceAkmfd0xIo2aU1nxiaLFoiya2sb6Cg==
 
 deepmerge@^4.2.2:
-  version "4.2.2"
-  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
-  integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
-
-default-browser-id@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c"
-  integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
-  dependencies:
-    bplist-parser "^0.2.0"
-    untildify "^4.0.0"
-
-default-browser@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da"
-  integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
-  dependencies:
-    bundle-name "^3.0.0"
-    default-browser-id "^3.0.0"
-    execa "^7.1.1"
-    titleize "^3.0.0"
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+  integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
 
 default-gateway@^4.2.0:
   version "4.2.0"
@@ -7053,9 +6790,9 @@ default-gateway@^4.2.0:
     ip-regex "^2.1.0"
 
 defaults@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
-  integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
+  integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
   dependencies:
     clone "^1.0.2"
 
@@ -7068,34 +6805,12 @@ define-data-property@^1.0.1, define-data-property@^1.1.4:
     es-errors "^1.3.0"
     gopd "^1.0.1"
 
-define-data-property@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
-  integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
-  dependencies:
-    get-intrinsic "^1.2.1"
-    gopd "^1.0.1"
-    has-property-descriptors "^1.0.0"
-
 define-lazy-prop@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
   integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
 
-define-lazy-prop@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
-  integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
-
-define-properties@^1.1.2:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
-  integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
-  dependencies:
-    has-property-descriptors "^1.0.0"
-    object-keys "^1.1.1"
-
-define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1:
+define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
   integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
@@ -7139,10 +6854,12 @@ del@^4.1.1:
     pify "^4.0.1"
     rimraf "^2.6.3"
 
-delaunator@4:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957"
-  integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==
+delaunator@5:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278"
+  integrity sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==
+  dependencies:
+    robust-predicates "^3.0.2"
 
 delayed-stream@~1.0.0:
   version "1.0.0"
@@ -7159,15 +6876,10 @@ depd@~1.1.2:
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
   integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
 
-dequal@^2.0.3:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
-  integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
-
 des.js@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
-  integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da"
+  integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==
   dependencies:
     inherits "^2.0.1"
     minimalistic-assert "^1.0.0"
@@ -7177,16 +6889,16 @@ destroy@1.2.0:
   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
   integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
 
-detect-browser@^5.1.1:
-  version "5.3.0"
-  resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca"
-  integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==
-
 detect-indent@^6.0.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6"
   integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==
 
+detect-libc@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+  integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
+
 detect-newline@^3.0.0, detect-newline@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
@@ -7197,12 +6909,7 @@ detect-node-es@^1.1.0:
   resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
   integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
 
-detect-node@2.0.4:
-  version "2.0.4"
-  resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
-  integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
-
-detect-node@^2.0.4:
+detect-node@2.1.0, detect-node@^2.0.4:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
   integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
@@ -7212,12 +6919,12 @@ diff-sequences@^26.6.2:
   resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
   integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
 
-diff-sequences@^29.0.0:
-  version "29.0.0"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f"
-  integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA==
+diff-sequences@^29.6.3:
+  version "29.6.3"
+  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
+  integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
 
-diffie-hellman@^5.0.0:
+diffie-hellman@^5.0.3:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
   integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
@@ -7312,7 +7019,7 @@ dom-serializer@0:
     domelementtype "^2.0.1"
     entities "^2.0.0"
 
-dom-serializer@^1.0.1, dom-serializer@^1.3.2:
+dom-serializer@^1.0.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
   integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
@@ -7364,21 +7071,21 @@ domhandler@^2.3.0:
   dependencies:
     domelementtype "1"
 
-domhandler@^3.0.0:
+domhandler@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a"
   integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==
   dependencies:
     domelementtype "^2.0.1"
 
-domhandler@^4.0, domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.2.2, domhandler@^4.3.1:
+domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
   version "4.3.1"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
   integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
   dependencies:
     domelementtype "^2.2.0"
 
-domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3:
+domhandler@^5.0, domhandler@^5.0.2, domhandler@^5.0.3:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
   integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
@@ -7398,7 +7105,7 @@ domutils@^1.5.1, domutils@^1.7.0:
     dom-serializer "0"
     domelementtype "1"
 
-domutils@^2.0.0, domutils@^2.5.2, domutils@^2.8.0:
+domutils@^2.4.2, domutils@^2.5.2, domutils@^2.8.0:
   version "2.8.0"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
   integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
@@ -7407,14 +7114,14 @@ domutils@^2.0.0, domutils@^2.5.2, domutils@^2.8.0:
     domelementtype "^2.2.0"
     domhandler "^4.2.0"
 
-domutils@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c"
-  integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==
+domutils@^3.0.1, domutils@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
+  integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
   dependencies:
     dom-serializer "^2.0.0"
     domelementtype "^2.3.0"
-    domhandler "^5.0.1"
+    domhandler "^5.0.3"
 
 dot-prop@^5.1.0:
   version "5.3.0"
@@ -7461,6 +7168,11 @@ duplicate-package-checker-webpack-plugin@^3.0.0:
     lodash "^4.17.4"
     semver "^5.4.1"
 
+eastasianwidth@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -7469,15 +7181,15 @@ ecc-jsbn@~0.1.1:
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
 
-editorconfig@^0.15.3:
-  version "0.15.3"
-  resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
-  integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
+editorconfig@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3"
+  integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==
   dependencies:
-    commander "^2.19.0"
-    lru-cache "^4.1.5"
-    semver "^5.6.0"
-    sigmund "^1.0.1"
+    "@one-ini/wasm" "0.1.1"
+    commander "^10.0.0"
+    minimatch "9.0.1"
+    semver "^7.5.3"
 
 ee-first@1.1.1:
   version "1.1.1"
@@ -7489,15 +7201,15 @@ ejs@^2.6.1:
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
   integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
-electron-to-chromium@^1.4.172:
-  version "1.4.174"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.174.tgz#ffdf57f26dd4558c5aabdb4b190c47af1c4e443b"
-  integrity sha512-JER+w+9MV2MBVFOXxP036bLlNOnzbYAWrWU8sNUwoOO69T3w4564WhM5H5atd8VVS8U4vpi0i0kdoYzm1NPQgQ==
+electron-to-chromium@^1.5.41:
+  version "1.5.52"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.52.tgz#2bed832c95a56a195504f918150e548474687da8"
+  integrity sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==
 
-elliptic@^6.5.3:
-  version "6.5.4"
-  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
-  integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+elliptic@^6.5.3, elliptic@^6.5.5:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210"
+  integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==
   dependencies:
     bn.js "^4.11.9"
     brorand "^1.1.0"
@@ -7542,6 +7254,19 @@ encodeurl@~1.0.2:
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
   integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
 
+encodeurl@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+  integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
+encoding-sniffer@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5"
+  integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==
+  dependencies:
+    iconv-lite "^0.6.3"
+    whatwg-encoding "^3.1.1"
+
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -7559,11 +7284,12 @@ enhanced-resolve@^4.1.0:
     tapable "^1.0.0"
 
 enquirer@^2.3.5:
-  version "2.3.6"
-  resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
-  integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+  integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
   dependencies:
     ansi-colors "^4.1.1"
+    strip-ansi "^6.0.1"
 
 entities@^1.1.1:
   version "1.1.2"
@@ -7575,143 +7301,76 @@ entities@^2.0.0:
   resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
   integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
 
-entities@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4"
-  integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==
-
-entities@^4.2.0, entities@^4.3.0, entities@^4.4.0:
-  version "4.4.0"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
-  integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==
-
-errno@^0.1.3, errno@~0.1.7:
-  version "0.1.8"
-  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
-  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
-  dependencies:
-    prr "~1.0.1"
-
-error-ex@^1.2.0, error-ex@^1.3.1:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
-  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
-  dependencies:
-    is-arrayish "^0.2.1"
-
-es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.1:
-  version "1.20.1"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814"
-  integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==
-  dependencies:
-    call-bind "^1.0.2"
-    es-to-primitive "^1.2.1"
-    function-bind "^1.1.1"
-    function.prototype.name "^1.1.5"
-    get-intrinsic "^1.1.1"
-    get-symbol-description "^1.0.0"
-    has "^1.0.3"
-    has-property-descriptors "^1.0.0"
-    has-symbols "^1.0.3"
-    internal-slot "^1.0.3"
-    is-callable "^1.2.4"
-    is-negative-zero "^2.0.2"
-    is-regex "^1.1.4"
-    is-shared-array-buffer "^1.0.2"
-    is-string "^1.0.7"
-    is-weakref "^1.0.2"
-    object-inspect "^1.12.0"
-    object-keys "^1.1.1"
-    object.assign "^4.1.2"
-    regexp.prototype.flags "^1.4.3"
-    string.prototype.trimend "^1.0.5"
-    string.prototype.trimstart "^1.0.5"
-    unbox-primitive "^1.0.2"
+entities@^4.2.0, entities@^4.4.0, entities@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
 
-es-abstract@^1.20.4:
-  version "1.21.2"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
-  integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==
+errno@^0.1.3, errno@~0.1.7:
+  version "0.1.8"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
   dependencies:
-    array-buffer-byte-length "^1.0.0"
-    available-typed-arrays "^1.0.5"
-    call-bind "^1.0.2"
-    es-set-tostringtag "^2.0.1"
-    es-to-primitive "^1.2.1"
-    function.prototype.name "^1.1.5"
-    get-intrinsic "^1.2.0"
-    get-symbol-description "^1.0.0"
-    globalthis "^1.0.3"
-    gopd "^1.0.1"
-    has "^1.0.3"
-    has-property-descriptors "^1.0.0"
-    has-proto "^1.0.1"
-    has-symbols "^1.0.3"
-    internal-slot "^1.0.5"
-    is-array-buffer "^3.0.2"
-    is-callable "^1.2.7"
-    is-negative-zero "^2.0.2"
-    is-regex "^1.1.4"
-    is-shared-array-buffer "^1.0.2"
-    is-string "^1.0.7"
-    is-typed-array "^1.1.10"
-    is-weakref "^1.0.2"
-    object-inspect "^1.12.3"
-    object-keys "^1.1.1"
-    object.assign "^4.1.4"
-    regexp.prototype.flags "^1.4.3"
-    safe-regex-test "^1.0.0"
-    string.prototype.trim "^1.2.7"
-    string.prototype.trimend "^1.0.6"
-    string.prototype.trimstart "^1.0.6"
-    typed-array-length "^1.0.4"
-    unbox-primitive "^1.0.2"
-    which-typed-array "^1.1.9"
+    prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+  dependencies:
+    is-arrayish "^0.2.1"
 
-es-abstract@^1.22.1:
-  version "1.22.3"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32"
-  integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==
+es-abstract@^1.17.2, es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
+  version "1.23.3"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
+  integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
   dependencies:
-    array-buffer-byte-length "^1.0.0"
-    arraybuffer.prototype.slice "^1.0.2"
-    available-typed-arrays "^1.0.5"
-    call-bind "^1.0.5"
-    es-set-tostringtag "^2.0.1"
+    array-buffer-byte-length "^1.0.1"
+    arraybuffer.prototype.slice "^1.0.3"
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    data-view-buffer "^1.0.1"
+    data-view-byte-length "^1.0.1"
+    data-view-byte-offset "^1.0.0"
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
+    es-set-tostringtag "^2.0.3"
     es-to-primitive "^1.2.1"
     function.prototype.name "^1.1.6"
-    get-intrinsic "^1.2.2"
-    get-symbol-description "^1.0.0"
+    get-intrinsic "^1.2.4"
+    get-symbol-description "^1.0.2"
     globalthis "^1.0.3"
     gopd "^1.0.1"
-    has-property-descriptors "^1.0.0"
-    has-proto "^1.0.1"
+    has-property-descriptors "^1.0.2"
+    has-proto "^1.0.3"
     has-symbols "^1.0.3"
-    hasown "^2.0.0"
-    internal-slot "^1.0.5"
-    is-array-buffer "^3.0.2"
+    hasown "^2.0.2"
+    internal-slot "^1.0.7"
+    is-array-buffer "^3.0.4"
     is-callable "^1.2.7"
-    is-negative-zero "^2.0.2"
+    is-data-view "^1.0.1"
+    is-negative-zero "^2.0.3"
     is-regex "^1.1.4"
-    is-shared-array-buffer "^1.0.2"
+    is-shared-array-buffer "^1.0.3"
     is-string "^1.0.7"
-    is-typed-array "^1.1.12"
+    is-typed-array "^1.1.13"
     is-weakref "^1.0.2"
     object-inspect "^1.13.1"
     object-keys "^1.1.1"
-    object.assign "^4.1.4"
-    regexp.prototype.flags "^1.5.1"
-    safe-array-concat "^1.0.1"
-    safe-regex-test "^1.0.0"
-    string.prototype.trim "^1.2.8"
-    string.prototype.trimend "^1.0.7"
-    string.prototype.trimstart "^1.0.7"
-    typed-array-buffer "^1.0.0"
-    typed-array-byte-length "^1.0.0"
-    typed-array-byte-offset "^1.0.0"
-    typed-array-length "^1.0.4"
+    object.assign "^4.1.5"
+    regexp.prototype.flags "^1.5.2"
+    safe-array-concat "^1.1.2"
+    safe-regex-test "^1.0.3"
+    string.prototype.trim "^1.2.9"
+    string.prototype.trimend "^1.0.8"
+    string.prototype.trimstart "^1.0.8"
+    typed-array-buffer "^1.0.2"
+    typed-array-byte-length "^1.0.1"
+    typed-array-byte-offset "^1.0.2"
+    typed-array-length "^1.0.6"
     unbox-primitive "^1.0.2"
-    which-typed-array "^1.1.13"
+    which-typed-array "^1.1.15"
 
 es-array-method-boxes-properly@^1.0.0:
   version "1.0.0"
@@ -7725,7 +7384,7 @@ es-define-property@^1.0.0:
   dependencies:
     get-intrinsic "^1.2.4"
 
-es-errors@^1.3.0:
+es-errors@^1.2.1, es-errors@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
   integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
@@ -7745,41 +7404,54 @@ es-get-iterator@^1.1.3:
     isarray "^2.0.5"
     stop-iteration-iterator "^1.0.0"
 
-es-iterator-helpers@^1.0.12, es-iterator-helpers@^1.0.15:
-  version "1.0.15"
-  resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40"
-  integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==
+es-iterator-helpers@^1.0.19:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz#2f1a3ab998b30cb2d10b195b587c6d9ebdebf152"
+  integrity sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==
   dependencies:
-    asynciterator.prototype "^1.0.0"
-    call-bind "^1.0.2"
+    call-bind "^1.0.7"
     define-properties "^1.2.1"
-    es-abstract "^1.22.1"
-    es-set-tostringtag "^2.0.1"
-    function-bind "^1.1.1"
-    get-intrinsic "^1.2.1"
-    globalthis "^1.0.3"
-    has-property-descriptors "^1.0.0"
-    has-proto "^1.0.1"
+    es-abstract "^1.23.3"
+    es-errors "^1.3.0"
+    es-set-tostringtag "^2.0.3"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    globalthis "^1.0.4"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.2"
+    has-proto "^1.0.3"
     has-symbols "^1.0.3"
-    internal-slot "^1.0.5"
-    iterator.prototype "^1.1.2"
-    safe-array-concat "^1.0.1"
+    internal-slot "^1.0.7"
+    iterator.prototype "^1.1.3"
+    safe-array-concat "^1.1.2"
 
-es-set-tostringtag@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8"
-  integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==
-  dependencies:
-    get-intrinsic "^1.1.3"
-    has "^1.0.3"
-    has-tostringtag "^1.0.0"
+es-module-lexer@^1.5.3:
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78"
+  integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==
 
-es-shim-unscopables@^1.0.0:
+es-object-atoms@^1.0.0:
   version "1.0.0"
-  resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
-  integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+  resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+  integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
   dependencies:
-    has "^1.0.3"
+    es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+  integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+    has-tostringtag "^1.0.2"
+    hasown "^2.0.1"
+
+es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+  integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+  dependencies:
+    hasown "^2.0.0"
 
 es-to-primitive@^1.2.1:
   version "1.2.1"
@@ -7810,10 +7482,10 @@ es6-promise@^4.2.8:
   resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
   integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
 
-escalade@^3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
-  integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+escalade@^3.1.1, escalade@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+  integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
 
 escape-goat@^3.0.0:
   version "3.0.0"
@@ -7841,14 +7513,13 @@ escape-string-regexp@^4.0.0:
   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
 escodegen@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
-  integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+  integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
   dependencies:
     esprima "^4.0.1"
     estraverse "^5.2.0"
     esutils "^2.0.2"
-    optionator "^0.8.1"
   optionalDependencies:
     source-map "~0.6.1"
 
@@ -7874,9 +7545,9 @@ eslint-config-prettier@4.3.0:
     get-stdin "^6.0.0"
 
 eslint-config-prettier@^9.0.0:
-  version "9.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f"
-  integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f"
+  integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
 
 eslint-loader@^4.0.2:
   version "4.0.2"
@@ -7889,49 +7560,50 @@ eslint-loader@^4.0.2:
     object-hash "^2.0.3"
     schema-utils "^2.6.5"
 
-eslint-plugin-jest@^27.2.3:
-  version "27.2.3"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz#6f8a4bb2ca82c0c5d481d1b3be256ab001f5a3ec"
-  integrity sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==
+eslint-plugin-jest@^28.8.3:
+  version "28.9.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.9.0.tgz#19168dfaed124339cd2252c4c4d1ac3688aeb243"
+  integrity sha512-rLu1s1Wf96TgUUxSw6loVIkNtUjq1Re7A9QdCCHSohnvXEBAjuL420h0T/fMmkQlNsQP2GhQzEUpYHPfxBkvYQ==
   dependencies:
-    "@typescript-eslint/utils" "^5.10.0"
+    "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0"
 
-eslint-plugin-jsdoc@^47.0.2:
-  version "47.0.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-47.0.2.tgz#113a6370e623535e5c6e0a59a094ffdc253371ff"
-  integrity sha512-sIq81Pv+yrhhwY0m1JH79rdZRgDNunehv3S0Yv0UfewpoeJyPkODFn2o4o20nofVoI2tjku9/QBcCYUmmeWFXA==
+eslint-plugin-jsdoc@^50.4.1:
+  version "50.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.4.3.tgz#38adf595555933775943771e906422b25cdfc780"
+  integrity sha512-uWtwFxGRv6B8sU63HZM5dAGDhgsatb+LONwmILZJhdRALLOkCX2HFZhdL/Kw2ls8SQMAVEfK+LmnEfxInRN8HA==
   dependencies:
-    "@es-joy/jsdoccomment" "~0.41.0"
+    "@es-joy/jsdoccomment" "~0.49.0"
     are-docs-informative "^0.0.2"
     comment-parser "1.4.1"
-    debug "^4.3.4"
+    debug "^4.3.6"
     escape-string-regexp "^4.0.0"
-    esquery "^1.5.0"
-    is-builtin-module "^3.2.1"
-    semver "^7.5.4"
+    espree "^10.1.0"
+    esquery "^1.6.0"
+    parse-imports "^2.1.1"
+    semver "^7.6.3"
     spdx-expression-parse "^4.0.0"
+    synckit "^0.9.1"
 
-eslint-plugin-jsx-a11y@^6.8.0:
-  version "6.8.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2"
-  integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==
+eslint-plugin-jsx-a11y@^6.10.0:
+  version "6.10.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz#d2812bb23bf1ab4665f1718ea442e8372e638483"
+  integrity sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==
   dependencies:
-    "@babel/runtime" "^7.23.2"
-    aria-query "^5.3.0"
-    array-includes "^3.1.7"
+    aria-query "^5.3.2"
+    array-includes "^3.1.8"
     array.prototype.flatmap "^1.3.2"
     ast-types-flow "^0.0.8"
-    axe-core "=4.7.0"
-    axobject-query "^3.2.1"
+    axe-core "^4.10.0"
+    axobject-query "^4.1.0"
     damerau-levenshtein "^1.0.8"
     emoji-regex "^9.2.2"
-    es-iterator-helpers "^1.0.15"
-    hasown "^2.0.0"
+    hasown "^2.0.2"
     jsx-ast-utils "^3.3.5"
     language-tags "^1.0.9"
     minimatch "^3.1.2"
-    object.entries "^1.1.7"
-    object.fromentries "^2.0.7"
+    object.fromentries "^2.0.8"
+    safe-regex-test "^1.0.3"
+    string.prototype.includes "^2.0.1"
 
 eslint-plugin-prettier@3.1.2:
   version "3.1.2"
@@ -7941,12 +7613,66 @@ eslint-plugin-prettier@3.1.2:
     prettier-linter-helpers "^1.0.0"
 
 eslint-plugin-prettier@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz#6887780ed95f7708340ec79acfdf60c35b9be57a"
-  integrity sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95"
+  integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==
   dependencies:
     prettier-linter-helpers "^1.0.0"
-    synckit "^0.8.5"
+    synckit "^0.9.1"
+
+eslint-plugin-react-debug@1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-debug/-/eslint-plugin-react-debug-1.15.2.tgz#00c42bbede32748cae1649d7086a2a53b799a7f3"
+  integrity sha512-k+4Z+Gel0Vh3eQ5fLTOe+wvHuvD6ApOzBDupIRISv+sU24KXykT3J0+xZLy3gu5OfhxQ0hE7b3gY8bZvYaW41w==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/core" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/type-utils" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    string-ts "^2.2.0"
+    ts-pattern "^5.5.0"
+
+eslint-plugin-react-dom@1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-dom/-/eslint-plugin-react-dom-1.15.2.tgz#e19998c8dc0606daa8eaa2aa1624559e5bbb307a"
+  integrity sha512-strNT28BHy7yeQgdbBzPGUHDqRkZFI5IfKlkuiozk+vPSZfLj0K2X8L25DvNXr5eRMTyV6TlUsk1Y6xr6ZJgPg==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/core" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    ts-pattern "^5.5.0"
+
+eslint-plugin-react-hooks-extra@1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks-extra/-/eslint-plugin-react-hooks-extra-1.15.2.tgz#aefd691b52fd4c153e5787660eef926d1c4e82f6"
+  integrity sha512-v+PazTS64GPCCGj9dEvSirHc4oNQm74zhE/CpsEo+0IBre38CavN7Ausq/OAgipmnihoyEH7hMgUzJsCAABEmQ==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/core" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/type-utils" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    ts-pattern "^5.5.0"
 
 eslint-plugin-react-hooks@2.3.0:
   version "2.3.0"
@@ -7958,10 +7684,64 @@ eslint-plugin-react-hooks@4.0.4:
   resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz#aed33b4254a41b045818cacb047b81e6df27fa58"
   integrity sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA==
 
-eslint-plugin-react-hooks@^4.6.0:
-  version "4.6.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3"
-  integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==
+eslint-plugin-react-hooks@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0.tgz#72e2eefbac4b694f5324154619fee44f5f60f101"
+  integrity sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==
+
+eslint-plugin-react-naming-convention@1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-1.15.2.tgz#1d29c969756939f692f85db72de14bdc6ccfb673"
+  integrity sha512-Vj4SOKlFAs0c+ICal0rVZHjVmEFAKEROhJV8xBu6ZO7JcVDb3Yc7N6t8/vTwhGJDk0jQ8quNSV0dPCX4gvLlDw==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/core" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/type-utils" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    ts-pattern "^5.5.0"
+
+eslint-plugin-react-web-api@1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-1.15.2.tgz#11b1cd0fdd6ba179f6f9d091f994a5f0e233260b"
+  integrity sha512-UIwuLvJn/2vbnB8IRnfNpsgcNQlJPJKfF/6/XwselRcRkgl5qk1B8pypapG/g3MqJ85jIAUj1Xn+bQu2BiTa7g==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/core" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    birecord "^0.1.1"
+    ts-pattern "^5.5.0"
+
+eslint-plugin-react-x@1.15.2:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-x/-/eslint-plugin-react-x-1.15.2.tgz#f8cd811fd7877a482bd30f7ae50b0365d3552212"
+  integrity sha512-HIpYzojk5fzalJ09UJRhtu1cJcFxM/YsTCdVPE/v3sqWb/1v8bzPVtUkQbR787G4o/M0wTUy+pBzTYAJeBRnOw==
+  dependencies:
+    "@eslint-react/ast" "1.15.2"
+    "@eslint-react/core" "1.15.2"
+    "@eslint-react/jsx" "1.15.2"
+    "@eslint-react/shared" "1.15.2"
+    "@eslint-react/tools" "1.15.2"
+    "@eslint-react/types" "1.15.2"
+    "@eslint-react/var" "1.15.2"
+    "@typescript-eslint/scope-manager" "^8.12.1"
+    "@typescript-eslint/type-utils" "^8.12.1"
+    "@typescript-eslint/types" "^8.12.1"
+    "@typescript-eslint/utils" "^8.12.1"
+    is-immutable-type "5.0.0"
+    ts-pattern "^5.5.0"
 
 eslint-plugin-react@7.14.3:
   version "7.14.3"
@@ -7996,34 +7776,36 @@ eslint-plugin-react@7.19.0:
     string.prototype.matchall "^4.0.2"
     xregexp "^4.3.0"
 
-eslint-plugin-react@7.33.2:
-  version "7.33.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608"
-  integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==
+eslint-plugin-react@7.37.1:
+  version "7.37.1"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd"
+  integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==
   dependencies:
-    array-includes "^3.1.6"
-    array.prototype.flatmap "^1.3.1"
-    array.prototype.tosorted "^1.1.1"
+    array-includes "^3.1.8"
+    array.prototype.findlast "^1.2.5"
+    array.prototype.flatmap "^1.3.2"
+    array.prototype.tosorted "^1.1.4"
     doctrine "^2.1.0"
-    es-iterator-helpers "^1.0.12"
+    es-iterator-helpers "^1.0.19"
     estraverse "^5.3.0"
+    hasown "^2.0.2"
     jsx-ast-utils "^2.4.1 || ^3.0.0"
     minimatch "^3.1.2"
-    object.entries "^1.1.6"
-    object.fromentries "^2.0.6"
-    object.hasown "^1.1.2"
-    object.values "^1.1.6"
+    object.entries "^1.1.8"
+    object.fromentries "^2.0.8"
+    object.values "^1.2.0"
     prop-types "^15.8.1"
-    resolve "^2.0.0-next.4"
+    resolve "^2.0.0-next.5"
     semver "^6.3.1"
-    string.prototype.matchall "^4.0.8"
+    string.prototype.matchall "^4.0.11"
+    string.prototype.repeat "^1.0.0"
 
 eslint-plugin-testing-library@^6.2.2:
-  version "6.2.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.2.2.tgz#67e84ff891a2b3a8078ced0afa95ee6f343c00c1"
-  integrity sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-6.4.0.tgz#1ba8a7422e3e31cc315a73ff17c34908f56f9838"
+  integrity sha512-yeWF+YgCgvNyPNI9UKnG0FjeE2sk93N/3lsKqcmR8dSfeXJwFT5irnWo7NjLf152HkRzfoFjh3LsBUrhvFz4eA==
   dependencies:
-    "@typescript-eslint/utils" "^5.58.0"
+    "@typescript-eslint/utils" "^5.62.0"
 
 eslint-plugin-vue@5.2.3:
   version "5.2.3"
@@ -8040,15 +7822,7 @@ eslint-scope@3.7.1:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
-eslint-scope@^4.0.0, eslint-scope@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
-  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
-  dependencies:
-    esrecurse "^4.1.0"
-    estraverse "^4.1.1"
-
-eslint-scope@^5.1.1:
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
   integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -8056,15 +7830,15 @@ eslint-scope@^5.1.1:
     esrecurse "^4.3.0"
     estraverse "^4.1.1"
 
-eslint-scope@^7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
-  integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+eslint-scope@^4.0.0, eslint-scope@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
   dependencies:
-    esrecurse "^4.3.0"
-    estraverse "^5.2.0"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
 
-eslint-scope@^7.2.2:
+eslint-scope@^7.1.1, eslint-scope@^7.2.2:
   version "7.2.2"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
   integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
@@ -8086,13 +7860,6 @@ eslint-utils@^2.1.0:
   dependencies:
     eslint-visitor-keys "^1.1.0"
 
-eslint-utils@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
-  integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
-  dependencies:
-    eslint-visitor-keys "^2.0.0"
-
 eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
@@ -8103,16 +7870,16 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
   integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
 
-eslint-visitor-keys@^3.3.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
-  integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-
-eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
   version "3.4.3"
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
   integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
 
+eslint-visitor-keys@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45"
+  integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
+
 eslint@5.16.0:
   version "5.16.0"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
@@ -8201,18 +7968,19 @@ eslint@^7.32.0:
     text-table "^0.2.0"
     v8-compile-cache "^2.0.3"
 
-eslint@^8.49.0:
-  version "8.49.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42"
-  integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==
+eslint@^8.49.0, eslint@^8.7.0:
+  version "8.57.1"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9"
+  integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.6.1"
-    "@eslint/eslintrc" "^2.1.2"
-    "@eslint/js" "8.49.0"
-    "@humanwhocodes/config-array" "^0.11.11"
+    "@eslint/eslintrc" "^2.1.4"
+    "@eslint/js" "8.57.1"
+    "@humanwhocodes/config-array" "^0.13.0"
     "@humanwhocodes/module-importer" "^1.0.1"
     "@nodelib/fs.walk" "^1.2.8"
+    "@ungap/structured-clone" "^1.2.0"
     ajv "^6.12.4"
     chalk "^4.0.0"
     cross-spawn "^7.0.2"
@@ -8244,46 +8012,14 @@ eslint@^8.49.0:
     strip-ansi "^6.0.1"
     text-table "^0.2.0"
 
-eslint@^8.7.0:
-  version "8.19.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.19.0.tgz#7342a3cbc4fbc5c106a1eefe0fd0b50b6b1a7d28"
-  integrity sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw==
+espree@^10.1.0:
+  version "10.3.0"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a"
+  integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==
   dependencies:
-    "@eslint/eslintrc" "^1.3.0"
-    "@humanwhocodes/config-array" "^0.9.2"
-    ajv "^6.10.0"
-    chalk "^4.0.0"
-    cross-spawn "^7.0.2"
-    debug "^4.3.2"
-    doctrine "^3.0.0"
-    escape-string-regexp "^4.0.0"
-    eslint-scope "^7.1.1"
-    eslint-utils "^3.0.0"
-    eslint-visitor-keys "^3.3.0"
-    espree "^9.3.2"
-    esquery "^1.4.0"
-    esutils "^2.0.2"
-    fast-deep-equal "^3.1.3"
-    file-entry-cache "^6.0.1"
-    functional-red-black-tree "^1.0.1"
-    glob-parent "^6.0.1"
-    globals "^13.15.0"
-    ignore "^5.2.0"
-    import-fresh "^3.0.0"
-    imurmurhash "^0.1.4"
-    is-glob "^4.0.0"
-    js-yaml "^4.1.0"
-    json-stable-stringify-without-jsonify "^1.0.1"
-    levn "^0.4.1"
-    lodash.merge "^4.6.2"
-    minimatch "^3.1.2"
-    natural-compare "^1.4.0"
-    optionator "^0.9.1"
-    regexpp "^3.2.0"
-    strip-ansi "^6.0.1"
-    strip-json-comments "^3.1.0"
-    text-table "^0.2.0"
-    v8-compile-cache "^2.0.3"
+    acorn "^8.14.0"
+    acorn-jsx "^5.3.2"
+    eslint-visitor-keys "^4.2.0"
 
 espree@^4.1.0:
   version "4.1.0"
@@ -8321,31 +8057,15 @@ espree@^9.3.1, espree@^9.6.0, espree@^9.6.1:
     acorn-jsx "^5.3.2"
     eslint-visitor-keys "^3.4.1"
 
-espree@^9.3.2:
-  version "9.3.2"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
-  integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
-  dependencies:
-    acorn "^8.7.1"
-    acorn-jsx "^5.3.2"
-    eslint-visitor-keys "^3.3.0"
-
 esprima@^4.0.0, esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
-esquery@^1.0.1, esquery@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
-  integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
-  dependencies:
-    estraverse "^5.1.0"
-
-esquery@^1.4.2, esquery@^1.5.0:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
-  integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+esquery@^1.0.1, esquery@^1.4.0, esquery@^1.4.2, esquery@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+  integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
   dependencies:
     estraverse "^5.1.0"
 
@@ -8437,36 +8157,6 @@ execa@^4.0.0:
     signal-exit "^3.0.2"
     strip-final-newline "^2.0.0"
 
-execa@^5.0.0:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
-  integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
-  dependencies:
-    cross-spawn "^7.0.3"
-    get-stream "^6.0.0"
-    human-signals "^2.1.0"
-    is-stream "^2.0.0"
-    merge-stream "^2.0.0"
-    npm-run-path "^4.0.1"
-    onetime "^5.1.2"
-    signal-exit "^3.0.3"
-    strip-final-newline "^2.0.0"
-
-execa@^7.1.1:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9"
-  integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==
-  dependencies:
-    cross-spawn "^7.0.3"
-    get-stream "^6.0.1"
-    human-signals "^4.3.0"
-    is-stream "^3.0.0"
-    merge-stream "^2.0.0"
-    npm-run-path "^5.1.0"
-    onetime "^6.0.0"
-    signal-exit "^3.0.7"
-    strip-final-newline "^3.0.0"
-
 exit@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@@ -8498,15 +8188,15 @@ expect@^26.6.2:
     jest-regex-util "^26.0.0"
 
 expect@^29.0.0:
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-29.0.3.tgz#6be65ddb945202f143c4e07c083f4f39f3bd326f"
-  integrity sha512-t8l5DTws3212VbmPL+tBFXhjRHLmctHB0oQbL8eUc6S7NzZtYUhycrFO9mkxA0ZUC6FAWdNi7JchJSkODtcu1Q==
+  version "29.7.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc"
+  integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==
   dependencies:
-    "@jest/expect-utils" "^29.0.3"
-    jest-get-type "^29.0.0"
-    jest-matcher-utils "^29.0.3"
-    jest-message-util "^29.0.3"
-    jest-util "^29.0.3"
+    "@jest/expect-utils" "^29.7.0"
+    jest-get-type "^29.6.3"
+    jest-matcher-utils "^29.7.0"
+    jest-message-util "^29.7.0"
+    jest-util "^29.7.0"
 
 expose-loader@0.7.5:
   version "0.7.5"
@@ -8514,36 +8204,36 @@ expose-loader@0.7.5:
   integrity sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==
 
 express@^4.16.3, express@^4.17.1:
-  version "4.18.1"
-  resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
-  integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
+  version "4.21.1"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281"
+  integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==
   dependencies:
     accepts "~1.3.8"
     array-flatten "1.1.1"
-    body-parser "1.20.0"
+    body-parser "1.20.3"
     content-disposition "0.5.4"
     content-type "~1.0.4"
-    cookie "0.5.0"
+    cookie "0.7.1"
     cookie-signature "1.0.6"
     debug "2.6.9"
     depd "2.0.0"
-    encodeurl "~1.0.2"
+    encodeurl "~2.0.0"
     escape-html "~1.0.3"
     etag "~1.8.1"
-    finalhandler "1.2.0"
+    finalhandler "1.3.1"
     fresh "0.5.2"
     http-errors "2.0.0"
-    merge-descriptors "1.0.1"
+    merge-descriptors "1.0.3"
     methods "~1.1.2"
     on-finished "2.4.1"
     parseurl "~1.3.3"
-    path-to-regexp "0.1.7"
+    path-to-regexp "0.1.10"
     proxy-addr "~2.0.7"
-    qs "6.10.3"
+    qs "6.13.0"
     range-parser "~1.2.1"
     safe-buffer "5.2.1"
-    send "0.18.0"
-    serve-static "1.15.0"
+    send "0.19.0"
+    serve-static "1.16.2"
     setprototypeof "1.2.0"
     statuses "2.0.1"
     type-is "~1.6.18"
@@ -8624,36 +8314,14 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
   integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
 fast-diff@^1.1.2:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
-  integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
-
-fast-glob@^3.2.4:
-  version "3.2.12"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
-  integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
-  dependencies:
-    "@nodelib/fs.stat" "^2.0.2"
-    "@nodelib/fs.walk" "^1.2.3"
-    glob-parent "^5.1.2"
-    merge2 "^1.3.0"
-    micromatch "^4.0.4"
-
-fast-glob@^3.2.9:
-  version "3.2.11"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
-  integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
-  dependencies:
-    "@nodelib/fs.stat" "^2.0.2"
-    "@nodelib/fs.walk" "^1.2.3"
-    glob-parent "^5.1.2"
-    merge2 "^1.3.0"
-    micromatch "^4.0.4"
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0"
+  integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==
 
-fast-glob@^3.3.0:
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
-  integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
+fast-glob@^3.2.4, fast-glob@^3.2.9, fast-glob@^3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+  integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
   dependencies:
     "@nodelib/fs.stat" "^2.0.2"
     "@nodelib/fs.walk" "^1.2.3"
@@ -8671,15 +8339,20 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
   integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
 
+fast-uri@^3.0.1:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241"
+  integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==
+
 fastparse@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
   integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
 
 fastq@^1.6.0:
-  version "1.13.0"
-  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
-  integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+  version "1.17.1"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+  integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
   dependencies:
     reusify "^1.0.4"
 
@@ -8698,9 +8371,9 @@ faye-websocket@~0.11.1:
     websocket-driver ">=0.5.1"
 
 fb-watchman@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
-  integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+  integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
   dependencies:
     bser "2.1.1"
 
@@ -8767,9 +8440,9 @@ file-saver@^2.0.5:
   integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
 
 file-type@^16.5.0:
-  version "16.5.3"
-  resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.3.tgz#474b7e88c74724046abb505e9b8ed4db30c4fc06"
-  integrity sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==
+  version "16.5.4"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-16.5.4.tgz#474fb4f704bee427681f98dd390058a172a6c2fd"
+  integrity sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==
   dependencies:
     readable-web-to-node-stream "^3.0.0"
     strtok3 "^6.2.4"
@@ -8800,27 +8473,27 @@ fill-range@^4.0.0:
     repeat-string "^1.6.1"
     to-regex-range "^2.1.0"
 
-fill-range@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
-  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+fill-range@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+  integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
   dependencies:
     to-regex-range "^5.0.1"
 
 final-form@^4.18.5:
-  version "4.20.7"
-  resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.7.tgz#e7e2eb5fd952951d4fe6153d46043da2d68b207e"
-  integrity sha512-ii3X9wNfyBYFnDPunYN5jh1/HAvtOZ9aJI/TVk0MB86hZuOeYkb+W5L3icgwW9WWNztZR6MDU3En6eoZTUoFPg==
+  version "4.20.10"
+  resolved "https://registry.yarnpkg.com/final-form/-/final-form-4.20.10.tgz#1a484be6e9a91989121c054dcbd6f48bad051ecc"
+  integrity sha512-TL48Pi1oNHeMOHrKv1bCJUrWZDcD3DIG6AGYVNOnyZPr7Bd/pStN0pL+lfzF5BNoj/FclaoiaLenk4XUIFVYng==
   dependencies:
     "@babel/runtime" "^7.10.0"
 
-finalhandler@1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
-  integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+finalhandler@1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+  integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
   dependencies:
     debug "2.6.9"
-    encodeurl "~1.0.2"
+    encodeurl "~2.0.0"
     escape-html "~1.0.3"
     on-finished "2.4.1"
     parseurl "~1.3.3"
@@ -8907,11 +8580,12 @@ flat-cache@^2.0.1:
     write "1.0.3"
 
 flat-cache@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
-  integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+  integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
   dependencies:
-    flatted "^3.1.0"
+    flatted "^3.2.9"
+    keyv "^4.5.3"
     rimraf "^3.0.2"
 
 flatted@^2.0.0:
@@ -8919,10 +8593,10 @@ flatted@^2.0.0:
   resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
   integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
 
-flatted@^3.1.0:
-  version "3.2.6"
-  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
-  integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
+flatted@^3.2.9:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+  integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
 
 fluids@^0.1.6:
   version "0.1.10"
@@ -8937,15 +8611,10 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-follow-redirects@^1.0.0, follow-redirects@^1.14.0:
-  version "1.15.1"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
-  integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
-
-follow-redirects@^1.15.0:
-  version "1.15.2"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
-  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.6:
+  version "1.15.9"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+  integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
 
 for-each@^0.3.3:
   version "0.3.3"
@@ -8959,24 +8628,32 @@ for-in@^1.0.2:
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
   integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
 
+foreground-child@^3.1.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77"
+  integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==
+  dependencies:
+    cross-spawn "^7.0.0"
+    signal-exit "^4.0.1"
+
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
   integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
 
 form-data@^3.0.0:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
-  integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.2.tgz#83ad9ced7c03feaad97e293d6f6091011e1659c8"
+  integrity sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==
   dependencies:
     asynckit "^0.4.0"
     combined-stream "^1.0.8"
     mime-types "^2.1.12"
 
 form-data@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
-  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+  integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
   dependencies:
     asynckit "^0.4.0"
     combined-stream "^1.0.8"
@@ -9077,25 +8754,15 @@ fsevents@^1.2.7:
     nan "^2.12.1"
 
 fsevents@^2.0.6, fsevents@^2.1.2, fsevents@~2.3.2:
-  version "2.3.2"
-  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
-  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
 
-function-bind@^1.1.1, function-bind@^1.1.2:
+function-bind@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
   integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
 
-function.prototype.name@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
-  integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.0"
-    functions-have-names "^1.2.2"
-
 function.prototype.name@^1.1.6:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
@@ -9111,7 +8778,7 @@ functional-red-black-tree@^1.0.1:
   resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
   integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
 
-functions-have-names@^1.2.2, functions-have-names@^1.2.3:
+functions-have-names@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
   integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
@@ -9137,16 +8804,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
-get-intrinsic@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
-  integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
-  dependencies:
-    function-bind "^1.1.1"
-    has "^1.0.3"
-    has-symbols "^1.0.3"
-
-get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.4:
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
   integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
@@ -9157,16 +8815,6 @@ get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@
     has-symbols "^1.0.3"
     hasown "^2.0.0"
 
-get-intrinsic@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
-  integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
-  dependencies:
-    function-bind "^1.1.2"
-    has-proto "^1.0.1"
-    has-symbols "^1.0.3"
-    hasown "^2.0.0"
-
 get-nonce@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3"
@@ -9206,18 +8854,14 @@ get-stream@^5.0.0:
   dependencies:
     pump "^3.0.0"
 
-get-stream@^6.0.0, get-stream@^6.0.1:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
-  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-
-get-symbol-description@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
-  integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+get-symbol-description@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+  integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
   dependencies:
-    call-bind "^1.0.2"
-    get-intrinsic "^1.1.1"
+    call-bind "^1.0.5"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
 
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
@@ -9288,7 +8932,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.2:
   dependencies:
     is-glob "^4.0.1"
 
-glob-parent@^6.0.1, glob-parent@^6.0.2:
+glob-parent@^6.0.2:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
   integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
@@ -9307,6 +8951,18 @@ glob@7.0.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+glob@^10.3.10, glob@^10.3.3:
+  version "10.4.5"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
+  integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
+  dependencies:
+    foreground-child "^3.1.0"
+    jackspeak "^3.1.2"
+    minimatch "^9.0.4"
+    minipass "^7.1.2"
+    package-json-from-dist "^1.0.0"
+    path-scurry "^1.11.1"
+
 glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
   version "7.2.3"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
@@ -9330,35 +8986,22 @@ global@^4.4.0:
 globals@^11.1.0, globals@^11.7.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
-  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
-globals@^13.15.0:
-  version "13.15.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
-  integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
-  dependencies:
-    type-fest "^0.20.2"
-
-globals@^13.19.0:
-  version "13.20.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82"
-  integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==
-  dependencies:
-    type-fest "^0.20.2"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
-globals@^13.6.0, globals@^13.9.0:
-  version "13.17.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
-  integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
+globals@^13.19.0, globals@^13.6.0, globals@^13.9.0:
+  version "13.24.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+  integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
   dependencies:
     type-fest "^0.20.2"
 
-globalthis@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
-  integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+globalthis@^1.0.3, globalthis@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+  integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
   dependencies:
-    define-properties "^1.1.3"
+    define-properties "^1.2.1"
+    gopd "^1.0.1"
 
 globby@^11.0.1, globby@^11.1.0:
   version "11.1.0"
@@ -9403,14 +9046,9 @@ gopd@^1.0.1:
     get-intrinsic "^1.1.3"
 
 graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
-  version "4.2.10"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
-  integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
-
-grapheme-splitter@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
-  integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+  version "4.2.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+  integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
 
 graphemer@^1.4.0:
   version "1.4.0"
@@ -9447,23 +9085,23 @@ handle-thing@^2.0.0:
   resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
   integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
 
-handlebars-loader@^1.7.1:
-  version "1.7.2"
-  resolved "https://registry.yarnpkg.com/handlebars-loader/-/handlebars-loader-1.7.2.tgz#1694cc7cb3de1d16bec718af257eed853e4af84d"
-  integrity sha512-rEzru8REzqeJlbotJD+gPQ8AHyxcAjeXbGqGmrz3+sbjecI0ungieONwMR27Htr+AoKI5W36oPLwcwGrPzO8gw==
+handlebars-loader@^1.7.3:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/handlebars-loader/-/handlebars-loader-1.7.3.tgz#579b855770e51c325fbdf4075cca8d76fe10f59f"
+  integrity sha512-dDb+8D51vE3OTSE2wuGPWRAegtsEuw8Mk8hCjtRu/pNcBfN5q+M8ZG3kVJxBuOeBrVElpFStipGmaxSBTRR1mQ==
   dependencies:
     async "^3.2.2"
     fastparse "^1.0.0"
-    loader-utils "1.0.x"
+    loader-utils "1.4.x"
     object-assign "^4.1.0"
 
-handlebars@^4.7.7:
-  version "4.7.7"
-  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
-  integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
+handlebars@^4.7.7, handlebars@^4.7.8:
+  version "4.7.8"
+  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9"
+  integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==
   dependencies:
     minimist "^1.2.5"
-    neo-async "^2.6.0"
+    neo-async "^2.6.2"
     source-map "^0.6.1"
     wordwrap "^1.0.0"
   optionalDependencies:
@@ -9526,7 +9164,7 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
   dependencies:
     es-define-property "^1.0.0"
 
-has-proto@^1.0.1:
+has-proto@^1.0.1, has-proto@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
   integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
@@ -9588,6 +9226,14 @@ hash-base@^3.0.0:
     readable-stream "^3.6.0"
     safe-buffer "^5.2.0"
 
+hash-base@~3.0, hash-base@~3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
 hash.js@^1.0.0, hash.js@^1.0.3:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
@@ -9596,10 +9242,10 @@ hash.js@^1.0.0, hash.js@^1.0.3:
     inherits "^2.0.3"
     minimalistic-assert "^1.0.1"
 
-hasown@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
-  integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+  integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
   dependencies:
     function-bind "^1.1.2"
 
@@ -9707,14 +9353,13 @@ html-minifier@^4.0.0:
     uglify-js "^3.5.1"
 
 html-to-react@^1.3.4:
-  version "1.4.8"
-  resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.8.tgz#1a78fe0ad50fe30b7e62f4e90fdff2f2c043eb1a"
-  integrity sha512-BDOPUYTej5eiOco0V0wxJ5FS+Zckp2O0kb13X1SxQFzyusIeUmnxAK0Cl5M6692bmGBs1WBjh9qF3oQ2AJUZmg==
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.7.0.tgz#1664a0233a930ab1b12c442ddef0f1b72e7459f4"
+  integrity sha512-b5HTNaTGyOj5GGIMiWVr1k57egAZ/vGy0GGefnCQ1VW5hu9+eku8AXHtf2/DeD95cj/FKBKYa1J7SWBOX41yUQ==
   dependencies:
-    domhandler "^4.0"
-    htmlparser2 "^7.0"
+    domhandler "^5.0"
+    htmlparser2 "^9.0"
     lodash.camelcase "^4.3.0"
-    ramda "^0.28.0"
 
 html-webpack-include-assets-plugin@1.0.7:
   version "1.0.7"
@@ -9750,14 +9395,14 @@ htmlparser2@^3.8.3:
     inherits "^2.0.1"
     readable-stream "^3.1.1"
 
-htmlparser2@^4.0.0, htmlparser2@^4.1.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
-  integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
+htmlparser2@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7"
+  integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==
   dependencies:
     domelementtype "^2.0.1"
-    domhandler "^3.0.0"
-    domutils "^2.0.0"
+    domhandler "^3.3.0"
+    domutils "^2.4.2"
     entities "^2.0.0"
 
 htmlparser2@^6.1.0:
@@ -9770,31 +9415,42 @@ htmlparser2@^6.1.0:
     domutils "^2.5.2"
     entities "^2.0.0"
 
-htmlparser2@^7.0:
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-7.2.0.tgz#8817cdea38bbc324392a90b1990908e81a65f5a5"
-  integrity sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==
-  dependencies:
-    domelementtype "^2.0.1"
-    domhandler "^4.2.2"
-    domutils "^2.8.0"
-    entities "^3.0.1"
-
 htmlparser2@^8.0.1:
-  version "8.0.1"
-  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010"
-  integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==
+  version "8.0.2"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21"
+  integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==
   dependencies:
     domelementtype "^2.3.0"
-    domhandler "^5.0.2"
+    domhandler "^5.0.3"
     domutils "^3.0.1"
-    entities "^4.3.0"
+    entities "^4.4.0"
+
+htmlparser2@^9.0, htmlparser2@^9.1.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23"
+  integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==
+  dependencies:
+    domelementtype "^2.3.0"
+    domhandler "^5.0.3"
+    domutils "^3.1.0"
+    entities "^4.5.0"
 
 http-deceiver@^1.2.7:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
   integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
 
+http-errors@1.7.2:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+  integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
 http-errors@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
@@ -9883,38 +9539,35 @@ human-signals@^1.1.1:
   resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
   integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
 
-human-signals@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
-  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-
-human-signals@^4.3.0:
-  version "4.3.1"
-  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
-  integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
-
 human-size@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/human-size/-/human-size-1.1.0.tgz#052562be999841c037022c20259990c56ea996f9"
   integrity sha512-87GIsh59t9qL2939KBKmnT/EfcFk1suakkHoTjHsdnXB/JEU0ibz+9HRiwMueGVhKuRGby6bOtQHd+mIt4BIAQ==
 
 hyphenate-style-name@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d"
-  integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz#1797bf50369588b47b72ca6d5e65374607cf4436"
+  integrity sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==
 
 i@0.3.x:
   version "0.3.7"
   resolved "https://registry.yarnpkg.com/i/-/i-0.3.7.tgz#2a7437a923d59c14b17243dc63a549af24d85799"
   integrity sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==
 
-iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24:
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
   integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.3:
+  version "0.6.3"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+  integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3.0.0"
+
 icss-replace-symbols@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
@@ -9954,10 +9607,10 @@ ignore@^4.0.6:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
-ignore@^5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
-  integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+ignore@^5.2.0, ignore@^5.2.4:
+  version "5.3.2"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+  integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
 
 image-size@^0.5.1:
   version "0.5.5"
@@ -9969,15 +9622,15 @@ immediate@3.0.6:
   resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
   integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
 
-immer@^9.0.21:
-  version "9.0.21"
-  resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
-  integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+immer@^10.0.3:
+  version "10.1.1"
+  resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc"
+  integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==
 
 immutable@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef"
-  integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==
+  version "4.3.7"
+  resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381"
+  integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==
 
 import-cwd@^2.0.0:
   version "2.1.0"
@@ -9994,7 +9647,7 @@ import-fresh@^2.0.0:
     caller-path "^2.0.0"
     resolve-from "^3.0.0"
 
-import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1:
+import-fresh@^3.0.0, import-fresh@^3.2.1:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
   integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
@@ -10018,9 +9671,9 @@ import-local@^2.0.0:
     resolve-cwd "^2.0.0"
 
 import-local@^3.0.2:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
-  integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+  integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
   dependencies:
     pkg-dir "^4.2.0"
     resolve-cwd "^3.0.0"
@@ -10061,11 +9714,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, i
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-inherits@2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
-  integrity sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==
-
 inherits@2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
@@ -10103,16 +9751,7 @@ internal-ip@^4.3.0:
     default-gateway "^4.2.0"
     ipaddr.js "^1.9.0"
 
-internal-slot@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
-  integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
-  dependencies:
-    get-intrinsic "^1.1.0"
-    has "^1.0.3"
-    side-channel "^1.0.4"
-
-internal-slot@^1.0.4:
+internal-slot@^1.0.4, internal-slot@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
   integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
@@ -10121,19 +9760,10 @@ internal-slot@^1.0.4:
     hasown "^2.0.0"
     side-channel "^1.0.4"
 
-internal-slot@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986"
-  integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==
-  dependencies:
-    get-intrinsic "^1.2.0"
-    has "^1.0.3"
-    side-channel "^1.0.4"
-
-internmap@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95"
-  integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==
+"internmap@1 - 2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009"
+  integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==
 
 intersection-observer@0.11.0:
   version "0.11.0"
@@ -10163,9 +9793,9 @@ ip-regex@^2.1.0:
   integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==
 
 ip@^1.1.0, ip@^1.1.5:
-  version "1.1.8"
-  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48"
-  integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396"
+  integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==
 
 ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
   version "1.9.1"
@@ -10177,19 +9807,12 @@ is-absolute-url@^3.0.0, is-absolute-url@^3.0.3:
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
   integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
 
-is-accessor-descriptor@^0.1.6:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
-  integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==
-  dependencies:
-    kind-of "^3.0.2"
-
-is-accessor-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
-  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+is-accessor-descriptor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4"
+  integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
   dependencies:
-    kind-of "^6.0.0"
+    hasown "^2.0.0"
 
 is-alphabetical@^1.0.0:
   version "1.0.4"
@@ -10204,7 +9827,7 @@ is-alphanumerical@^1.0.0:
     is-alphabetical "^1.0.0"
     is-decimal "^1.0.0"
 
-is-arguments@^1.0.4, is-arguments@^1.1.1:
+is-arguments@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
   integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
@@ -10266,23 +9889,11 @@ is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.6:
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
   integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
 
-is-builtin-module@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
-  integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==
-  dependencies:
-    builtin-modules "^3.3.0"
-
-is-callable@^1.1.3, is-callable@^1.2.7:
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
   integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
 
-is-callable@^1.1.4, is-callable@^1.2.4:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
-  integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
-
 is-ci@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
@@ -10290,26 +9901,26 @@ is-ci@^2.0.0:
   dependencies:
     ci-info "^2.0.0"
 
-is-core-module@^2.5.0, is-core-module@^2.9.0:
-  version "2.9.0"
-  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
-  integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+is-core-module@^2.13.0, is-core-module@^2.5.0:
+  version "2.15.1"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+  integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
   dependencies:
-    has "^1.0.3"
+    hasown "^2.0.2"
 
-is-data-descriptor@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
-  integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==
+is-data-descriptor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb"
+  integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
   dependencies:
-    kind-of "^3.0.2"
+    hasown "^2.0.0"
 
-is-data-descriptor@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
-  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+is-data-view@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+  integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
   dependencies:
-    kind-of "^6.0.0"
+    is-typed-array "^1.1.13"
 
 is-date-object@^1.0.1, is-date-object@^1.0.5:
   version "1.0.5"
@@ -10324,22 +9935,20 @@ is-decimal@^1.0.0:
   integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
 
 is-descriptor@^0.1.0:
-  version "0.1.6"
-  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
-  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33"
+  integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
   dependencies:
-    is-accessor-descriptor "^0.1.6"
-    is-data-descriptor "^0.1.4"
-    kind-of "^5.0.0"
+    is-accessor-descriptor "^1.0.1"
+    is-data-descriptor "^1.0.1"
 
 is-descriptor@^1.0.0, is-descriptor@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
-  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306"
+  integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
   dependencies:
-    is-accessor-descriptor "^1.0.0"
-    is-data-descriptor "^1.0.0"
-    kind-of "^6.0.2"
+    is-accessor-descriptor "^1.0.1"
+    is-data-descriptor "^1.0.1"
 
 is-directory@^0.3.1:
   version "0.3.1"
@@ -10351,11 +9960,6 @@ is-docker@^2.0.0, is-docker@^2.1.1:
   resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
   integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
 
-is-docker@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
-  integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
-
 is-dom@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a"
@@ -10436,27 +10040,29 @@ is-hexadecimal@^1.0.0:
   resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
   integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
 
+is-immutable-type@5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/is-immutable-type/-/is-immutable-type-5.0.0.tgz#2325dfa548f8c7f33a0a8926f2603ec9c2ab839f"
+  integrity sha512-mcvHasqbRBWJznuPqqHRKiJgYAz60sZ0mvO3bN70JbkuK7ksfmgc489aKZYxMEjIbRvyOseaTjaRZLRF/xFeRA==
+  dependencies:
+    "@typescript-eslint/type-utils" "^8.0.0"
+    ts-api-utils "^1.3.0"
+    ts-declaration-location "^1.0.4"
+
 is-in-browser@^1.0.2, is-in-browser@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
   integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==
 
-is-inside-container@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
-  integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
-  dependencies:
-    is-docker "^3.0.0"
-
 is-map@^2.0.2, is-map@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
   integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
 
-is-negative-zero@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
-  integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+is-negative-zero@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+  integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
 
 is-number-object@^1.0.4:
   version "1.0.7"
@@ -10533,7 +10139,7 @@ is-promise@^2.1.0:
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
   integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
 
-is-regex@^1.0.4, is-regex@^1.1.4:
+is-regex@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
   integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
@@ -10546,7 +10152,7 @@ is-set@^2.0.2, is-set@^2.0.3:
   resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
   integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
 
-is-shared-array-buffer@^1.0.2:
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
   integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
@@ -10563,11 +10169,6 @@ is-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
   integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
 
-is-stream@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
-  integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
-
 is-string@^1.0.5, is-string@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
@@ -10589,31 +10190,13 @@ is-text-path@^1.0.1:
   dependencies:
     text-extensions "^1.0.0"
 
-is-typed-array@^1.1.10:
+is-typed-array@^1.1.13:
   version "1.1.13"
   resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
   integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
   dependencies:
     which-typed-array "^1.1.14"
 
-is-typed-array@^1.1.12:
-  version "1.1.12"
-  resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
-  integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
-  dependencies:
-    which-typed-array "^1.1.11"
-
-is-typed-array@^1.1.9:
-  version "1.1.10"
-  resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f"
-  integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==
-  dependencies:
-    available-typed-arrays "^1.0.5"
-    call-bind "^1.0.2"
-    for-each "^0.3.3"
-    gopd "^1.0.1"
-    has-tostringtag "^1.0.0"
-
 is-typedarray@^1.0.0, is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -10714,9 +10297,9 @@ isstream@0.1.x, isstream@~0.1.2:
   integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
 
 istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
-  integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+  integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
 
 istanbul-lib-instrument@^4.0.3:
   version "4.0.3"
@@ -10729,9 +10312,9 @@ istanbul-lib-instrument@^4.0.3:
     semver "^6.3.0"
 
 istanbul-lib-instrument@^5.0.4:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f"
-  integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
+  integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
   dependencies:
     "@babel/core" "^7.12.3"
     "@babel/parser" "^7.14.7"
@@ -10740,12 +10323,12 @@ istanbul-lib-instrument@^5.0.4:
     semver "^6.3.0"
 
 istanbul-lib-report@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
-  integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+  integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
   dependencies:
     istanbul-lib-coverage "^3.0.0"
-    make-dir "^3.0.0"
+    make-dir "^4.0.0"
     supports-color "^7.1.0"
 
 istanbul-lib-source-maps@^4.0.0:
@@ -10758,17 +10341,17 @@ istanbul-lib-source-maps@^4.0.0:
     source-map "^0.6.1"
 
 istanbul-reports@^3.0.2:
-  version "3.1.4"
-  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c"
-  integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==
+  version "3.1.7"
+  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b"
+  integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==
   dependencies:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
 
-iterator.prototype@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
-  integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+iterator.prototype@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c"
+  integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==
   dependencies:
     define-properties "^1.2.1"
     get-intrinsic "^1.2.1"
@@ -10776,10 +10359,19 @@ iterator.prototype@^1.1.2:
     reflect.getprototypeof "^1.0.4"
     set-function-name "^2.0.1"
 
+jackspeak@^3.1.2:
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+  integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+  dependencies:
+    "@isaacs/cliui" "^8.0.2"
+  optionalDependencies:
+    "@pkgjs/parseargs" "^0.11.0"
+
 jest-canvas-mock@^2.4.0:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz#947b71442d7719f8e055decaecdb334809465341"
-  integrity sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jest-canvas-mock/-/jest-canvas-mock-2.5.2.tgz#7e21ebd75e05ab41c890497f6ba8a77f915d2ad6"
+  integrity sha512-vgnpPupjOL6+L5oJXzxTxFrlGEIbHdZqFU+LFNdtLxZ3lRDCl17FlTMM7IatoRQkrcyOTMlDinjUguqmQ6bR2A==
   dependencies:
     cssfontparser "^1.2.1"
     moo-color "^1.0.2"
@@ -10846,15 +10438,15 @@ jest-diff@^26.0.0, jest-diff@^26.6.2:
     jest-get-type "^26.3.0"
     pretty-format "^26.6.2"
 
-jest-diff@^29.0.3:
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.0.3.tgz#41cc02409ad1458ae1bf7684129a3da2856341ac"
-  integrity sha512-+X/AIF5G/vX9fWK+Db9bi9BQas7M9oBME7egU7psbn4jlszLFCu0dW63UgeE6cs/GANq4fLaT+8sGHQQ0eCUfg==
+jest-diff@^29.7.0:
+  version "29.7.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
+  integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==
   dependencies:
     chalk "^4.0.0"
-    diff-sequences "^29.0.0"
-    jest-get-type "^29.0.0"
-    pretty-format "^29.0.3"
+    diff-sequences "^29.6.3"
+    jest-get-type "^29.6.3"
+    pretty-format "^29.7.0"
 
 jest-docblock@^26.0.0:
   version "26.0.0"
@@ -10914,10 +10506,10 @@ jest-get-type@^26.3.0:
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
   integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
 
-jest-get-type@^29.0.0:
-  version "29.0.0"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80"
-  integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw==
+jest-get-type@^29.6.3:
+  version "29.6.3"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
+  integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
 
 jest-haste-map@^26.6.2:
   version "26.6.2"
@@ -10992,15 +10584,15 @@ jest-matcher-utils@^26.6.2:
     jest-get-type "^26.3.0"
     pretty-format "^26.6.2"
 
-jest-matcher-utils@^29.0.3:
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.0.3.tgz#b8305fd3f9e27cdbc210b21fc7dbba92d4e54560"
-  integrity sha512-RsR1+cZ6p1hDV4GSCQTg+9qjeotQCgkaleIKLK7dm+U4V/H2bWedU3RAtLm8+mANzZ7eDV33dMar4pejd7047w==
+jest-matcher-utils@^29.7.0:
+  version "29.7.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
+  integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==
   dependencies:
     chalk "^4.0.0"
-    jest-diff "^29.0.3"
-    jest-get-type "^29.0.0"
-    pretty-format "^29.0.3"
+    jest-diff "^29.7.0"
+    jest-get-type "^29.6.3"
+    pretty-format "^29.7.0"
 
 jest-message-util@^25.5.0:
   version "25.5.0"
@@ -11031,18 +10623,18 @@ jest-message-util@^26.6.2:
     slash "^3.0.0"
     stack-utils "^2.0.2"
 
-jest-message-util@^29.0.3:
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.0.3.tgz#f0254e1ffad21890c78355726202cc91d0a40ea8"
-  integrity sha512-7T8JiUTtDfppojosORAflABfLsLKMLkBHSWkjNQrjIltGoDzNGn7wEPOSfjqYAGTYME65esQzMJxGDjuLBKdOg==
+jest-message-util@^29.7.0:
+  version "29.7.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3"
+  integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==
   dependencies:
     "@babel/code-frame" "^7.12.13"
-    "@jest/types" "^29.0.3"
+    "@jest/types" "^29.6.3"
     "@types/stack-utils" "^2.0.0"
     chalk "^4.0.0"
     graceful-fs "^4.2.9"
     micromatch "^4.0.4"
-    pretty-format "^29.0.3"
+    pretty-format "^29.7.0"
     slash "^3.0.0"
     stack-utils "^2.0.3"
 
@@ -11062,9 +10654,9 @@ jest-mock@^26.6.2:
     "@types/node" "*"
 
 jest-pnp-resolver@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
-  integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+  integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
 
 jest-regex-util@^26.0.0:
   version "26.0.0"
@@ -11206,12 +10798,12 @@ jest-util@^26.6.2:
     is-ci "^2.0.0"
     micromatch "^4.0.2"
 
-jest-util@^29.0.3:
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.0.3.tgz#06d1d77f9a1bea380f121897d78695902959fbc0"
-  integrity sha512-Q0xaG3YRG8QiTC4R6fHjHQPaPpz9pJBEi0AeOE4mQh/FuWOijFjGXMMOfQEaU9i3z76cNR7FobZZUQnL6IyfdQ==
+jest-util@^29.7.0:
+  version "29.7.0"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
+  integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==
   dependencies:
-    "@jest/types" "^29.0.3"
+    "@jest/types" "^29.6.3"
     "@types/node" "*"
     chalk "^4.0.0"
     ci-info "^3.2.0"
@@ -11267,14 +10859,20 @@ js-base64@^2.1.9:
   integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
 
 js-beautify@^1.6.12, js-beautify@^1.6.14:
-  version "1.14.4"
-  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.4.tgz#187d600a835f84de67a6d09ceaf3f199b7284c82"
-  integrity sha512-+b4A9c3glceZEmxyIbxDOYB0ZJdReLvyU1077RqKsO4dZx9FUHjTOJn8VHwpg33QoucIykOiYbh7MfqBOghnrA==
+  version "1.15.1"
+  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.1.tgz#4695afb508c324e1084ee0b952a102023fc65b64"
+  integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==
   dependencies:
     config-chain "^1.1.13"
-    editorconfig "^0.15.3"
-    glob "^7.1.3"
-    nopt "^5.0.0"
+    editorconfig "^1.0.4"
+    glob "^10.3.3"
+    js-cookie "^3.0.5"
+    nopt "^7.2.0"
+
+js-cookie@^3.0.5:
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc"
+  integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
 
 js-levenshtein@^1.1.3:
   version "1.1.6"
@@ -11306,10 +10904,10 @@ jsbn@~0.1.0:
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
 
-jsdoc-type-pratt-parser@~4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz#136f0571a99c184d84ec84662c45c29ceff71114"
-  integrity sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==
+jsdoc-type-pratt-parser@~4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz#ff6b4a3f339c34a6c188cbf50a16087858d22113"
+  integrity sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==
 
 jsdom@^16.2.1, jsdom@^16.4.0:
   version "16.7.0"
@@ -11344,15 +10942,15 @@ jsdom@^16.2.1, jsdom@^16.4.0:
     ws "^7.4.6"
     xml-name-validator "^3.0.0"
 
-jsesc@^2.5.1:
-  version "2.5.2"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
-  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+jsesc@^3.0.2, jsesc@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+  integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
 
-jsesc@~0.5.0:
-  version "0.5.0"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
-  integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+json-buffer@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+  integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
 
 json-loader@0.5.7:
   version "0.5.7"
@@ -11390,11 +10988,14 @@ json-stable-stringify-without-jsonify@^1.0.1:
   integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
 
 json-stable-stringify@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
-  integrity sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454"
+  integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==
   dependencies:
-    jsonify "~0.0.0"
+    call-bind "^1.0.5"
+    isarray "^2.0.5"
+    jsonify "^0.0.1"
+    object-keys "^1.1.1"
 
 json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
   version "5.0.1"
@@ -11412,16 +11013,16 @@ json5@^0.5.0:
   integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==
 
 json5@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
-  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+  integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
   dependencies:
     minimist "^1.2.0"
 
-json5@^2.1.0, json5@^2.1.2, json5@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
-  integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+json5@^2.1.0, json5@^2.1.2, json5@^2.2.3:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
 
 jsonfile@^4.0.0:
   version "4.0.0"
@@ -11430,10 +11031,10 @@ jsonfile@^4.0.0:
   optionalDependencies:
     graceful-fs "^4.1.6"
 
-jsonify@~0.0.0:
-  version "0.0.0"
-  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
-  integrity sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==
+jsonify@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978"
+  integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==
 
 jsonparse@^1.2.0:
   version "1.3.1"
@@ -11451,69 +11052,69 @@ jsprim@^1.2.2:
     verror "1.10.0"
 
 jss-plugin-camel-case@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7"
-  integrity sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c"
+  integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==
   dependencies:
     "@babel/runtime" "^7.3.1"
     hyphenate-style-name "^1.0.3"
-    jss "10.9.0"
+    jss "10.10.0"
 
 jss-plugin-default-unit@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz#bb23a48f075bc0ce852b4b4d3f7582bc002df991"
-  integrity sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293"
+  integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
 
 jss-plugin-global@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz#fc07a0086ac97aca174e37edb480b69277f3931f"
-  integrity sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd"
+  integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
 
 jss-plugin-nested@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz#cc1c7d63ad542c3ccc6e2c66c8328c6b6b00f4b3"
-  integrity sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219"
+  integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
     tiny-warning "^1.0.2"
 
 jss-plugin-props-sort@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz#30e9567ef9479043feb6e5e59db09b4de687c47d"
-  integrity sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7"
+  integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
 
 jss-plugin-rule-value-function@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz#379fd2732c0746fe45168011fe25544c1a295d67"
-  integrity sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b"
+  integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
     tiny-warning "^1.0.2"
 
 jss-plugin-vendor-prefixer@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz#aa9df98abfb3f75f7ed59a3ec50a5452461a206a"
-  integrity sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA==
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7"
+  integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==
   dependencies:
     "@babel/runtime" "^7.3.1"
     css-vendor "^2.0.8"
-    jss "10.9.0"
+    jss "10.10.0"
 
-jss@10.9.0, jss@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.0.tgz#7583ee2cdc904a83c872ba695d1baab4b59c141b"
-  integrity sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==
+jss@10.10.0, jss@^10.5.1:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc"
+  integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==
   dependencies:
     "@babel/runtime" "^7.3.1"
     csstype "^3.0.2"
@@ -11528,15 +11129,7 @@ jsx-ast-utils@^2.1.0, jsx-ast-utils@^2.2.3:
     array-includes "^3.1.1"
     object.assign "^4.1.0"
 
-"jsx-ast-utils@^2.4.1 || ^3.0.0":
-  version "3.3.1"
-  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz#a3e0f1cb7e230954eab4dcbce9f6288a78f8ba44"
-  integrity sha512-pxrjmNpeRw5wwVeWyEAk7QJu2GnBO3uzPFmHCKJJFPKK2Cy0cWL23krGtLdnMmbIi6/FjlrQpPyfQI19ByPOhQ==
-  dependencies:
-    array-includes "^3.1.5"
-    object.assign "^4.1.2"
-
-jsx-ast-utils@^3.3.5:
+"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
   version "3.3.5"
   resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
   integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
@@ -11546,22 +11139,29 @@ jsx-ast-utils@^3.3.5:
     object.assign "^4.1.4"
     object.values "^1.1.6"
 
-juice@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/juice/-/juice-7.0.0.tgz#509bed6adbb6e4bbaa7fbfadac4e2e83e8c89ba3"
-  integrity sha512-AjKQX31KKN+uJs+zaf+GW8mBO/f/0NqSh2moTMyvwBY+4/lXIYTU8D8I2h6BAV3Xnz6GGsbalUyFqbYMe+Vh+Q==
+juice@^10.0.0:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/juice/-/juice-10.0.1.tgz#a1492091ef739e4771b9f60aad1a608b5a8ea3ba"
+  integrity sha512-ZhJT1soxJCkOiO55/mz8yeBKTAJhRzX9WBO+16ZTqNTONnnVlUPyVBIzQ7lDRjaBdTbid+bAnyIon/GM3yp4cA==
   dependencies:
-    cheerio "^1.0.0-rc.3"
-    commander "^5.1.0"
+    cheerio "1.0.0-rc.12"
+    commander "^6.1.0"
     mensch "^0.3.4"
     slick "^1.12.2"
-    web-resource-inliner "^5.0.0"
+    web-resource-inliner "^6.0.1"
 
 keycode@^2.1.7:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff"
   integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==
 
+keyv@^4.5.3:
+  version "4.5.4"
+  resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+  integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+  dependencies:
+    json-buffer "3.0.1"
+
 killable@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -11581,12 +11181,12 @@ kind-of@^4.0.0:
   dependencies:
     is-buffer "^1.1.5"
 
-kind-of@^5.0.0, kind-of@^5.0.2:
+kind-of@^5.0.2:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
   integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
 
-kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
+kind-of@^6.0.2, kind-of@^6.0.3:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
   integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@@ -11597,9 +11197,9 @@ kleur@^3.0.3:
   integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
 
 language-subtag-registry@^0.3.20:
-  version "0.3.22"
-  resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d"
-  integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==
+  version "0.3.23"
+  resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7"
+  integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==
 
 language-tags@^1.0.9:
   version "1.0.9"
@@ -11674,14 +11274,14 @@ loader-runner@^2.4.0:
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
   integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
 
-loader-utils@1.0.x:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.0.4.tgz#13f56197f1523a305891248b4c7244540848426c"
-  integrity sha512-TMS4PQ0+m0xyRGBunvDQIdhWJY6JOYeEPpHZEW0EmDhqKrQUj04xiMT3jsdVS17pUg0JzX1mJI3QiV8lXjoEng==
+loader-utils@1.4.x, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.1, loader-utils@^1.2.3, loader-utils@^1.4.0:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3"
+  integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
   dependencies:
-    big.js "^3.1.3"
-    emojis-list "^2.0.0"
-    json5 "^0.5.0"
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
 
 loader-utils@^0.2.16:
   version "0.2.17"
@@ -11693,19 +11293,10 @@ loader-utils@^0.2.16:
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.1, loader-utils@^1.2.3, loader-utils@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
-  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
-  dependencies:
-    big.js "^5.2.2"
-    emojis-list "^3.0.0"
-    json5 "^1.0.1"
-
 loader-utils@^2.0.0:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
-  integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
+  integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
   dependencies:
     big.js "^5.2.2"
     emojis-list "^3.0.0"
@@ -11825,9 +11416,9 @@ loglevel-colored-level-prefix@^1.0.0:
     loglevel "^1.4.1"
 
 loglevel@^1.4.1, loglevel@^1.6.6:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114"
-  integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.9.2.tgz#c2e028d6c757720107df4e64508530db6621ba08"
+  integrity sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==
 
 lolex@^5.0.0:
   version "5.1.2"
@@ -11864,7 +11455,12 @@ lower-case@^1.1.1:
   resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
   integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==
 
-lru-cache@^4.1.1, lru-cache@^4.1.5:
+lru-cache@^10.2.0:
+  version "10.4.3"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+  integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+lru-cache@^4.1.1:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
   integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
@@ -11892,9 +11488,9 @@ lunr@^2.3.6:
   integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==
 
 luxon@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.0.4.tgz#d179e4e9f05e092241e7044f64aaa54796b03929"
-  integrity sha512-aV48rGUwP/Vydn8HT+5cdr26YYQiUZ42NM6ToMoaGKwYfWbfLeRkEu1wXWMHBZT6+KyLfcbbtVcoQFCbbPjKlw==
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.5.0.tgz#6b6f65c5cd1d61d1fd19dbf07ee87a50bf4b8e20"
+  integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==
 
 lz-string@^1.5.0:
   version "1.5.0"
@@ -11902,9 +11498,9 @@ lz-string@^1.5.0:
   integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==
 
 make-cancellable-promise@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.1.0.tgz#b4e9fcb31db3a27417e44f80cffa598ec9ac9f4e"
-  integrity sha512-X5Opjm2xcZsOLuJ+Bnhb4t5yfu4ehlA3OKEYLtqUchgVzL/QaqW373ZUVxVHKwvJ38cmYuR4rAHD2yUvAIkTPA==
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.3.2.tgz#993c8c8b79cff13c74fa93de0bd8a17fe66685c1"
+  integrity sha512-GCXh3bq/WuMbS+Ky4JBPW1hYTOU+znU+Q5m9Pu+pI8EoUqIHk9+tviOKC6/qhHh8C4/As3tzJ69IF32kdz85ww==
 
 make-dir@^1.0.0:
   version "1.3.0"
@@ -11928,10 +11524,17 @@ make-dir@^3.0.0, make-dir@^3.0.2:
   dependencies:
     semver "^6.0.0"
 
+make-dir@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+  integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+  dependencies:
+    semver "^7.5.3"
+
 make-event-props@^1.1.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.3.0.tgz#2434cb390d58bcf40898d009ef5b1f936de9671b"
-  integrity sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q==
+  version "1.6.2"
+  resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.6.2.tgz#c8e0e48eb28b9b808730de38359f6341de7ec5a2"
+  integrity sha512-iDwf7mA03WPiR8QxvcVHmVWEPfMY1RZXerDVNCRYW7dUr2ppH3J58Rwb39/WG39yTZdRSxr3x+2v22tvI0VEvA==
 
 makeerror@1.0.12:
   version "1.0.12"
@@ -12071,10 +11674,10 @@ merge-class-names@^1.1.1:
   resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835"
   integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw==
 
-merge-descriptors@1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
-  integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+merge-descriptors@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+  integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
 
 merge-options@1.0.1:
   version "1.0.1"
@@ -12084,9 +11687,9 @@ merge-options@1.0.1:
     is-plain-obj "^1.1"
 
 merge-refs@^1.0.0:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.2.2.tgz#6142633398dd0d10a37626cae77ddeb1db26db0c"
-  integrity sha512-RwcT7GsQR3KbuLw1rRuodq4Nt547BKEBkliZ0qqsrpyNne9bGTFtsFIsIpx82huWhcl3kOlOlH4H0xkPk/DqVw==
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/merge-refs/-/merge-refs-1.3.0.tgz#65d7f8c5058917b9d1fc204ae4b9a727614d0119"
+  integrity sha512-nqXPXbso+1dcKDpPCXvwZyJILz+vSLqGGOnDrYHQYE+B8n9JTCekVLC65AfCpR4ggVyA/45Y0iR9LDyS2iI+zA==
 
 merge-stream@^2.0.0:
   version "2.0.0"
@@ -12146,12 +11749,12 @@ micromatch@^3.1.10, micromatch@^3.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.2"
 
-micromatch@^4.0.2, micromatch@^4.0.4:
-  version "4.0.5"
-  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
-  integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
+  version "4.0.8"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+  integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
   dependencies:
-    braces "^3.0.2"
+    braces "^3.0.3"
     picomatch "^2.3.1"
 
 miller-rabin@^4.0.0:
@@ -12162,11 +11765,16 @@ miller-rabin@^4.0.0:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+mime-db@1.52.0:
   version "1.52.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
   integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
 
+"mime-db@>= 1.43.0 < 2":
+  version "1.53.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447"
+  integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==
+
 mime-types@2.1.35, mime-types@^2.1.12, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
   version "2.1.35"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -12194,11 +11802,6 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
-mimic-fn@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
-  integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
-
 min-document@^2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
@@ -12237,6 +11840,13 @@ minimalistic-crypto-utils@^1.0.1:
   dependencies:
     brace-expansion "^1.1.7"
 
+minimatch@9.0.1:
+  version "9.0.1"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253"
+  integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimatch@9.0.3:
   version "9.0.3"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
@@ -12244,6 +11854,20 @@ minimatch@9.0.3:
   dependencies:
     brace-expansion "^2.0.1"
 
+minimatch@^10.0.0:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b"
+  integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minimatch@^9.0.3, minimatch@^9.0.4:
+  version "9.0.5"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+  integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+  dependencies:
+    brace-expansion "^2.0.1"
+
 minimist-options@4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
@@ -12254,9 +11878,9 @@ minimist-options@4.1.0:
     kind-of "^6.0.3"
 
 minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
-  integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+  version "1.2.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+  integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
 
 minipass-collect@^1.0.2:
   version "1.0.2"
@@ -12288,12 +11912,22 @@ minipass@^2.6.0, minipass@^2.9.0:
     yallist "^3.0.0"
 
 minipass@^3.0.0, minipass@^3.1.1:
-  version "3.3.4"
-  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.4.tgz#ca99f95dd77c43c7a76bf51e6d200025eee0ffae"
-  integrity sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==
+  version "3.3.6"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+  integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
   dependencies:
     yallist "^4.0.0"
 
+minipass@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+  integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+  integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
 minizlib@^1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d"
@@ -12354,349 +11988,350 @@ mixin-deep@^1.2.0:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-mjml-accordion@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-accordion/-/mjml-accordion-4.12.0.tgz#8fa8a6777fc12caeac9aa8f21b77ac6a3e9b9261"
-  integrity sha512-vqBk4NhXN+w6F3c5vnLxkvgneREpkwTzZpbxtMzpNqkUW2yei0oSQ26j/wLgXYTaX+4Czp+oVr0cnNxjyCZHjA==
+mjml-accordion@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-accordion/-/mjml-accordion-4.15.3.tgz#10e4c4297df3ad8dfa709fc64e887f89bfbff0a8"
+  integrity sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-body@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-body/-/mjml-body-4.12.0.tgz#97feb40e556ceb6444c6af3d79db3d96e9bc9549"
-  integrity sha512-IQBAHhdRKsNUXat+oxvRTjVJ1qzTRkNjFe/mtD/Pbn9olUnQmV+RKxnkqRZf7QtiTxVIOGC4kU9VLPjNymsFXQ==
+mjml-body@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-body/-/mjml-body-4.15.3.tgz#8885b2921f6daa1a287e8aea0924ee1fc4aaf222"
+  integrity sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-browser@^4.10.2:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-browser/-/mjml-browser-4.12.0.tgz#61a0458bac77479032814ced5e2b63edf84200d6"
-  integrity sha512-dD2DJmR2a5o4+LjB2u2Xt9nhE5YWJYD5+iVKpk2/oc50LMmX5KL6HcIbGJjYltt4ehtQADZPZ8YVsl11BgS0Zg==
+mjml-browser@^4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-browser/-/mjml-browser-4.15.3.tgz#16e129d65bb1fe911b096a300cd60b20d46ac407"
+  integrity sha512-HS3YFo6mfle+TLnaRzUbDa9COwkm860lAuHXD5e7qxi90AVhGdAnG1KAVrriEfQSuYcAZbhZjZtp6GhvXi6XcA==
 
-mjml-button@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-button/-/mjml-button-4.12.0.tgz#c89103f702181f0722787ab9905affe98f326c73"
-  integrity sha512-XJfLP+mHvCr6Ky16ooYz5+8ODkf10+ATyvENCKyrof+rietr5WxN2FxWCZA9Orq20OE74/hvaOeZZdkxwtsXig==
+mjml-button@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-button/-/mjml-button-4.15.3.tgz#34baf2d7fbf77a5febe6993e311103723279adbd"
+  integrity sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-carousel@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-carousel/-/mjml-carousel-4.12.0.tgz#0fdd9954c53108aa8c35cf9f6c2a3af9626566f8"
-  integrity sha512-vQ5Aqvix9mbAE0GspxIDpKK4dVMRuKFO3qV6N/CkrIAOe4+2CKV4AMn2fWUvQEx6hA6CGxayeLkI7E0hNOWcZA==
+mjml-carousel@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-carousel/-/mjml-carousel-4.15.3.tgz#fe82d2c4c8020ef14f3b360316c670f7da294193"
+  integrity sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-cli@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-cli/-/mjml-cli-4.12.0.tgz#1911b8fa9925ae59e760714ba1c3a404c2c23393"
-  integrity sha512-//Y4XsN6aFgpZtDbQZRu4qe+CQzGWV3i5K3rC1dwPcdtpDMsXBPKiwIZFrQxpRVBwxs0hU4ZBQOMtvYZkoicdQ==
+mjml-cli@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-cli/-/mjml-cli-4.15.3.tgz#5638f1919c952d224f51970a2fbf3141dee6d487"
+  integrity sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     chokidar "^3.0.0"
-    glob "^7.1.1"
+    glob "^10.3.10"
     html-minifier "^4.0.0"
     js-beautify "^1.6.14"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
-    mjml-migrate "4.12.0"
-    mjml-parser-xml "4.12.0"
-    mjml-validator "4.12.0"
-    yargs "^16.1.0"
-
-mjml-column@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-column/-/mjml-column-4.12.0.tgz#8b88423478c5499f845b04701a961195eb88a69b"
-  integrity sha512-Ub/7ov2B1T2jfSpxvF61o3UCU4gGDFUqIelr7ghuazLc2KvTwdHYeR8mWt8l8RBM6zZiWjkYEFMP22ty7WXztg==
-  dependencies:
-    "@babel/runtime" "^7.14.6"
+    minimatch "^9.0.3"
+    mjml-core "4.15.3"
+    mjml-migrate "4.15.3"
+    mjml-parser-xml "4.15.3"
+    mjml-validator "4.15.3"
+    yargs "^17.7.2"
+
+mjml-column@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-column/-/mjml-column-4.15.3.tgz#ffc538f6b87a7340697f88600330110a40f82c05"
+  integrity sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==
+  dependencies:
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-core@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-core/-/mjml-core-4.12.0.tgz#acb6268cd9cd31f7bdfcf54a6dcb10708f976b48"
-  integrity sha512-B3gUkV3kFN1IlzIV3GnpWBmE21XHH5ARyydMxacR75iC53PvJ9c50hr6DWLGdrrDCC6Fdud8jTmgD9dnWPmJhQ==
+mjml-core@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-core/-/mjml-core-4.15.3.tgz#96c30f49340b95bb9c825a6479557cc9ad1af6c6"
+  integrity sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
-    cheerio "1.0.0-rc.10"
-    detect-node "2.0.4"
+    "@babel/runtime" "^7.23.9"
+    cheerio "1.0.0-rc.12"
+    detect-node "^2.0.4"
     html-minifier "^4.0.0"
     js-beautify "^1.6.14"
-    juice "^7.0.0"
+    juice "^10.0.0"
     lodash "^4.17.21"
-    mjml-migrate "4.12.0"
-    mjml-parser-xml "4.12.0"
-    mjml-validator "4.12.0"
+    mjml-migrate "4.15.3"
+    mjml-parser-xml "4.15.3"
+    mjml-validator "4.15.3"
 
-mjml-divider@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-divider/-/mjml-divider-4.12.0.tgz#04baa6096a8da4460aa53a7c930e72a4a792937e"
-  integrity sha512-L87iqrhVS+PnUInYbXK4lcTQcHfWMTL7ZqDL9XEMBywzX8cCfviLNMbqmLCO2HD8nMPVMRbcE32H04T6LyZ2qw==
+mjml-divider@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-divider/-/mjml-divider-4.15.3.tgz#2aadaf7e9955a9d9473f7093598f933aa289c683"
+  integrity sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-group@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-group/-/mjml-group-4.12.0.tgz#ccef836fd7d16166f8f73128d0707fdad3139614"
-  integrity sha512-Rl7Iydd7M2SnbH1ItIi07hYY+FrEai5c6kYMKbcFWAuNupCuvUThuhx1AphMPCZFMLbbPSKNWMarBkWhepS7cw==
+mjml-group@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-group/-/mjml-group-4.15.3.tgz#7e4418d7d4b5d5d5e4d6af9865c25d6d358a7f75"
+  integrity sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-attributes@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-attributes/-/mjml-head-attributes-4.12.0.tgz#21a31fe824f451d95a8750c12f5b7f8dcdaca164"
-  integrity sha512-tRwKUzIrtcw1FGy8Xpy4vrFo0u2daZgqx3X0cM5WWrGFcKe7ZdjNEAkU/3w+WsFjeMcb0fHdKvd+sxBjPJ6fpA==
+mjml-head-attributes@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-attributes/-/mjml-head-attributes-4.15.3.tgz#4c81e561982fca2657bf3dda7576fcafec778b66"
+  integrity sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-breakpoint@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-breakpoint/-/mjml-head-breakpoint-4.12.0.tgz#f71f4ddd8ca0b97c5de864b83aee879345d962cb"
-  integrity sha512-BVVbvAIcIu49P1EJkEPPIY8Gu4GleyzpkdddqD3ihAPn3Pz07SEsFlHvI35eCszuaJeeMbSSxLrsF4m+aQQlvw==
+mjml-head-breakpoint@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-breakpoint/-/mjml-head-breakpoint-4.15.3.tgz#be1fbe6b4f6cd77f7f666b2cb9e48e81f727b74f"
+  integrity sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-font@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-font/-/mjml-head-font-4.12.0.tgz#698af765ef785d353a42d127296e742df15a68f5"
-  integrity sha512-ja5sWbGOIr1gF/7IIPzrgOlWYiKk57BC8JWYRANV7CxNKa635sd6aBJHbzXv1A6Ph+zH5KtE0MSQCK8n49BIsw==
+mjml-head-font@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-font/-/mjml-head-font-4.15.3.tgz#0340872d0ffe9e29044d66ede452575cb7da3ddf"
+  integrity sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-html-attributes@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-html-attributes/-/mjml-head-html-attributes-4.12.0.tgz#3c6a6e927ee314a0afd29a08bd103f68ac53a2e1"
-  integrity sha512-XJesJuW9uzlNN5w/S7t5ZquSVDay7BehOKmIZKMwKn1y0SJBXiakcwt9M9hhF0HB189Bew0gpGt3m7QYvTez8g==
+mjml-head-html-attributes@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-html-attributes/-/mjml-head-html-attributes-4.15.3.tgz#852710724b976fac7aabd648f5f9770bfa1e21e5"
+  integrity sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-preview@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-preview/-/mjml-head-preview-4.12.0.tgz#34b8f7797a2170de6f2be4c42b170aa9351340f2"
-  integrity sha512-pr02ZkxwU6/LWhrL3xP/hLrUXx27I1FnfgaYjgvMjh6pMURuy7W+W8BrNJKeyXZo685b2A5lNFDJV7rCJ6HrEQ==
+mjml-head-preview@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-preview/-/mjml-head-preview-4.15.3.tgz#710ce159974bf2924edb7f920dd05280a433afd3"
+  integrity sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-style@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-style/-/mjml-head-style-4.12.0.tgz#d86dd9553dd3f9a057f70c193dd15ef0cf934bd3"
-  integrity sha512-64IVdJ2Xl000SrwLt4cebl+MiZcino/ywMkuLQ/c48XeR6pkvbjXYAInWsdlMG1y041n1bOZICNnQQc4xhNJrw==
+mjml-head-style@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-style/-/mjml-head-style-4.15.3.tgz#66a9a3926888681578c2550c7444e4f8cbddfda3"
+  integrity sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head-title@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head-title/-/mjml-head-title-4.12.0.tgz#d21ee32b2b929bac36140f92ea5b447e039d03af"
-  integrity sha512-c7thJUmNLIdVy1ftLbYUjchHwrIfAb9SHdbuVQHdtQz45a3Ni2nie4AWxF/srn90k8q/uEKtQq1taOa4f71Zug==
+mjml-head-title@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head-title/-/mjml-head-title-4.15.3.tgz#ccbd11a7771965f5ac5f3069f6c4f74668c9e6ea"
+  integrity sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-head@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-head/-/mjml-head-4.12.0.tgz#fe0167cd4d8a16edc0ba1be0e9f73b78ca7be79e"
-  integrity sha512-LcI4ykOB6nMV5W//tF9S1unlXxexfNZUnnyZ2OOzP1V7J5poLXdKXqB8XATN2YGGTsDZ5Q/5V1KO+NnjpW7zSw==
+mjml-head@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-head/-/mjml-head-4.15.3.tgz#3e7311af0de4911dd167c877cf04d4291206cd2f"
+  integrity sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-hero@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-hero/-/mjml-hero-4.12.0.tgz#a1a9e10a0c8693d504d26866c862b17ef554d639"
-  integrity sha512-j87DgSAyLzMMuNtVqR1okkI/orKnvZoR7i+RsA1yueNql9dZtnw3Ezy8cas8MJaAoGOmqIy9AqGRJIr82w4mxQ==
+mjml-hero@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-hero/-/mjml-hero-4.15.3.tgz#c51d9f6d1f37acf7e35d827ce3116f8a4aaf9037"
+  integrity sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-image@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-image/-/mjml-image-4.12.0.tgz#3ac0fd5917aa51c55b3619fa16e460489b0c11c8"
-  integrity sha512-P77M+PLLNn7QvGhL8sx+6yzkQbEMxIQO3yxqUC+x8Ie8kXS8phSNGcqx8qfhdN7p7sQ3CZdOIZSXkG7RRAF94w==
+mjml-image@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-image/-/mjml-image-4.15.3.tgz#e652a4b18663c7d93cc22d88eed45f3fdb9c82ea"
+  integrity sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-migrate@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-migrate/-/mjml-migrate-4.12.0.tgz#b0b2ff7f7b799f4255f13946d8ec6c63a84b2bfd"
-  integrity sha512-KDdPkuOzL9CAekY0CslM0Yqiomk4TubNMszw6UFfylp5xRA3CfBo0HdGcnewHBkZ8+isjPlzDWf3n+NkU11OiA==
+mjml-migrate@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-migrate/-/mjml-migrate-4.15.3.tgz#65e2b335a2ffc7e29e09f96793961d0e8f081d98"
+  integrity sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     js-beautify "^1.6.14"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
-    mjml-parser-xml "4.12.0"
-    yargs "^16.1.0"
+    mjml-core "4.15.3"
+    mjml-parser-xml "4.15.3"
+    yargs "^17.7.2"
 
-mjml-navbar@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-navbar/-/mjml-navbar-4.12.0.tgz#2b5c965c83fae83a38c5e4534f325450faf5bc86"
-  integrity sha512-TWKV5lFgwUvRbG+FNz6Uo7mGPJRU/BK1v0BeQr1e5Ykft4052iYIuv2XNwRkeoORmLT+7AN8FbkP+TVBpflbWw==
+mjml-navbar@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-navbar/-/mjml-navbar-4.15.3.tgz#c9805a98f24a475dd3feece58e690838c075fdff"
+  integrity sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-parser-xml@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-parser-xml/-/mjml-parser-xml-4.12.0.tgz#5db2285ca4625c443ce369c8de576687db3453aa"
-  integrity sha512-cmCcvoiirH0kuCglGAjwBVfDrlnqS3e83uBwPN6wDN6IfxSgsPT6IV0vRfcJERsr2ThpFjvoSq4GmYi9oCUSMw==
+mjml-parser-xml@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-parser-xml/-/mjml-parser-xml-4.15.3.tgz#8b94550dbe0d16155ea6cd1fb34bc53dba6f59ed"
+  integrity sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==
   dependencies:
-    "@babel/runtime" "^7.14.6"
-    detect-node "2.0.4"
-    htmlparser2 "^4.1.0"
+    "@babel/runtime" "^7.23.9"
+    detect-node "2.1.0"
+    htmlparser2 "^9.1.0"
     lodash "^4.17.15"
 
-mjml-preset-core@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-preset-core/-/mjml-preset-core-4.12.0.tgz#93af147b2f37817e74ef889fc45748b2077ae52c"
-  integrity sha512-zoiCKcl/bK43ltr2J8dY9Qg5fcB3TbhaWcTG84oGYWdii5WEkKTXj5hpP1ss1XqdOGMNLij/HVwmli+xQCo6FQ==
-  dependencies:
-    "@babel/runtime" "^7.14.6"
-    mjml-accordion "4.12.0"
-    mjml-body "4.12.0"
-    mjml-button "4.12.0"
-    mjml-carousel "4.12.0"
-    mjml-column "4.12.0"
-    mjml-divider "4.12.0"
-    mjml-group "4.12.0"
-    mjml-head "4.12.0"
-    mjml-head-attributes "4.12.0"
-    mjml-head-breakpoint "4.12.0"
-    mjml-head-font "4.12.0"
-    mjml-head-html-attributes "4.12.0"
-    mjml-head-preview "4.12.0"
-    mjml-head-style "4.12.0"
-    mjml-head-title "4.12.0"
-    mjml-hero "4.12.0"
-    mjml-image "4.12.0"
-    mjml-navbar "4.12.0"
-    mjml-raw "4.12.0"
-    mjml-section "4.12.0"
-    mjml-social "4.12.0"
-    mjml-spacer "4.12.0"
-    mjml-table "4.12.0"
-    mjml-text "4.12.0"
-    mjml-wrapper "4.12.0"
-
-mjml-raw@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-raw/-/mjml-raw-4.12.0.tgz#3fb7525d630911e2e25eb5dcf7f4904f0e0bec0d"
-  integrity sha512-vQUmrEZEgu0DCca7tiPdQ/vf8GM5QyeaabbLd1rX3XCt5Mid47LCdszmVcrk1WxqNuExIw1fNyEGCCDeP2qCJg==
-  dependencies:
-    "@babel/runtime" "^7.14.6"
+mjml-preset-core@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-preset-core/-/mjml-preset-core-4.15.3.tgz#d4972292b7db42b51d08feb1104ad23ee5d3b87f"
+  integrity sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==
+  dependencies:
+    "@babel/runtime" "^7.23.9"
+    mjml-accordion "4.15.3"
+    mjml-body "4.15.3"
+    mjml-button "4.15.3"
+    mjml-carousel "4.15.3"
+    mjml-column "4.15.3"
+    mjml-divider "4.15.3"
+    mjml-group "4.15.3"
+    mjml-head "4.15.3"
+    mjml-head-attributes "4.15.3"
+    mjml-head-breakpoint "4.15.3"
+    mjml-head-font "4.15.3"
+    mjml-head-html-attributes "4.15.3"
+    mjml-head-preview "4.15.3"
+    mjml-head-style "4.15.3"
+    mjml-head-title "4.15.3"
+    mjml-hero "4.15.3"
+    mjml-image "4.15.3"
+    mjml-navbar "4.15.3"
+    mjml-raw "4.15.3"
+    mjml-section "4.15.3"
+    mjml-social "4.15.3"
+    mjml-spacer "4.15.3"
+    mjml-table "4.15.3"
+    mjml-text "4.15.3"
+    mjml-wrapper "4.15.3"
+
+mjml-raw@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-raw/-/mjml-raw-4.15.3.tgz#ab771a3d9b5b05583ff90653bf7ca74ec96ffc20"
+  integrity sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==
+  dependencies:
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-section@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-section/-/mjml-section-4.12.0.tgz#9d67bd52bb8418a76765d556f60467a506ed79b9"
-  integrity sha512-5BdHrAghS/XJ40t3qtLHpY3rIVuBnJXv8dGm8U+oMVAzw3L4ySk5WI+FulRkchdPFCKpeXQZjXZaX0C7pmNaIw==
+mjml-section@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-section/-/mjml-section-4.15.3.tgz#ba2b524449b18a4fbbdf05c223a0627e02afa7a9"
+  integrity sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-social@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-social/-/mjml-social-4.12.0.tgz#7423acc02a180c91b186806ba7e522861dcbc8bf"
-  integrity sha512-eTsqJoKP65Imawh+WEX2dv4N34ItUmvIbsCeSQPhC/NG6klxDjzg5oDA1F2tZk+CPIuXVmJiauQ5/vPHLzUiVw==
+mjml-social@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-social/-/mjml-social-4.15.3.tgz#8d1ac1dfd3c56077e1106ead283a40878a2c32d9"
+  integrity sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-spacer@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-spacer/-/mjml-spacer-4.12.0.tgz#129662cfc02ef777973517eadd99cfdf6c3ab215"
-  integrity sha512-YB+VCixcuWXDzICrGLFw7PJDkL166e4OG8IUUB2yhvd5VHtFFBc0iRksaEAumOL1r6MnXVCRq4Wcmxlzj7zOfQ==
+mjml-spacer@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-spacer/-/mjml-spacer-4.15.3.tgz#9a2a4b9d51df2e9cae9fbe9848fd722ef0dfd335"
+  integrity sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-table@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-table/-/mjml-table-4.12.0.tgz#e8682786a43a144e96d43c2891affab8facc3dde"
-  integrity sha512-IuLvyiJOsM6RgobuIfZuM36fJcoH8pK/A4awCLTEme0HCxEkkjzDkl4RBMK/KX53Cpor0U6oR6RlQfZcducpLg==
+mjml-table@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-table/-/mjml-table-4.15.3.tgz#702271761e450172bd5dda9ffcb2faefed3f5db0"
+  integrity sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-text@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-text/-/mjml-text-4.12.0.tgz#615af59c8932433b82dd8c7f5d132ec7625f397f"
-  integrity sha512-AFcXiQBC48ZfKKgAdU0NRS2nqftc8zLGxBtPwHNgFkuh5Lf2rWgPK6JRubNi7qhb8Sd7M8stU+LIRA5sxM1nRQ==
+mjml-text@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-text/-/mjml-text-4.15.3.tgz#045ca711b0c18d2ba163c5a9f296a0c7ed82dbfc"
+  integrity sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
+    mjml-core "4.15.3"
 
-mjml-validator@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-validator/-/mjml-validator-4.12.0.tgz#f359f89f8ca6bfe955af2bf351a48055d59db903"
-  integrity sha512-EmOScfcJJ4LdIyHnE+K4FdkryQ+c6QRV7qp+zlunAHE5AUPaBS0OrHPHuNo1sOu7g1tc+bVl7eHR4FIb0Wkzwg==
+mjml-validator@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-validator/-/mjml-validator-4.15.3.tgz#c7934ca66ff41fa7293927b1328cfbafa8268ffb"
+  integrity sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
 
 mjml-web@^4.10.0:
   version "4.10.0"
   resolved "https://registry.yarnpkg.com/mjml-web/-/mjml-web-4.10.0.tgz#4313c9f1071ac25aade2a5692fb9eaeec18c3cad"
   integrity sha512-jacnZrDl2nGTkQIL2n2sbX//caHrpSOcDjAnAgmkxj+V6dJMhLOso4GGX484obDxRx7W7ZQLFBCC37C18LIxkg==
 
-mjml-wrapper@4.12.0:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml-wrapper/-/mjml-wrapper-4.12.0.tgz#8f2b6ee108ed5cc49dd7fbe75c09a77351221d03"
-  integrity sha512-u0pq+A9QBLwpeF/hdv2uWZIv3Qp4wwf+CMaHZsUpb3YfOJD/6YKwLvkeA7ngE+YxwwzgtgjmIEs4eDae1evlgQ==
+mjml-wrapper@4.15.3:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml-wrapper/-/mjml-wrapper-4.15.3.tgz#6526824608514561376ecfdab079275f53cc8706"
+  integrity sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==
   dependencies:
-    "@babel/runtime" "^7.14.6"
+    "@babel/runtime" "^7.23.9"
     lodash "^4.17.21"
-    mjml-core "4.12.0"
-    mjml-section "4.12.0"
+    mjml-core "4.15.3"
+    mjml-section "4.15.3"
 
 mjml@^4.10.2:
-  version "4.12.0"
-  resolved "https://registry.yarnpkg.com/mjml/-/mjml-4.12.0.tgz#bcf5c508075c5b05d84f611180234f4a2b3e13b0"
-  integrity sha512-uWDu1pPQVyoX4iKIrM02J6qOBN6PC1rSMP64DKi2qGU4dpOztVgvTBh6JttIbINV4ZiALtpeGu+jeEUqp2ROXA==
-  dependencies:
-    "@babel/runtime" "^7.14.6"
-    mjml-cli "4.12.0"
-    mjml-core "4.12.0"
-    mjml-migrate "4.12.0"
-    mjml-preset-core "4.12.0"
-    mjml-validator "4.12.0"
-
-mkdirp@0.x.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1, mkdirp@~0.5.x:
+  version "4.15.3"
+  resolved "https://registry.yarnpkg.com/mjml/-/mjml-4.15.3.tgz#d46996d63e957ae946b2da6ca78fcef5186beee9"
+  integrity sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==
+  dependencies:
+    "@babel/runtime" "^7.23.9"
+    mjml-cli "4.15.3"
+    mjml-core "4.15.3"
+    mjml-migrate "4.15.3"
+    mjml-preset-core "4.15.3"
+    mjml-validator "4.15.3"
+
+mkdirp@0.x.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@^0.5.6, mkdirp@~0.5.1, mkdirp@~0.5.x:
   version "0.5.6"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
   integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
@@ -12753,12 +12388,7 @@ ms@2.0.0:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
   integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
 
-ms@2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
-  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-ms@2.1.3, ms@^2.1.1:
+ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
   integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -12773,9 +12403,9 @@ msgpack5@^4.0.2:
     readable-stream "^2.3.6"
     safe-buffer "^5.1.2"
 
-"mui-bottom-sheet@https://github.com/cozy/mui-bottom-sheet.git#v1.0.9":
+"mui-bottom-sheet@git+https://github.com/cozy/mui-bottom-sheet.git#v1.0.9":
   version "1.0.8"
-  resolved "https://github.com/cozy/mui-bottom-sheet.git#3dc4c2a245ab39079bc2f73546bccf80847be14c"
+  resolved "git+https://github.com/cozy/mui-bottom-sheet.git#3dc4c2a245ab39079bc2f73546bccf80847be14c"
   dependencies:
     "@juggle/resize-observer" "^3.1.3"
     jest-environment-jsdom-sixteen "^1.0.3"
@@ -12816,9 +12446,9 @@ mz@^2.4.0:
     thenify-all "^1.0.0"
 
 nan@^2.12.1:
-  version "2.16.0"
-  resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916"
-  integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==
+  version "2.22.0"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
+  integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
 
 nanoclone@^0.2.1:
   version "0.2.1"
@@ -12842,11 +12472,6 @@ nanomatch@^1.2.1, nanomatch@^1.2.9:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-natural-compare-lite@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
-  integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==
-
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -12862,7 +12487,12 @@ negotiator@0.6.3:
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
   integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
 
-neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
+negotiator@~0.6.4:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7"
+  integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==
+
+neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
   integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
@@ -12894,10 +12524,15 @@ nock@^12.0.3:
     lodash "^4.17.13"
     propagate "^2.0.0"
 
-node-fetch@2.6.7, node-fetch@^2.0.0, node-fetch@^2.6.0, node-fetch@^2.6.1:
-  version "2.6.7"
-  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
-  integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+node-addon-api@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
+  integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
+
+node-fetch@2.7.0, node-fetch@^2.0.0, node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+  integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
   dependencies:
     whatwg-url "^5.0.0"
 
@@ -12978,7 +12613,7 @@ node-notifier@^8.0.0:
     uuid "^8.3.0"
     which "^2.0.2"
 
-node-polyglot@2.4.2, node-polyglot@^2.2.2, node-polyglot@^2.4.0:
+node-polyglot@2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/node-polyglot/-/node-polyglot-2.4.2.tgz#e4876e6710b70dc00b1351a9a68de4af47a5d61d"
   integrity sha512-AgTVpQ32BQ5XPI+tFHJ9bCYxWwSLvtmEodX8ooftFhEuyCgBG6ijWulIVb7pH3THigtgvc9uLiPn0IO51KHpkg==
@@ -12989,17 +12624,26 @@ node-polyglot@2.4.2, node-polyglot@^2.2.2, node-polyglot@^2.4.0:
     string.prototype.trim "^1.2.4"
     warning "^4.0.3"
 
-node-releases@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666"
-  integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==
+node-polyglot@^2.4.0, node-polyglot@^2.5.0:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/node-polyglot/-/node-polyglot-2.6.0.tgz#3d5889664253d90babc0fcd3c12ae0ac7b98289f"
+  integrity sha512-ZZFkaYzIfGfBvSM6QhA9dM8EEaUJOVewzGSRcXWbJELXDj0lajAtKaENCYxvF5yE+TgHg6NQb0CmgYMsMdcNJQ==
+  dependencies:
+    hasown "^2.0.2"
+    object.entries "^1.1.8"
+    warning "^4.0.3"
 
-nopt@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
-  integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
+node-releases@^2.0.18:
+  version "2.0.18"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+  integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
+
+nopt@^7.2.0:
+  version "7.2.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7"
+  integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==
   dependencies:
-    abbrev "1"
+    abbrev "^2.0.0"
 
 normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
   version "2.5.0"
@@ -13050,20 +12694,13 @@ npm-run-path@^2.0.0:
   dependencies:
     path-key "^2.0.0"
 
-npm-run-path@^4.0.0, npm-run-path@^4.0.1:
+npm-run-path@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
   integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
   dependencies:
     path-key "^3.0.0"
 
-npm-run-path@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
-  integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
-  dependencies:
-    path-key "^4.0.0"
-
 nth-check@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@@ -13097,9 +12734,9 @@ number-is-nan@^1.0.0:
   integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
 
 nwsapi@^2.2.0:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.1.tgz#10a9f268fbf4c461249ebcfe38e359aa36e2577c"
-  integrity sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==
+  version "2.2.13"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.13.tgz#e56b4e98960e7a040e5474536587e599c4ff4655"
+  integrity sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==
 
 oauth-sign@~0.9.0:
   version "0.9.0"
@@ -13130,28 +12767,10 @@ object-hash@^3.0.0:
   resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
   integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
 
-object-inspect@^1.12.0:
-  version "1.12.2"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
-  integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
-
-object-inspect@^1.12.3:
-  version "1.12.3"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9"
-  integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==
-
 object-inspect@^1.13.1:
-  version "1.13.1"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
-  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
-
-object-is@^1.0.1:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
-  integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
+  version "1.13.2"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+  integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
 
 object-is@^1.1.5:
   version "1.1.6"
@@ -13173,17 +12792,7 @@ object-visit@^1.0.0:
   dependencies:
     isobject "^3.0.0"
 
-object.assign@^4.1.0, object.assign@^4.1.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
-  integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
-  dependencies:
-    call-bind "^1.0.0"
-    define-properties "^1.1.3"
-    has-symbols "^1.0.1"
-    object-keys "^1.1.1"
-
-object.assign@^4.1.4:
+object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.5:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
   integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
@@ -13193,77 +12802,37 @@ object.assign@^4.1.4:
     has-symbols "^1.0.3"
     object-keys "^1.1.1"
 
-object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.4:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
-  integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.1"
-
-object.entries@^1.1.6:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23"
-  integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
-
-object.entries@^1.1.7:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131"
-  integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
-
-object.fromentries@^2.0.0, object.fromentries@^2.0.2:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251"
-  integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.1"
-
-object.fromentries@^2.0.6:
-  version "2.0.6"
-  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73"
-  integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==
+object.entries@^1.1.0, object.entries@^1.1.1, object.entries@^1.1.4, object.entries@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
+  integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
 
-object.fromentries@^2.0.7:
-  version "2.0.7"
-  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
-  integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
+object.fromentries@^2.0.0, object.fromentries@^2.0.2, object.fromentries@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+  integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-object-atoms "^1.0.0"
 
 object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
-  version "2.1.4"
-  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz#7965e6437a57278b587383831a9b829455a4bc37"
-  integrity sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==
-  dependencies:
-    array.prototype.reduce "^1.0.4"
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.1"
-
-object.hasown@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92"
-  integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==
+  version "2.1.8"
+  resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923"
+  integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==
   dependencies:
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
+    array.prototype.reduce "^1.0.6"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-object-atoms "^1.0.0"
+    gopd "^1.0.1"
+    safe-array-concat "^1.1.2"
 
 object.pick@^1.3.0:
   version "1.3.0"
@@ -13272,23 +12841,14 @@ object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-object.values@^1.1.0, object.values@^1.1.1:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
-  integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.1"
-
-object.values@^1.1.6:
-  version "1.1.6"
-  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d"
-  integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==
+object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.6, object.values@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+  integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
 
 obuf@^1.0.0, obuf@^1.1.2:
   version "1.1.2"
@@ -13333,20 +12893,13 @@ onetime@^2.0.0:
   dependencies:
     mimic-fn "^1.0.0"
 
-onetime@^5.1.0, onetime@^5.1.2:
+onetime@^5.1.0:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
   integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
   dependencies:
     mimic-fn "^2.1.0"
 
-onetime@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
-  integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
-  dependencies:
-    mimic-fn "^4.0.0"
-
 open@7.4.2:
   version "7.4.2"
   resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
@@ -13364,16 +12917,6 @@ open@8.4.0:
     is-docker "^2.1.1"
     is-wsl "^2.2.0"
 
-open@^9.1.0:
-  version "9.1.0"
-  resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6"
-  integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
-  dependencies:
-    default-browser "^4.0.0"
-    define-lazy-prop "^3.0.0"
-    is-inside-container "^1.0.0"
-    is-wsl "^2.2.0"
-
 opener@^1.5.1:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
@@ -13386,7 +12929,7 @@ opn@^5.5.0:
   dependencies:
     is-wsl "^1.1.0"
 
-optionator@^0.8.1, optionator@^0.8.2:
+optionator@^0.8.2:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
   integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -13398,29 +12941,17 @@ optionator@^0.8.1, optionator@^0.8.2:
     type-check "~0.3.2"
     word-wrap "~1.2.3"
 
-optionator@^0.9.1:
-  version "0.9.1"
-  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
-  integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
-  dependencies:
-    deep-is "^0.1.3"
-    fast-levenshtein "^2.0.6"
-    levn "^0.4.1"
-    prelude-ls "^1.2.1"
-    type-check "^0.4.0"
-    word-wrap "^1.2.3"
-
-optionator@^0.9.3:
-  version "0.9.3"
-  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
-  integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+optionator@^0.9.1, optionator@^0.9.3:
+  version "0.9.4"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+  integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
   dependencies:
-    "@aashutoshrathi/word-wrap" "^1.2.3"
     deep-is "^0.1.3"
     fast-levenshtein "^2.0.6"
     levn "^0.4.1"
     prelude-ls "^1.2.1"
     type-check "^0.4.0"
+    word-wrap "^1.2.5"
 
 os-browserify@^0.3.0:
   version "0.3.0"
@@ -13551,15 +13082,20 @@ p-try@^2.0.0:
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
   integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
-pako@~1.0.5:
+package-json-from-dist@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+  integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
+
+pako@^1.0.10, pako@^1.0.11, pako@^1.0.6, pako@~1.0.5:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
   integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
 
 papaparse@^5.1.1:
-  version "5.3.2"
-  resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.2.tgz#d1abed498a0ee299f103130a6109720404fbd467"
-  integrity sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==
+  version "5.4.1"
+  resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.4.1.tgz#f45c0f871853578bd3a30f92d96fdcfb6ebea127"
+  integrity sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==
 
 parallel-transform@^1.1.0:
   version "1.2.0"
@@ -13584,16 +13120,17 @@ parent-module@^1.0.0:
   dependencies:
     callsites "^3.0.0"
 
-parse-asn1@^5.0.0, parse-asn1@^5.1.5:
-  version "5.1.6"
-  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4"
-  integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==
+parse-asn1@^5.0.0, parse-asn1@^5.1.7:
+  version "5.1.7"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06"
+  integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==
   dependencies:
-    asn1.js "^5.2.0"
-    browserify-aes "^1.0.0"
-    evp_bytestokey "^1.0.0"
-    pbkdf2 "^3.0.3"
-    safe-buffer "^5.1.1"
+    asn1.js "^4.10.1"
+    browserify-aes "^1.2.0"
+    evp_bytestokey "^1.0.3"
+    hash-base "~3.0"
+    pbkdf2 "^3.1.2"
+    safe-buffer "^5.2.1"
 
 parse-entities@^1.1.0:
   version "1.2.2"
@@ -13607,6 +13144,14 @@ parse-entities@^1.1.0:
     is-decimal "^1.0.0"
     is-hexadecimal "^1.0.0"
 
+parse-imports@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/parse-imports/-/parse-imports-2.2.1.tgz#0a6e8b5316beb5c9905f50eb2bbb8c64a4805642"
+  integrity sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==
+  dependencies:
+    es-module-lexer "^1.5.3"
+    slashes "^3.0.12"
+
 parse-json@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@@ -13637,7 +13182,7 @@ parse-node-version@^1.0.0:
   resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
   integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
 
-parse5-htmlparser2-tree-adapter@^6.0.0, parse5-htmlparser2-tree-adapter@^6.0.1:
+parse5-htmlparser2-tree-adapter@^6.0.0:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
   integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
@@ -13645,11 +13190,18 @@ parse5-htmlparser2-tree-adapter@^6.0.0, parse5-htmlparser2-tree-adapter@^6.0.1:
     parse5 "^6.0.1"
 
 parse5-htmlparser2-tree-adapter@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1"
-  integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b"
+  integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==
+  dependencies:
+    domhandler "^5.0.3"
+    parse5 "^7.0.0"
+
+parse5-parser-stream@^7.1.2:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1"
+  integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==
   dependencies:
-    domhandler "^5.0.2"
     parse5 "^7.0.0"
 
 parse5@6.0.1, parse5@^6.0.1:
@@ -13662,12 +13214,12 @@ parse5@^5.1.1:
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
   integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
 
-parse5@^7.0.0:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
-  integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+parse5@^7.0.0, parse5@^7.1.2:
+  version "7.2.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.2.1.tgz#8928f55915e6125f430cc44309765bf17556a33a"
+  integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==
   dependencies:
-    entities "^4.4.0"
+    entities "^4.5.0"
 
 parseurl@~1.3.2, parseurl@~1.3.3:
   version "1.3.3"
@@ -13726,20 +13278,23 @@ path-key@^3.0.0, path-key@^3.1.0:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
 
-path-key@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
-  integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
-
 path-parse@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
   integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
 
-path-to-regexp@0.1.7:
-  version "0.1.7"
-  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
-  integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+path-scurry@^1.11.1:
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+  integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+  dependencies:
+    lru-cache "^10.2.0"
+    minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+path-to-regexp@0.1.10:
+  version "0.1.10"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
+  integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
 
 path-type@^1.0.0:
   version "1.1.0"
@@ -13762,7 +13317,7 @@ path-type@^4.0.0:
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
-pbkdf2@^3.0.3:
+pbkdf2@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
   integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
@@ -13773,6 +13328,16 @@ pbkdf2@^3.0.3:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
+pdf-lib@1.17.1:
+  version "1.17.1"
+  resolved "https://registry.yarnpkg.com/pdf-lib/-/pdf-lib-1.17.1.tgz#9e7dd21261a0c1fb17992580885b39e7d08f451f"
+  integrity sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw==
+  dependencies:
+    "@pdf-lib/standard-fonts" "^1.0.0"
+    "@pdf-lib/upng" "^1.0.1"
+    pako "^1.0.11"
+    tslib "^1.11.1"
+
 pdfjs-dist@2.12.313:
   version "2.12.313"
   resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz#62f2273737bb956267ae2e02cdfaddcb1099819c"
@@ -13793,16 +13358,21 @@ picocolors@^0.2.1:
   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
   integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
 
-picocolors@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
-  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+picocolors@^1.0.0, picocolors@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
 
 picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
+picomatch@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab"
+  integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==
+
 pify@^2.0.0, pify@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -13831,9 +13401,9 @@ pinkie@^2.0.0:
   integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
 
 pirates@^4.0.1:
-  version "4.0.5"
-  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
-  integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
+  version "4.0.6"
+  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
+  integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
 
 piwik-react-router@0.12.1:
   version "0.12.1"
@@ -13890,13 +13460,13 @@ popper.js@1.16.1-lts:
   integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==
 
 portfinder@^1.0.25:
-  version "1.0.28"
-  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778"
-  integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==
+  version "1.0.32"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81"
+  integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==
   dependencies:
-    async "^2.6.2"
-    debug "^3.1.1"
-    mkdirp "^0.5.5"
+    async "^2.6.4"
+    debug "^3.2.7"
+    mkdirp "^0.5.6"
 
 posix-character-classes@^0.1.0:
   version "0.1.1"
@@ -13988,14 +13558,14 @@ postcss-modules-values@^2.0.0:
     postcss "^7.0.6"
 
 postcss-prefix-selector@^1.6.0:
-  version "1.16.0"
-  resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404"
-  integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==
+  version "1.16.1"
+  resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz#87a77523838b79c0e8aec29f173234b2987cdc04"
+  integrity sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==
 
 postcss-selector-parser@^6.0.0:
-  version "6.0.10"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
-  integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
+  version "6.1.2"
+  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de"
+  integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
   dependencies:
     cssesc "^3.0.0"
     util-deprecate "^1.0.2"
@@ -14226,15 +13796,10 @@ prettier@1.18.2:
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
   integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
 
-prettier@^3.0.0:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643"
-  integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==
-
-prettier@^3.0.1:
-  version "3.2.4"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.4.tgz#4723cadeac2ce7c9227de758e5ff9b14e075f283"
-  integrity sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==
+prettier@^3.0.0, prettier@^3.0.1:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105"
+  integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==
 
 pretty-error@^2.0.2:
   version "2.1.2"
@@ -14263,16 +13828,7 @@ pretty-format@^27.0.2:
     ansi-styles "^5.0.0"
     react-is "^17.0.1"
 
-pretty-format@^29.0.0, pretty-format@^29.0.3:
-  version "29.0.3"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.0.3.tgz#23d5f8cabc9cbf209a77d49409d093d61166a811"
-  integrity sha512-cHudsvQr1K5vNVLbvYF/nv3Qy/F/BcEKxGuIeMiVMRHxPOO1RxXooP8g/ZrwAp7Dx+KdMZoOc7NxLHhMrP2f9Q==
-  dependencies:
-    "@jest/schemas" "^29.0.0"
-    ansi-styles "^5.0.0"
-    react-is "^18.0.0"
-
-pretty-format@^29.7.0:
+pretty-format@^29.0.0, pretty-format@^29.7.0:
   version "29.7.0"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
   integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
@@ -14370,9 +13926,9 @@ propagate@^2.0.0:
   integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==
 
 property-expr@^2.0.4:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.5.tgz#278bdb15308ae16af3e3b9640024524f4dc02cb4"
-  integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/property-expr/-/property-expr-2.0.6.tgz#f77bc00d5928a6c748414ad12882e83f24aec1e8"
+  integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==
 
 proto-list@~1.2.1:
   version "1.2.4"
@@ -14403,11 +13959,11 @@ pseudomap@^1.0.2:
   integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
 
 psl@^1.1.28, psl@^1.1.33:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
-  integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+  integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
 
-public-encrypt@^4.0.0:
+public-encrypt@^4.0.3:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
   integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
@@ -14428,9 +13984,9 @@ pump@^2.0.0, pump@^2.0.1:
     once "^1.3.1"
 
 pump@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
-  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+  integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
   dependencies:
     end-of-stream "^1.1.0"
     once "^1.3.1"
@@ -14444,39 +14000,32 @@ pumpify@^1.3.3:
     inherits "^2.0.3"
     pump "^2.0.0"
 
-punycode@1.3.2:
-  version "1.3.2"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
-  integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==
-
 punycode@^1.2.4, punycode@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
   integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==
 
 punycode@^2.1.0, punycode@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
-  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+  integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
 
 q@^1.1.2, q@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
   integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
 
-qs@6.10.3:
-  version "6.10.3"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e"
-  integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+qs@6.13.0, qs@^6.12.3, qs@^6.7.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+  integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
   dependencies:
-    side-channel "^1.0.4"
+    side-channel "^1.0.6"
 
-qs@^6.7.0:
-  version "6.11.0"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
-  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
-  dependencies:
-    side-channel "^1.0.4"
+qs@6.7.0:
+  version "6.7.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+  integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
 
 qs@~6.5.2:
   version "6.5.3"
@@ -14496,11 +14045,6 @@ querystring-es3@^0.2.0:
   resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
   integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==
 
-querystring@0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
-  integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==
-
 querystringify@^2.1.1:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
@@ -14523,11 +14067,6 @@ raf@^3.4.1:
   dependencies:
     performance-now "^2.1.0"
 
-ramda@^0.28.0:
-  version "0.28.0"
-  resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97"
-  integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==
-
 randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
@@ -14535,7 +14074,7 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   dependencies:
     safe-buffer "^5.1.0"
 
-randomfill@^1.0.3:
+randomfill@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
   integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
@@ -14559,10 +14098,20 @@ raven@^2.6.4:
     timed-out "4.0.1"
     uuid "3.3.2"
 
-raw-body@2.5.1, raw-body@^2.4.1:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857"
-  integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+raw-body@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+  integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+  dependencies:
+    bytes "3.1.0"
+    http-errors "1.7.2"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
+raw-body@2.5.2, raw-body@^2.4.1:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+  integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
   dependencies:
     bytes "3.1.2"
     http-errors "2.0.0"
@@ -14600,9 +14149,9 @@ react-event-listener@^0.6.0:
     warning "^4.0.1"
 
 react-fast-compare@^3.0.1:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
-  integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49"
+  integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==
 
 react-final-form@^3.7.0:
   version "3.7.0"
@@ -14638,9 +14187,9 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-i
   integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
 
 react-is@^18.0.0:
-  version "18.2.0"
-  resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
-  integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
+  version "18.3.1"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
+  integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
 
 react-layout-effect@^1.0.1:
   version "1.0.5"
@@ -14704,9 +14253,9 @@ react-redux@5.1.1:
     react-lifecycles-compat "^3.0.0"
 
 react-redux@^7.2.0:
-  version "7.2.8"
-  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.8.tgz#a894068315e65de5b1b68899f9c6ee0923dd28de"
-  integrity sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==
+  version "7.2.9"
+  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d"
+  integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==
   dependencies:
     "@babel/runtime" "^7.15.4"
     "@types/react-redux" "^7.1.20"
@@ -14715,51 +14264,47 @@ react-redux@^7.2.0:
     prop-types "^15.7.2"
     react-is "^17.0.2"
 
-react-redux@^8.1.2:
-  version "8.1.2"
-  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-8.1.2.tgz#9076bbc6b60f746659ad6d51cb05de9c5e1e9188"
-  integrity sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==
+react-redux@^9.1.2:
+  version "9.1.2"
+  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b"
+  integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==
   dependencies:
-    "@babel/runtime" "^7.12.1"
-    "@types/hoist-non-react-statics" "^3.3.1"
     "@types/use-sync-external-store" "^0.0.3"
-    hoist-non-react-statics "^3.3.2"
-    react-is "^18.0.0"
     use-sync-external-store "^1.0.0"
 
-react-remove-scroll-bar@^2.3.3:
-  version "2.3.3"
-  resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.3.tgz#e291f71b1bb30f5f67f023765b7435f4b2b2cd94"
-  integrity sha512-i9GMNWwpz8XpUpQ6QlevUtFjHGqnPG4Hxs+wlIJntu/xcsZVEpJcIV71K3ZkqNy2q3GfgvkD7y6t/Sv8ofYSbw==
+react-remove-scroll-bar@^2.3.6:
+  version "2.3.6"
+  resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c"
+  integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==
   dependencies:
     react-style-singleton "^2.2.1"
     tslib "^2.0.0"
 
 react-remove-scroll@^2.4.0:
-  version "2.5.4"
-  resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0"
-  integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07"
+  integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==
   dependencies:
-    react-remove-scroll-bar "^2.3.3"
+    react-remove-scroll-bar "^2.3.6"
     react-style-singleton "^2.2.1"
     tslib "^2.1.0"
     use-callback-ref "^1.3.0"
     use-sidecar "^1.1.2"
 
 react-router-dom@^6.6.1:
-  version "6.6.1"
-  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.6.1.tgz#1b96ec0b2cefa7319f1251383ea5b41295ee260d"
-  integrity sha512-u+8BKUtelStKbZD5UcY0NY90WOzktrkJJhyhNg7L0APn9t1qJNLowzrM9CHdpB6+rcPt6qQrlkIXsTvhuXP68g==
+  version "6.27.0"
+  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.27.0.tgz#8d7972a425fd75f91c1e1ff67e47240c5752dc3f"
+  integrity sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==
   dependencies:
-    "@remix-run/router" "1.2.1"
-    react-router "6.6.1"
+    "@remix-run/router" "1.20.0"
+    react-router "6.27.0"
 
-react-router@6.6.1:
-  version "6.6.1"
-  resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.6.1.tgz#17de6cf285f2d1c9721a3afca999c984e5558854"
-  integrity sha512-YkvlYRusnI/IN0kDtosUCgxqHeulN5je+ew8W+iA1VvFhf86kA+JEI/X/8NqYcr11hCDDp906S+SGMpBheNeYQ==
+react-router@6.27.0:
+  version "6.27.0"
+  resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.27.0.tgz#db292474926c814c996c0ff3ef0162d1f9f60ed4"
+  integrity sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==
   dependencies:
-    "@remix-run/router" "1.2.1"
+    "@remix-run/router" "1.20.0"
 
 react-select@^4.3.0:
   version "4.3.1"
@@ -14859,9 +14404,9 @@ react-swipeable-views@^0.13.3:
     warning "^4.0.1"
 
 react-transition-group@^4.3.0, react-transition-group@^4.4.0:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470"
-  integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==
+  version "4.4.5"
+  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
+  integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
   dependencies:
     "@babel/runtime" "^7.5.5"
     dom-helpers "^5.0.1"
@@ -14952,10 +14497,10 @@ read@1.0.x:
   dependencies:
     mute-stream "~0.0.4"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
-  version "2.3.7"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
-  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
   dependencies:
     core-util-is "~1.0.0"
     inherits "~2.0.3"
@@ -14966,9 +14511,9 @@ read@1.0.x:
     util-deprecate "~1.0.1"
 
 readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
-  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+  integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
   dependencies:
     inherits "^2.0.3"
     string_decoder "^1.1.1"
@@ -14997,6 +14542,11 @@ readdirp@^3.1.1, readdirp@~3.6.0:
   dependencies:
     picomatch "^2.2.1"
 
+readdirp@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a"
+  integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==
+
 redent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
@@ -15035,19 +14585,19 @@ redux-thunk@2.3.0:
   integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
 
 redux-thunk@^2.3.0:
-  version "2.4.1"
-  resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.1.tgz#0dd8042cf47868f4b29699941de03c9301a75714"
-  integrity sha512-OOYGNY5Jy2TWvTL1KgAlVy6dcx3siPJ1wTq741EPyUKfn6W6nChdICjZwCd0p8AZBs5kWpZlbkXW2nE/zjUa+Q==
-
-redux-thunk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b"
   integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==
 
+redux-thunk@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3"
+  integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==
+
 "redux@3 || 4", redux@^4.0.0, redux@^4.0.5:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.0.tgz#46f10d6e29b6666df758780437651eeb2b969f13"
-  integrity sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
+  integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
   dependencies:
     "@babel/runtime" "^7.9.2"
 
@@ -15058,29 +14608,28 @@ redux@4.1.2:
   dependencies:
     "@babel/runtime" "^7.9.2"
 
-redux@^4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
-  integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
-  dependencies:
-    "@babel/runtime" "^7.9.2"
+redux@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b"
+  integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
 
 reflect.getprototypeof@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3"
-  integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
+  integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
-    get-intrinsic "^1.2.1"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.1"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
     globalthis "^1.0.3"
     which-builtin-type "^1.1.3"
 
-regenerate-unicode-properties@^10.0.1:
-  version "10.0.1"
-  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
-  integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
+regenerate-unicode-properties@^10.2.0:
+  version "10.2.0"
+  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0"
+  integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==
   dependencies:
     regenerate "^1.4.2"
 
@@ -15104,20 +14653,20 @@ regenerator-runtime@^0.12.0:
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
   integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
 
-regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.4:
+regenerator-runtime@^0.13.4:
   version "0.13.11"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
   integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
 
 regenerator-runtime@^0.14.0:
-  version "0.14.0"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
-  integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+  version "0.14.1"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
 
-regenerator-transform@^0.15.0:
-  version "0.15.0"
-  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
-  integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
+regenerator-transform@^0.15.2:
+  version "0.15.2"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+  integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
   dependencies:
     "@babel/runtime" "^7.8.4"
 
@@ -15129,57 +14678,49 @@ regex-not@^1.0.0, regex-not@^1.0.2:
     extend-shallow "^3.0.2"
     safe-regex "^1.1.0"
 
-regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3:
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
-  integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    functions-have-names "^1.2.2"
-
-regexp.prototype.flags@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
-  integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2:
+  version "1.5.3"
+  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+  integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    set-function-name "^2.0.0"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-errors "^1.3.0"
+    set-function-name "^2.0.2"
 
 regexpp@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
   integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
 
-regexpp@^3.1.0, regexpp@^3.2.0:
+regexpp@^3.1.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
   integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
 
-regexpu-core@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d"
-  integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==
+regexpu-core@^6.1.1:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac"
+  integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==
   dependencies:
     regenerate "^1.4.2"
-    regenerate-unicode-properties "^10.0.1"
-    regjsgen "^0.6.0"
-    regjsparser "^0.8.2"
+    regenerate-unicode-properties "^10.2.0"
+    regjsgen "^0.8.0"
+    regjsparser "^0.11.0"
     unicode-match-property-ecmascript "^2.0.0"
-    unicode-match-property-value-ecmascript "^2.0.0"
+    unicode-match-property-value-ecmascript "^2.1.0"
 
-regjsgen@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
-  integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
+regjsgen@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab"
+  integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==
 
-regjsparser@^0.8.2:
-  version "0.8.4"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
-  integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
+regjsparser@^0.11.0:
+  version "0.11.2"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.2.tgz#7404ad42be00226d72bcf1f003f1f441861913d8"
+  integrity sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==
   dependencies:
-    jsesc "~0.5.0"
+    jsesc "~3.0.2"
 
 relateurl@0.2.x, relateurl@^0.2.7:
   version "0.2.7"
@@ -15318,10 +14859,10 @@ requires-port@^1.0.0:
   resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
   integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
 
-reselect@^4.1.8:
-  version "4.1.8"
-  resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524"
-  integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==
+reselect@^5.1.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e"
+  integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==
 
 resolve-cwd@^2.0.0:
   version "2.0.0"
@@ -15357,21 +14898,21 @@ resolve-url@^0.2.1:
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
   integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
 
-resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1:
-  version "1.22.1"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
-  integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.3.2, resolve@^1.8.1:
+  version "1.22.8"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+  integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
   dependencies:
-    is-core-module "^2.9.0"
+    is-core-module "^2.13.0"
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
-resolve@^2.0.0-next.4:
-  version "2.0.0-next.4"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
-  integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==
+resolve@^2.0.0-next.5:
+  version "2.0.0-next.5"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+  integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
   dependencies:
-    is-core-module "^2.9.0"
+    is-core-module "^2.13.0"
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
@@ -15432,10 +14973,15 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
     hash-base "^3.0.0"
     inherits "^2.0.1"
 
+robust-predicates@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
+  integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
+
 rooks@^5.11.2:
-  version "5.11.6"
-  resolved "https://registry.yarnpkg.com/rooks/-/rooks-5.11.6.tgz#8ea93262f950f775bd131212b6167755e49162f4"
-  integrity sha512-qS6tlO2E28pwOu6/Pj98FKqbpvDAGyphAuFuqff8cS/7byf7SZlfCLievpzeWWj/v9Y5FGFYHbia10OlH+cJ0w==
+  version "5.14.1"
+  resolved "https://registry.yarnpkg.com/rooks/-/rooks-5.14.1.tgz#424854e917efc951dd47c4ac9d9e0de5f7648a7e"
+  integrity sha512-ZldHmIdi6NM9zgGJlLbYrOcwvdadzX9RLw11KgfD4WuePMz7Dy50JHZzoPz9oCaKM5iTjAaBXZ3z7Gz9dvt2Hg==
   dependencies:
     lodash.debounce "^4.0.8"
     raf "^3.4.1"
@@ -15450,13 +14996,6 @@ rsvp@^4.8.4:
   resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
   integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
 
-run-applescript@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c"
-  integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
-  dependencies:
-    execa "^5.0.0"
-
 run-async@^2.2.0:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
@@ -15488,13 +15027,13 @@ rxjs@^6.4.0:
   dependencies:
     tslib "^1.9.0"
 
-safe-array-concat@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
-  integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==
+safe-array-concat@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+  integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
   dependencies:
-    call-bind "^1.0.2"
-    get-intrinsic "^1.2.1"
+    call-bind "^1.0.7"
+    get-intrinsic "^1.2.4"
     has-symbols "^1.0.3"
     isarray "^2.0.5"
 
@@ -15508,13 +15047,13 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0,
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
   integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
-safe-regex-test@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
-  integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+safe-regex-test@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+  integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
   dependencies:
-    call-bind "^1.0.2"
-    get-intrinsic "^1.1.3"
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
     is-regex "^1.1.4"
 
 safe-regex@^1.1.0:
@@ -15524,7 +15063,7 @@ safe-regex@^1.1.0:
   dependencies:
     ret "~0.1.10"
 
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0:
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -15556,13 +15095,15 @@ sass-loader@^8.0.0:
     semver "^6.3.0"
 
 sass@^1.49.11:
-  version "1.53.0"
-  resolved "https://registry.yarnpkg.com/sass/-/sass-1.53.0.tgz#eab73a7baac045cc57ddc1d1ff501ad2659952eb"
-  integrity sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==
+  version "1.80.6"
+  resolved "https://registry.yarnpkg.com/sass/-/sass-1.80.6.tgz#5d0aa55763984effe41e40019c9571ab73e6851f"
+  integrity sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==
   dependencies:
-    chokidar ">=3.0.0 <4.0.0"
+    chokidar "^4.0.0"
     immutable "^4.0.0"
     source-map-js ">=0.6.2 <2.0.0"
+  optionalDependencies:
+    "@parcel/watcher" "^2.4.1"
 
 sax@~1.2.4:
   version "1.2.4"
@@ -15577,9 +15118,9 @@ saxes@^5.0.1:
     xmlchars "^2.2.0"
 
 scheduler@^0.23.0:
-  version "0.23.0"
-  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
-  integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
+  version "0.23.2"
+  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
+  integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
   dependencies:
     loose-envify "^1.1.0"
 
@@ -15602,9 +15143,9 @@ schema-utils@^2.6.1, schema-utils@^2.6.5:
     ajv-keywords "^3.5.2"
 
 schema-utils@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
-  integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe"
+  integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==
   dependencies:
     "@types/json-schema" "^7.0.8"
     ajv "^6.12.5"
@@ -15635,43 +15176,24 @@ semver-compare@^1.0.0:
   integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
 
 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
-  version "5.7.1"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
-  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-
-semver@7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
-  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-
-semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
-  version "6.3.0"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
-  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+  version "5.7.2"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
 
-semver@^6.3.1:
+semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
   version "6.3.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
-  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7:
-  version "7.3.7"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
-  integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
-  dependencies:
-    lru-cache "^6.0.0"
+  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
 
-semver@^7.3.6, semver@^7.5.4:
-  version "7.5.4"
-  resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
-  integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
-  dependencies:
-    lru-cache "^6.0.0"
+semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.6, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3:
+  version "7.6.3"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+  integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
 
-send@0.18.0:
-  version "0.18.0"
-  resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
-  integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+send@0.19.0:
+  version "0.19.0"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+  integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
   dependencies:
     debug "2.6.9"
     depd "2.0.0"
@@ -15719,15 +15241,15 @@ serve-index@^1.9.1:
     mime-types "~2.1.17"
     parseurl "~1.3.2"
 
-serve-static@1.15.0:
-  version "1.15.0"
-  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
-  integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+serve-static@1.16.2:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+  integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
   dependencies:
-    encodeurl "~1.0.2"
+    encodeurl "~2.0.0"
     escape-html "~1.0.3"
     parseurl "~1.3.3"
-    send "0.18.0"
+    send "0.19.0"
 
 server-destroy@^1.0.1:
   version "1.0.1"
@@ -15745,19 +15267,9 @@ set-blocking@^2.0.0:
   integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
 
 set-cookie-parser@^2.3.5:
-  version "2.5.0"
-  resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.0.tgz#96b59525e1362c94335c3c761100bb6e8f2da4b0"
-  integrity sha512-cHMAtSXilfyBePduZEBVPTCftTQWz6ehWJD5YNUg4mqvRosrrjKbo4WS8JkB0/RxonMoohHm7cOGH60mDkRQ9w==
-
-set-function-length@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
-  integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
-  dependencies:
-    define-data-property "^1.1.1"
-    get-intrinsic "^1.2.1"
-    gopd "^1.0.1"
-    has-property-descriptors "^1.0.0"
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943"
+  integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==
 
 set-function-length@^1.2.1:
   version "1.2.2"
@@ -15771,7 +15283,7 @@ set-function-length@^1.2.1:
     gopd "^1.0.1"
     has-property-descriptors "^1.0.2"
 
-set-function-name@^2.0.0:
+set-function-name@^2.0.1, set-function-name@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
   integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
@@ -15781,15 +15293,6 @@ set-function-name@^2.0.0:
     functions-have-names "^1.2.3"
     has-property-descriptors "^1.0.2"
 
-set-function-name@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
-  integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
-  dependencies:
-    define-data-property "^1.0.1"
-    functions-have-names "^1.2.3"
-    has-property-descriptors "^1.0.0"
-
 set-value@^2.0.0, set-value@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -15810,6 +15313,11 @@ setprototypeof@1.1.0:
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
   integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
 
+setprototypeof@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
 setprototypeof@1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
@@ -15864,7 +15372,12 @@ shellwords@^0.1.1:
   resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
   integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
 
-side-channel@^1.0.4:
+short-unique-id@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/short-unique-id/-/short-unique-id-5.2.0.tgz#a7e0668e0a8998d3151f27a36cf046055b1f270b"
+  integrity sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==
+
+side-channel@^1.0.4, side-channel@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
   integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
@@ -15879,16 +15392,16 @@ sift@^6.0.0:
   resolved "https://registry.yarnpkg.com/sift/-/sift-6.0.0.tgz#f93a778e5cbf05a5024ebc391e6b32511a6d1f82"
   integrity sha512-VyF5Xeb3WI4aJGfklJzJwX7JycW3sYJXBmZTaBGjfE8b7YmJ87PrisjU422QNuDObNW707Oq9Y/l+18k6z5u4w==
 
-sigmund@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
-  integrity sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==
-
-signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+signal-exit@^3.0.0, signal-exit@^3.0.2:
   version "3.0.7"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
 
+signal-exit@^4.0.1:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+  integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
 sisteransi@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@@ -15909,6 +15422,11 @@ slash@^3.0.0:
   resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
+slashes@^3.0.12:
+  version "3.0.12"
+  resolved "https://registry.yarnpkg.com/slashes/-/slashes-3.0.12.tgz#3d664c877ad542dc1509eaf2c50f38d483a6435a"
+  integrity sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==
+
 slice-ansi@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
@@ -15933,9 +15451,9 @@ slick@^1.12.2:
   integrity sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==
 
 slugify@^1.3.4:
-  version "1.6.5"
-  resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.5.tgz#c8f5c072bf2135b80703589b39a3d41451fbe8c8"
-  integrity sha512-8mo9bslnBO3tr5PEVFzMPIWwWnipGS0xVbYf65zxDqfNwmzYn1LpiKNrR6DlClusuvo+hDHd1zKpmfAe83NQSQ==
+  version "1.6.6"
+  resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b"
+  integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==
 
 snapdragon-node@^2.0.1:
   version "2.1.1"
@@ -15993,9 +15511,9 @@ source-list-map@^2.0.0:
   integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
 
 "source-map-js@>=0.6.2 <2.0.0":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
-  integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+  integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
 
 source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
   version "0.5.3"
@@ -16042,17 +15560,17 @@ spark-md5@3.0.0:
   integrity sha512-BpPFB0Oh83mi+6DRcFwxPx96f3OL8Tkq3hdvaHuXaQUsy5F3saI3zIPNQ/UsTQgyAXIHnML1waeCe1WoCPXbpQ==
 
 spdx-correct@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
-  integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+  integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
   dependencies:
     spdx-expression-parse "^3.0.0"
     spdx-license-ids "^3.0.0"
 
 spdx-exceptions@^2.1.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
-  integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+  integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
 
 spdx-expression-parse@^3.0.0:
   version "3.0.1"
@@ -16071,9 +15589,9 @@ spdx-expression-parse@^4.0.0:
     spdx-license-ids "^3.0.0"
 
 spdx-license-ids@^3.0.0:
-  version "3.0.11"
-  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
-  integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+  version "3.0.20"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89"
+  integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==
 
 spdy-transport@^3.0.0:
   version "3.0.0"
@@ -16132,9 +15650,9 @@ ssf@~0.11.2:
     frac "~1.1.2"
 
 sshpk@^1.7.0:
-  version "1.17.0"
-  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
-  integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
+  version "1.18.0"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
+  integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==
   dependencies:
     asn1 "~0.2.3"
     assert-plus "^1.0.0"
@@ -16185,9 +15703,9 @@ stack-utils@^1.0.1:
     escape-string-regexp "^2.0.0"
 
 stack-utils@^2.0.2, stack-utils@^2.0.3:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5"
-  integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+  integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
   dependencies:
     escape-string-regexp "^2.0.0"
 
@@ -16236,7 +15754,7 @@ statuses@2.0.1:
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
   integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
 
-"statuses@>= 1.4.0 < 2":
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2":
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
   integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
@@ -16288,9 +15806,9 @@ stream-http@^2.7.2:
     xtend "^4.0.0"
 
 stream-shift@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
-  integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
+  integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==
 
 strict-uri-encode@^1.0.0:
   version "1.1.0"
@@ -16305,6 +15823,20 @@ string-length@^4.0.1:
     char-regex "^1.0.2"
     strip-ansi "^6.0.0"
 
+string-ts@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/string-ts/-/string-ts-2.2.0.tgz#46573f475f90f9b43c50cd01c9a603c83426bd25"
+  integrity sha512-VTP0LLZo4Jp9Gz5IiDVMS9WyLx/3IeYh0PXUn0NdPqusUFNgkHPWiEdbB9TU2Iv3myUskraD5WtYEdHUrQEIlQ==
+
+"string-width-cjs@npm:string-width@^4.2.0":
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
 string-width@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -16340,114 +15872,77 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.1"
 
-string.prototype.matchall@^4.0.2:
-  version "4.0.7"
-  resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d"
-  integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-    es-abstract "^1.19.1"
-    get-intrinsic "^1.1.1"
-    has-symbols "^1.0.3"
-    internal-slot "^1.0.3"
-    regexp.prototype.flags "^1.4.1"
-    side-channel "^1.0.4"
-
-string.prototype.matchall@^4.0.8:
-  version "4.0.8"
-  resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3"
-  integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
-    get-intrinsic "^1.1.3"
-    has-symbols "^1.0.3"
-    internal-slot "^1.0.3"
-    regexp.prototype.flags "^1.4.3"
-    side-channel "^1.0.4"
-
-string.prototype.trim@^1.2.4:
-  version "1.2.6"
-  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz#824960787db37a9e24711802ed0c1d1c0254f83e"
-  integrity sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.19.5"
-
-string.prototype.trim@^1.2.7:
-  version "1.2.7"
-  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533"
-  integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
-
-string.prototype.trim@^1.2.8:
-  version "1.2.8"
-  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
-  integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+string-width@^5.0.1, string-width@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
+    eastasianwidth "^0.2.0"
+    emoji-regex "^9.2.2"
+    strip-ansi "^7.0.1"
 
-string.prototype.trimend@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0"
-  integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==
+string.prototype.includes@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92"
+  integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.19.5"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.3"
 
-string.prototype.trimend@^1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533"
-  integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==
+string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.2:
+  version "4.0.11"
+  resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a"
+  integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
+    get-intrinsic "^1.2.4"
+    gopd "^1.0.1"
+    has-symbols "^1.0.3"
+    internal-slot "^1.0.7"
+    regexp.prototype.flags "^1.5.2"
+    set-function-name "^2.0.2"
+    side-channel "^1.0.6"
 
-string.prototype.trimend@^1.0.7:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
-  integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+string.prototype.repeat@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a"
+  integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
-string.prototype.trimstart@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef"
-  integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==
+string.prototype.trim@^1.2.4, string.prototype.trim@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+  integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.19.5"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.0"
+    es-object-atoms "^1.0.0"
 
-string.prototype.trimstart@^1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4"
-  integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==
+string.prototype.trimend@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+  integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.4"
-    es-abstract "^1.20.4"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
 
-string.prototype.trimstart@^1.0.7:
-  version "1.0.7"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
-  integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+string.prototype.trimstart@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+  integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
   dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.2.0"
-    es-abstract "^1.22.1"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
 
 string_decoder@^1.0.0, string_decoder@^1.1.1:
   version "1.3.0"
@@ -16473,6 +15968,13 @@ stringify-package@^1.0.1:
   resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
   integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
 
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
 strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -16501,6 +16003,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
   dependencies:
     ansi-regex "^5.0.1"
 
+strip-ansi@^7.0.1:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+  integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+  dependencies:
+    ansi-regex "^6.0.1"
+
 strip-bom@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -16528,11 +16037,6 @@ strip-final-newline@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
   integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
 
-strip-final-newline@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
-  integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
-
 strip-indent@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
@@ -16582,10 +16086,10 @@ stylint@2.0.0:
     user-home "2.0.0"
     yargs "4.7.1"
 
-stylis@4.0.13:
-  version "4.0.13"
-  resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.13.tgz#f5db332e376d13cc84ecfe5dace9a2a51d954c91"
-  integrity sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==
+stylis@4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+  integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
 
 stylus-loader@3.0.2:
   version "3.0.2"
@@ -16644,9 +16148,9 @@ supports-color@^7.0.0, supports-color@^7.1.0:
     has-flag "^4.0.0"
 
 supports-hyperlinks@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
-  integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
+  integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
   dependencies:
     has-flag "^4.0.0"
     supports-color "^7.0.0"
@@ -16736,13 +16240,13 @@ symbol@^0.2.1:
   resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.2.3.tgz#3b9873b8a901e47c6efe21526a3ac372ef28bbc7"
   integrity sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==
 
-synckit@^0.8.5:
-  version "0.8.5"
-  resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3"
-  integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==
+synckit@^0.9.1:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62"
+  integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==
   dependencies:
-    "@pkgr/utils" "^2.3.1"
-    tslib "^2.5.0"
+    "@pkgr/core" "^0.1.0"
+    tslib "^2.6.2"
 
 table@^5.2.3:
   version "5.4.6"
@@ -16755,9 +16259,9 @@ table@^5.2.3:
     string-width "^3.0.0"
 
 table@^6.0.9:
-  version "6.8.0"
-  resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
-  integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
+  version "6.8.2"
+  resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58"
+  integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==
   dependencies:
     ajv "^8.0.1"
     lodash.truncate "^4.4.2"
@@ -16784,13 +16288,13 @@ tar@^4.4.13:
     yallist "^3.1.1"
 
 tar@^6.0.2, tar@^6.1.11:
-  version "6.1.11"
-  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
-  integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
+  integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
   dependencies:
     chownr "^2.0.0"
     fs-minipass "^2.0.0"
-    minipass "^3.0.0"
+    minipass "^5.0.0"
     minizlib "^2.1.1"
     mkdirp "^1.0.3"
     yallist "^4.0.0"
@@ -16804,9 +16308,9 @@ terminal-link@^2.0.0:
     supports-hyperlinks "^2.0.0"
 
 terser-webpack-plugin@^1.4.3:
-  version "1.4.5"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
-  integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==
+  version "1.4.6"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.6.tgz#87fcb6593fd1c977cd09e56143ecd31404600755"
+  integrity sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==
   dependencies:
     cacache "^12.0.2"
     find-cache-dir "^2.1.0"
@@ -16819,9 +16323,9 @@ terser-webpack-plugin@^1.4.3:
     worker-farm "^1.7.0"
 
 terser@^4.1.2:
-  version "4.8.0"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
-  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
+  version "4.8.1"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f"
+  integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
@@ -16917,11 +16421,6 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.2:
   resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
   integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
 
-titleize@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53"
-  integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
-
 tldjs@^2.3.1:
   version "2.3.1"
   resolved "https://registry.yarnpkg.com/tldjs/-/tldjs-2.3.1.tgz#cf09c3eb5d7403a9e214b7d65f3cf9651c0ab039"
@@ -16946,11 +16445,6 @@ to-arraybuffer@^1.0.0:
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
   integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==
 
-to-fast-properties@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
-  integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
-
 to-object-path@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
@@ -16983,15 +16477,20 @@ to-regex@^3.0.1, to-regex@^3.0.2:
     regex-not "^1.0.2"
     safe-regex "^1.1.0"
 
+toidentifier@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+  integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
 toidentifier@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
   integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
 
 token-types@^4.1.1:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.0.tgz#b66bc3d67420c6873222a424eee64a744f4c2f13"
-  integrity sha512-P0rrp4wUpefLncNamWIef62J0v0kQR/GfDVji9WKY7GDCWy5YbVSrKUTam07iWPZQGy0zWNOfstYTykMmPNR7w==
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/token-types/-/token-types-4.2.1.tgz#0f897f03665846982806e138977dbe72d44df753"
+  integrity sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==
   dependencies:
     "@tokenizer/token" "^0.3.0"
     ieee754 "^1.2.1"
@@ -17012,7 +16511,7 @@ toposort@^2.0.2:
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330"
   integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==
 
-tough-cookie@^2.3.1, tough-cookie@^2.3.3, tough-cookie@~2.5.0:
+tough-cookie@^2.3.1, tough-cookie@^2.3.3, tough-cookie@^2.5.0, tough-cookie@~2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
   integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
@@ -17021,13 +16520,14 @@ tough-cookie@^2.3.1, tough-cookie@^2.3.3, tough-cookie@~2.5.0:
     punycode "^2.1.1"
 
 tough-cookie@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
-  integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+  version "4.1.4"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
+  integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
   dependencies:
     psl "^1.1.33"
     punycode "^2.1.1"
-    universalify "^0.1.2"
+    universalify "^0.2.0"
+    url-parse "^1.5.3"
 
 tr46@^2.1.0:
   version "2.1.0"
@@ -17042,9 +16542,13 @@ tr46@~0.0.3:
   integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
 
 traverse@^0.6.6:
-  version "0.6.6"
-  resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
-  integrity sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==
+  version "0.6.10"
+  resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.10.tgz#4c93482381d794dee046882c036f3c4eee481324"
+  integrity sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==
+  dependencies:
+    gopd "^1.0.1"
+    typedarray.prototype.slice "^1.0.3"
+    which-typed-array "^1.1.15"
 
 trim-newlines@^3.0.0:
   version "3.0.1"
@@ -17071,25 +16575,32 @@ tryer@^1.0.1:
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
   integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
 
-ts-api-utils@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331"
-  integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
+ts-api-utils@^1.0.1, ts-api-utils@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c"
+  integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==
+
+ts-declaration-location@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/ts-declaration-location/-/ts-declaration-location-1.0.4.tgz#60c64133202ec5d171fdf0395f70f786f92f14c0"
+  integrity sha512-r4JoxYhKULbZuH81Pjrp9OEG5St7XWk7zXwGkLKhmVcjiBVHTJXV5wK6dEa9JKW5QGSTW6b1lOjxAKp8R1SQhg==
+  dependencies:
+    minimatch "^10.0.0"
+
+ts-pattern@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.yarnpkg.com/ts-pattern/-/ts-pattern-5.5.0.tgz#1f137eb2bd2bc30a030b5583dee022d00fac3415"
+  integrity sha512-jqbIpTsa/KKTJYWgPNsFNbLVpwCgzXfFJ1ukNn4I8hMwyQzHMJnk/BqWzggB0xpkILuKzaO/aMYhS0SkaJyKXg==
 
 tslib@^1.11.1, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
 
-tslib@^2.0.0, tslib@^2.1.0, tslib@^2.2.0:
-  version "2.4.0"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
-  integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
-
-tslib@^2.5.0, tslib@^2.6.0:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
-  integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+tslib@^2.0.0, tslib@^2.1.0, tslib@^2.6.2:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+  integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
 
 tsutils@^3.21.0:
   version "3.21.0"
@@ -17159,7 +16670,7 @@ type-fest@^0.8.1:
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
   integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
 
-type-is@~1.6.18:
+type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
   integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -17167,44 +16678,49 @@ type-is@~1.6.18:
     media-typer "0.3.0"
     mime-types "~2.1.24"
 
-typed-array-buffer@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60"
-  integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==
+typed-array-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+  integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
   dependencies:
-    call-bind "^1.0.2"
-    get-intrinsic "^1.2.1"
-    is-typed-array "^1.1.10"
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-typed-array "^1.1.13"
 
-typed-array-byte-length@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0"
-  integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
+typed-array-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+  integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
   dependencies:
-    call-bind "^1.0.2"
+    call-bind "^1.0.7"
     for-each "^0.3.3"
-    has-proto "^1.0.1"
-    is-typed-array "^1.1.10"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
 
-typed-array-byte-offset@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b"
-  integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
+typed-array-byte-offset@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+  integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
   dependencies:
-    available-typed-arrays "^1.0.5"
-    call-bind "^1.0.2"
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
     for-each "^0.3.3"
-    has-proto "^1.0.1"
-    is-typed-array "^1.1.10"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
 
-typed-array-length@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
-  integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+typed-array-length@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+  integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
   dependencies:
-    call-bind "^1.0.2"
+    call-bind "^1.0.7"
     for-each "^0.3.3"
-    is-typed-array "^1.1.9"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+    possible-typed-array-names "^1.0.0"
 
 typedarray-to-buffer@^3.1.5:
   version "3.1.5"
@@ -17213,25 +16729,32 @@ typedarray-to-buffer@^3.1.5:
   dependencies:
     is-typedarray "^1.0.0"
 
+typedarray.prototype.slice@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.3.tgz#bce2f685d3279f543239e4d595e0d021731d2d1a"
+  integrity sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.0"
+    es-errors "^1.3.0"
+    typed-array-buffer "^1.0.2"
+    typed-array-byte-offset "^1.0.2"
+
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
 
 typescript@^4.3.5, typescript@^4.5.2:
-  version "4.8.4"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6"
-  integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==
-
-typescript@^5.0.0:
-  version "5.0.2"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.2.tgz#891e1a90c5189d8506af64b9ef929fca99ba1ee5"
-  integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==
+  version "4.9.5"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
+  integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
 
-typescript@^5.2.2:
-  version "5.3.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37"
-  integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
+typescript@^5.0.0, typescript@^5.2.2:
+  version "5.6.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b"
+  integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
 
 uglify-js@3.4.x:
   version "3.4.10"
@@ -17242,9 +16765,9 @@ uglify-js@3.4.x:
     source-map "~0.6.1"
 
 uglify-js@^3.1.4, uglify-js@^3.5.1, uglify-js@^3.6.0:
-  version "3.16.1"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.16.1.tgz#0e7ec928b3d0b1e1d952bce634c384fd56377317"
-  integrity sha512-X5BGTIDH8U6IQ1TIRP62YC36k+ULAa1d59BxlWvPUJ1NkW5L3FwcGfEzuVvGmhJFBu0YJ5Ge25tmRISqCmLiRQ==
+  version "3.19.3"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"
+  integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==
 
 uglifyjs-webpack-plugin@^2.2.0:
   version "2.2.0"
@@ -17271,6 +16794,16 @@ unbox-primitive@^1.0.2:
     has-symbols "^1.0.3"
     which-boxed-primitive "^1.0.2"
 
+undici-types@~6.19.8:
+  version "6.19.8"
+  resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+  integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+undici@^6.19.5:
+  version "6.20.1"
+  resolved "https://registry.yarnpkg.com/undici/-/undici-6.20.1.tgz#fbb87b1e2b69d963ff2d5410a40ffb4c9e81b621"
+  integrity sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==
+
 unherit@^1.0.4:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
@@ -17280,9 +16813,9 @@ unherit@^1.0.4:
     xtend "^4.0.0"
 
 unicode-canonical-property-names-ecmascript@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
-  integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2"
+  integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==
 
 unicode-match-property-ecmascript@^2.0.0:
   version "2.0.0"
@@ -17292,15 +16825,15 @@ unicode-match-property-ecmascript@^2.0.0:
     unicode-canonical-property-names-ecmascript "^2.0.0"
     unicode-property-aliases-ecmascript "^2.0.0"
 
-unicode-match-property-value-ecmascript@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
-  integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
+unicode-match-property-value-ecmascript@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71"
+  integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==
 
 unicode-property-aliases-ecmascript@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
-  integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
+  integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
 
 unidecode@0.1.8:
   version "0.1.8"
@@ -17379,11 +16912,16 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.3.0:
   dependencies:
     unist-util-visit-parents "^2.0.0"
 
-universalify@^0.1.0, universalify@^0.1.2:
+universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
   integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
 
+universalify@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+  integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -17402,23 +16940,18 @@ unset-value@^1.0.0:
     has-value "^0.3.1"
     isobject "^3.0.0"
 
-untildify@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
-  integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
-
 upath@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
   integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
 
-update-browserslist-db@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824"
-  integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==
+update-browserslist-db@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+  integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
   dependencies:
-    escalade "^3.1.1"
-    picocolors "^1.0.0"
+    escalade "^3.2.0"
+    picocolors "^1.1.0"
 
 upper-case@^1.1.1:
   version "1.1.3"
@@ -17442,7 +16975,7 @@ url-join@^1.1.0:
   resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
   integrity sha512-zz1wZk4Lb5PTVwZ3HWDmm8XnlPvmOof6/fjdDPA5yBrUcbtV64U6bV832Zf1BtU2WkBBWaUT46wCs+l0HP5nhg==
 
-url-parse@^1.4.3, url-parse@^1.4.7:
+url-parse@^1.4.3, url-parse@^1.4.7, url-parse@^1.5.3:
   version "1.5.10"
   resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
   integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
@@ -17451,9 +16984,9 @@ url-parse@^1.4.3, url-parse@^1.4.7:
     requires-port "^1.0.0"
 
 url-search-params-polyfill@^8.0.0:
-  version "8.1.1"
-  resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-8.1.1.tgz#9e69e4dba300a71ae7ad3cead62c7717fd99329f"
-  integrity sha512-KmkCs6SjE6t4ihrfW9JelAPQIIIFbJweaaSLTh/4AO+c58JlDcb+GbdPt8yr5lRcFg4rPswRFRRhBGpWwh0K/Q==
+  version "8.2.5"
+  resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-8.2.5.tgz#2d31de6a2140c9b9cf6ee036fe0be07dd2644674"
+  integrity sha512-FOEojW4XReTmtZOB7xqSHmJZhrNTmClhBriwLTmle4iA7bwuCo6ldSfbtsFSb8bTf3E0a3XpfonAdaur9vqq8A==
 
 url-slug@2.0.0:
   version "2.0.0"
@@ -17463,24 +16996,24 @@ url-slug@2.0.0:
     unidecode "0.1.8"
 
 url@^0.11.0:
-  version "0.11.0"
-  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
-  integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==
+  version "0.11.4"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c"
+  integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==
   dependencies:
-    punycode "1.3.2"
-    querystring "0.2.0"
+    punycode "^1.4.1"
+    qs "^6.12.3"
 
 use-callback-ref@^1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.0.tgz#772199899b9c9a50526fedc4993fc7fa1f7e32d5"
-  integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693"
+  integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==
   dependencies:
     tslib "^2.0.0"
 
 use-memo-one@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.2.tgz#0c8203a329f76e040047a35a1197defe342fab20"
-  integrity sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99"
+  integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==
 
 use-sidecar@^1.1.2:
   version "1.1.2"
@@ -17491,9 +17024,9 @@ use-sidecar@^1.1.2:
     tslib "^2.0.0"
 
 use-sync-external-store@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
-  integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9"
+  integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==
 
 use@^3.1.0:
   version "3.1.1"
@@ -17508,9 +17041,9 @@ user-home@2.0.0:
     os-homedir "^1.0.0"
 
 utf8-byte-length@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
-  integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e"
+  integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==
 
 util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   version "1.0.2"
@@ -17535,12 +17068,12 @@ util.promisify@~1.0.0:
     has-symbols "^1.0.1"
     object.getownpropertydescriptors "^2.1.0"
 
-util@0.10.3:
-  version "0.10.3"
-  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
-  integrity sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==
+util@^0.10.4:
+  version "0.10.4"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+  integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
   dependencies:
-    inherits "2.0.1"
+    inherits "2.0.3"
 
 util@^0.11.0:
   version "0.11.1"
@@ -17592,9 +17125,9 @@ uuid@^8.3.0, uuid@^8.3.2:
   integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
 
 v8-compile-cache@^2.0.3:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
-  integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128"
+  integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==
 
 v8-to-istanbul@^7.0.0:
   version "7.1.2"
@@ -17688,9 +17221,9 @@ vue-eslint-parser@^5.0.0:
     lodash "^4.17.11"
 
 vue-eslint-parser@^9.1.0:
-  version "9.4.2"
-  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz#02ffcce82042b082292f2d1672514615f0d95b6d"
-  integrity sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==
+  version "9.4.3"
+  resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz#9b04b22c71401f1e8bca9be7c3e3416a4bde76a8"
+  integrity sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==
   dependencies:
     debug "^4.3.4"
     eslint-scope "^7.1.1"
@@ -17772,14 +17305,14 @@ wcwidth@^1.0.0:
   dependencies:
     defaults "^1.0.3"
 
-web-resource-inliner@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-5.0.0.tgz#ac30db8096931f20a7c1b3ade54ff444e2e20f7b"
-  integrity sha512-AIihwH+ZmdHfkJm7BjSXiEClVt4zUFqX4YlFAzjL13wLtDuUneSaFvDBTbdYRecs35SiU7iNKbMnN+++wVfb6A==
+web-resource-inliner@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz#df0822f0a12028805fe80719ed52ab6526886e02"
+  integrity sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==
   dependencies:
     ansi-colors "^4.1.1"
     escape-goat "^3.0.0"
-    htmlparser2 "^4.0.0"
+    htmlparser2 "^5.0.0"
     mime "^2.4.6"
     node-fetch "^2.6.0"
     valid-data-url "^3.0.0"
@@ -17946,11 +17479,23 @@ whatwg-encoding@^1.0.5:
   dependencies:
     iconv-lite "0.4.24"
 
+whatwg-encoding@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+  integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+  dependencies:
+    iconv-lite "0.6.3"
+
 whatwg-mimetype@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
   integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
 
+whatwg-mimetype@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+  integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
 whatwg-url@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
@@ -17985,12 +17530,12 @@ which-boxed-primitive@^1.0.2:
     is-symbol "^1.0.3"
 
 which-builtin-type@^1.1.3:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b"
-  integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3"
+  integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==
   dependencies:
-    function.prototype.name "^1.1.5"
-    has-tostringtag "^1.0.0"
+    function.prototype.name "^1.1.6"
+    has-tostringtag "^1.0.2"
     is-async-function "^2.0.0"
     is-date-object "^1.0.5"
     is-finalizationregistry "^1.0.2"
@@ -17999,10 +17544,10 @@ which-builtin-type@^1.1.3:
     is-weakref "^1.0.2"
     isarray "^2.0.5"
     which-boxed-primitive "^1.0.2"
-    which-collection "^1.0.1"
-    which-typed-array "^1.1.9"
+    which-collection "^1.0.2"
+    which-typed-array "^1.1.15"
 
-which-collection@^1.0.1:
+which-collection@^1.0.1, which-collection@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
   integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
@@ -18013,22 +17558,11 @@ which-collection@^1.0.1:
     is-weakset "^2.0.3"
 
 which-module@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
-  integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
-
-which-typed-array@^1.1.11, which-typed-array@^1.1.13:
-  version "1.1.13"
-  resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
-  integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
-  dependencies:
-    available-typed-arrays "^1.0.5"
-    call-bind "^1.0.4"
-    for-each "^0.3.3"
-    gopd "^1.0.1"
-    has-tostringtag "^1.0.0"
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+  integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
 
-which-typed-array@^1.1.14, which-typed-array@^1.1.9:
+which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15:
   version "1.1.15"
   resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
   integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
@@ -18072,11 +17606,11 @@ winston@2.1.x:
     stack-trace "0.0.x"
 
 winston@2.x:
-  version "2.4.6"
-  resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.6.tgz#da616f332928f70aac482f59b43d62228f29e478"
-  integrity sha512-J5Zu4p0tojLde8mIOyDSsmLmcP8I3Z6wtwpTDHx1+hGcdhxcJaAmG4CFtagkb+NiN1M9Ek4b42pzMWqfc9jm8w==
+  version "2.4.7"
+  resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.7.tgz#5791fe08ea7e90db090f1cb31ef98f32531062f1"
+  integrity sha512-vLB4BqzCKDnnZH9PHGoS2ycawueX4HLqENXQitvFHczhgW2vFpSOn31LZtVr1KU8YTw7DS4tM+cqyovxo8taVg==
   dependencies:
-    async "^3.2.3"
+    async "^2.6.4"
     colors "1.0.x"
     cycle "1.0.x"
     eyes "0.1.x"
@@ -18088,10 +17622,10 @@ wmf@~1.0.1:
   resolved "https://registry.yarnpkg.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
   integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
 
-word-wrap@^1.2.3, word-wrap@~1.2.3:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
-  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+word-wrap@^1.2.5, word-wrap@~1.2.3:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+  integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
 
 word@~0.3.0:
   version "0.3.0"
@@ -18110,6 +17644,15 @@ worker-farm@^1.7.0:
   dependencies:
     errno "~0.1.7"
 
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
 wrap-ansi@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
@@ -18136,6 +17679,15 @@ wrap-ansi@^7.0.0:
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
 
+wrap-ansi@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+  integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+  dependencies:
+    ansi-styles "^6.1.0"
+    string-width "^5.0.1"
+    strip-ansi "^7.0.1"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -18159,16 +17711,16 @@ write@1.0.3:
     mkdirp "^0.5.1"
 
 ws@^6.0.0, ws@^6.2.1:
-  version "6.2.2"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
-  integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
+  version "6.2.3"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.3.tgz#ccc96e4add5fd6fedbc491903075c85c5a11d9ee"
+  integrity sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==
   dependencies:
     async-limiter "~1.0.0"
 
 ws@^7.4.6:
-  version "7.5.8"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a"
-  integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==
+  version "7.5.10"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
+  integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
 
 x-is-string@^0.1.0:
   version "0.1.0"
@@ -18245,7 +17797,7 @@ yallist@^4.0.0:
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
   integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
 
-yaml@^1.10.0, yaml@^1.7.2:
+yaml@^1.10.0:
   version "1.10.2"
   resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
   integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
@@ -18279,6 +17831,11 @@ yargs-parser@^20.2.2, yargs-parser@^20.2.3:
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
   integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
 
+yargs-parser@^21.1.1:
+  version "21.1.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+  integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
 yargs@12.0.5:
   version "12.0.5"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
@@ -18333,7 +17890,7 @@ yargs@^15.4.1:
     y18n "^4.0.0"
     yargs-parser "^18.1.2"
 
-yargs@^16.0.0, yargs@^16.1.0, yargs@^16.2.0:
+yargs@^16.0.0, yargs@^16.2.0:
   version "16.2.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
   integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
@@ -18346,6 +17903,19 @@ yargs@^16.0.0, yargs@^16.1.0, yargs@^16.2.0:
     y18n "^5.0.5"
     yargs-parser "^20.2.2"
 
+yargs@^17.7.2:
+  version "17.7.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+  integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+  dependencies:
+    cliui "^8.0.1"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.3"
+    y18n "^5.0.5"
+    yargs-parser "^21.1.1"
+
 yocto-queue@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"