diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 605f2438a9096b2fe287b3fbaadc201eb7a5d39d..c4721b59f44361cef85cde0cfc037af5810b52ea 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -19,6 +19,6 @@ module.exports = {
   },
   root: true,
   settings: {
-    "svelte3/typescript": require("typescript"),
+    "svelte3/typescript": () => require("typescript"),
   },
 }
diff --git a/.gitignore b/.gitignore
index 594419fe31fa5fa2385854a3fef6b2e117557b93..b4e1c1bc418b50785057cf7b9d35da0b3af0a4a2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,4 @@ node_modules
 /*.env
 !/example.env
 /.svelte-kit
-/build
-/functions
+/package
diff --git a/.prettierignore b/.prettierignore
index d292d21862b5af847149c155e9f6bb9f783b70db..7dde8a0aed1f0aaeeae5e90d104331528e2d9950 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,4 +1,4 @@
-.svelte/**
+.svelte-kit/**
 build/**
 node_modules/**
 static/**
diff --git a/package-lock.json b/package-lock.json
index 9e74a414404a2c92e9ab743e03279c25fbda34e2..1244d1f3ea0af1f8c043230c470829f17893e072 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -35,7 +35,7 @@
         "prettier-plugin-svelte": "^2.2.0",
         "sanitize-filename": "^1.6.3",
         "sockette": "^2.0.6",
-        "svelte": "^3.37.0",
+        "svelte": "^3.39.0",
         "svelte-check": "^2.0.0",
         "svelte-dnd-action": "^0.9.8",
         "svelte-json-tree": "github:eraviart/svelte-json-tree",
@@ -306,15 +306,15 @@
       }
     },
     "node_modules/@sveltejs/kit": {
-      "version": "1.0.0-next.132",
-      "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.132.tgz",
-      "integrity": "sha512-mX3ihuyTQr3302ZpihG3gXfTBcDPODlJ6ZoYu6f7TGo8+1OdpuDdozgi1CKLkrUBHYGnPO4E75XOVKlgJLjBQw==",
+      "version": "1.0.0-next.137",
+      "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.137.tgz",
+      "integrity": "sha512-YdcwaN9zWcbz4jLZS4j9/7fNZIVO8WkXDuwGTiKARhOLIuuJAjCvSuOZ3btJdV/ySpizTWX22u632weVPLECdw==",
       "dev": true,
       "dependencies": {
-        "@sveltejs/vite-plugin-svelte": "^1.0.0-next.12",
+        "@sveltejs/vite-plugin-svelte": "^1.0.0-next.14",
         "cheap-watch": "^1.0.3",
         "sade": "^1.7.4",
-        "vite": "^2.4.1"
+        "vite": "^2.4.3"
       },
       "bin": {
         "svelte-kit": "svelte-kit.js"
@@ -327,25 +327,30 @@
       }
     },
     "node_modules/@sveltejs/vite-plugin-svelte": {
-      "version": "1.0.0-next.13",
-      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.13.tgz",
-      "integrity": "sha512-hzacNmIOR55aE+yQj750R90+BbQERRVGjlu6TQLgy+Aw2bPmRJMLKvS/NmwO+I66DEiWQdFFHR+lxtwH4bbbXw==",
+      "version": "1.0.0-next.14",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.14.tgz",
+      "integrity": "sha512-46IKPtoGcdo6YLyUhvsXyC1Dg3m2HlbgreZqxM/h5DzavgUa75c/WHT5cIxxLppG+gxtct7V08/WNEdpFdmM3Q==",
       "dev": true,
       "dependencies": {
         "@rollup/pluginutils": "^4.1.1",
         "debug": "^4.3.2",
-        "diff-match-patch": "^1.0.5",
         "kleur": "^4.1.4",
         "magic-string": "^0.25.7",
         "require-relative": "^0.8.7",
-        "svelte-hmr": "^0.14.6"
+        "svelte-hmr": "^0.14.7"
       },
       "engines": {
         "node": "^12.20 || ^14.13.1 || >= 16"
       },
       "peerDependencies": {
+        "diff-match-patch": "^1.0.5",
         "svelte": "^3.34.0",
         "vite": "^2.3.7"
+      },
+      "peerDependenciesMeta": {
+        "diff-match-patch": {
+          "optional": true
+        }
       }
     },
     "node_modules/@tailwindcss/forms": {
@@ -391,9 +396,9 @@
       "dev": true
     },
     "node_modules/@types/node": {
-      "version": "16.4.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.0.tgz",
-      "integrity": "sha512-HrJuE7Mlqcjj+00JqMWpZ3tY8w7EUd+S0U3L1+PQSWiXZbOgyQDvi+ogoUxaHApPJq5diKxYBQwA3iIlNcPqOg==",
+      "version": "16.4.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.1.tgz",
+      "integrity": "sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q==",
       "dev": true
     },
     "node_modules/@types/parse-json": {
@@ -954,9 +959,9 @@
       "dev": true
     },
     "node_modules/colord": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/colord/-/colord-2.3.0.tgz",
-      "integrity": "sha512-0NaS8lq6xZ9Zb+cWRwQf6ql1Z/7HMIAMzPrM2pgfAqskGAhUksBcaau6W8sL+6OK0xIujcSo1TJfdctG7K85Qg==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/colord/-/colord-2.4.0.tgz",
+      "integrity": "sha512-2306/NeTDOykDwvFQK0ctnP+9I5KQdqVm+IJAM6MsAr4vvy1llAdJyax4YmZoqTxdJ/lvRBwR8MqyJi/tupBAw==",
       "dev": true
     },
     "node_modules/colorette": {
@@ -1324,12 +1329,6 @@
       "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
       "dev": true
     },
-    "node_modules/diff-match-patch": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
-      "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==",
-      "dev": true
-    },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -1425,9 +1424,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.3.782",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.782.tgz",
-      "integrity": "sha512-6AI2se1NqWA1SBf/tlD6tQD/6ZOt+yAhqmrTlh4XZw4/g0Mt3p6JhTQPZxRPxPZiOg0o7ss1EBP/CpYejfnoIA==",
+      "version": "1.3.785",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.785.tgz",
+      "integrity": "sha512-WmCgAeURsMFiyoJ646eUaJQ7GNfvMRLXo+GamUyKVNEM4MqTAsXyC0f38JEB4N3BtbD0tlAKozGP5E2T9K3YGg==",
       "dev": true
     },
     "node_modules/emoji-regex": {
@@ -3359,9 +3358,9 @@
       "dev": true
     },
     "node_modules/regenerator-runtime": {
-      "version": "0.13.7",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+      "version": "0.13.9",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
       "dev": true
     },
     "node_modules/regexpp": {
@@ -3745,9 +3744,9 @@
       "dev": true
     },
     "node_modules/svelte-hmr": {
-      "version": "0.14.6",
-      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.6.tgz",
-      "integrity": "sha512-0oXQmRiEh3uNjyVQiGmIE7imbKO4dYc1WL6XRXTC0X9XbSacJgj9MOLguqqbZygPsNnlglhlk4eB0pCmM6nQAA==",
+      "version": "0.14.7",
+      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.7.tgz",
+      "integrity": "sha512-pDrzgcWSoMaK6AJkBWkmgIsecW0GChxYZSZieIYfCP0v2oPyx2CYU/zm7TBIcjLVUPP714WxmViE9Thht4etog==",
       "dev": true,
       "peerDependencies": {
         "svelte": ">=3.19.0"
@@ -3884,9 +3883,9 @@
       "dev": true
     },
     "node_modules/tailwindcss": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.5.tgz",
-      "integrity": "sha512-/85aI7qltFUXCF/zRKCm2Z1TYKy74DK3V4DP1gxz++YK0CgV3TlXB9h7ylKAukrc+ILcRPe6+dSQ1lbCj8XSJQ==",
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.7.tgz",
+      "integrity": "sha512-jv35rugP5j8PpzbXnsria7ZAry7Evh0KtQ4MZqNd+PhF+oIKPwJTVwe/rmfRx9cZw3W7iPZyzBmeoAoNwfJ1yg==",
       "dev": true,
       "dependencies": {
         "arg": "^5.0.0",
@@ -4418,30 +4417,29 @@
       }
     },
     "@sveltejs/kit": {
-      "version": "1.0.0-next.132",
-      "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.132.tgz",
-      "integrity": "sha512-mX3ihuyTQr3302ZpihG3gXfTBcDPODlJ6ZoYu6f7TGo8+1OdpuDdozgi1CKLkrUBHYGnPO4E75XOVKlgJLjBQw==",
+      "version": "1.0.0-next.137",
+      "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.137.tgz",
+      "integrity": "sha512-YdcwaN9zWcbz4jLZS4j9/7fNZIVO8WkXDuwGTiKARhOLIuuJAjCvSuOZ3btJdV/ySpizTWX22u632weVPLECdw==",
       "dev": true,
       "requires": {
-        "@sveltejs/vite-plugin-svelte": "^1.0.0-next.12",
+        "@sveltejs/vite-plugin-svelte": "^1.0.0-next.14",
         "cheap-watch": "^1.0.3",
         "sade": "^1.7.4",
-        "vite": "^2.4.1"
+        "vite": "^2.4.3"
       }
     },
     "@sveltejs/vite-plugin-svelte": {
-      "version": "1.0.0-next.13",
-      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.13.tgz",
-      "integrity": "sha512-hzacNmIOR55aE+yQj750R90+BbQERRVGjlu6TQLgy+Aw2bPmRJMLKvS/NmwO+I66DEiWQdFFHR+lxtwH4bbbXw==",
+      "version": "1.0.0-next.14",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.14.tgz",
+      "integrity": "sha512-46IKPtoGcdo6YLyUhvsXyC1Dg3m2HlbgreZqxM/h5DzavgUa75c/WHT5cIxxLppG+gxtct7V08/WNEdpFdmM3Q==",
       "dev": true,
       "requires": {
         "@rollup/pluginutils": "^4.1.1",
         "debug": "^4.3.2",
-        "diff-match-patch": "^1.0.5",
         "kleur": "^4.1.4",
         "magic-string": "^0.25.7",
         "require-relative": "^0.8.7",
-        "svelte-hmr": "^0.14.6"
+        "svelte-hmr": "^0.14.7"
       }
     },
     "@tailwindcss/forms": {
@@ -4481,9 +4479,9 @@
       "dev": true
     },
     "@types/node": {
-      "version": "16.4.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.0.tgz",
-      "integrity": "sha512-HrJuE7Mlqcjj+00JqMWpZ3tY8w7EUd+S0U3L1+PQSWiXZbOgyQDvi+ogoUxaHApPJq5diKxYBQwA3iIlNcPqOg==",
+      "version": "16.4.1",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.1.tgz",
+      "integrity": "sha512-UW7cbLqf/Wu5XH2RKKY1cHwUNLicIDRLMraYKz+HHAerJ0ZffUEk+fMnd8qU2JaS6cAy0r8tsaf7yqHASf/Y0Q==",
       "dev": true
     },
     "@types/parse-json": {
@@ -4877,9 +4875,9 @@
       }
     },
     "colord": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/colord/-/colord-2.3.0.tgz",
-      "integrity": "sha512-0NaS8lq6xZ9Zb+cWRwQf6ql1Z/7HMIAMzPrM2pgfAqskGAhUksBcaau6W8sL+6OK0xIujcSo1TJfdctG7K85Qg==",
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/colord/-/colord-2.4.0.tgz",
+      "integrity": "sha512-2306/NeTDOykDwvFQK0ctnP+9I5KQdqVm+IJAM6MsAr4vvy1llAdJyax4YmZoqTxdJ/lvRBwR8MqyJi/tupBAw==",
       "dev": true
     },
     "colorette": {
@@ -5164,12 +5162,6 @@
       "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
       "dev": true
     },
-    "diff-match-patch": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.5.tgz",
-      "integrity": "sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==",
-      "dev": true
-    },
     "dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5238,9 +5230,9 @@
       "dev": true
     },
     "electron-to-chromium": {
-      "version": "1.3.782",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.782.tgz",
-      "integrity": "sha512-6AI2se1NqWA1SBf/tlD6tQD/6ZOt+yAhqmrTlh4XZw4/g0Mt3p6JhTQPZxRPxPZiOg0o7ss1EBP/CpYejfnoIA==",
+      "version": "1.3.785",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.785.tgz",
+      "integrity": "sha512-WmCgAeURsMFiyoJ646eUaJQ7GNfvMRLXo+GamUyKVNEM4MqTAsXyC0f38JEB4N3BtbD0tlAKozGP5E2T9K3YGg==",
       "dev": true
     },
     "emoji-regex": {
@@ -6647,9 +6639,9 @@
       }
     },
     "regenerator-runtime": {
-      "version": "0.13.7",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+      "version": "0.13.9",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+      "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
       "dev": true
     },
     "regexpp": {
@@ -6927,9 +6919,9 @@
       "dev": true
     },
     "svelte-hmr": {
-      "version": "0.14.6",
-      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.6.tgz",
-      "integrity": "sha512-0oXQmRiEh3uNjyVQiGmIE7imbKO4dYc1WL6XRXTC0X9XbSacJgj9MOLguqqbZygPsNnlglhlk4eB0pCmM6nQAA==",
+      "version": "0.14.7",
+      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.14.7.tgz",
+      "integrity": "sha512-pDrzgcWSoMaK6AJkBWkmgIsecW0GChxYZSZieIYfCP0v2oPyx2CYU/zm7TBIcjLVUPP714WxmViE9Thht4etog==",
       "dev": true,
       "requires": {}
     },
@@ -7000,9 +6992,9 @@
       }
     },
     "tailwindcss": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.5.tgz",
-      "integrity": "sha512-/85aI7qltFUXCF/zRKCm2Z1TYKy74DK3V4DP1gxz++YK0CgV3TlXB9h7ylKAukrc+ILcRPe6+dSQ1lbCj8XSJQ==",
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.7.tgz",
+      "integrity": "sha512-jv35rugP5j8PpzbXnsria7ZAry7Evh0KtQ4MZqNd+PhF+oIKPwJTVwe/rmfRx9cZw3W7iPZyzBmeoAoNwfJ1yg==",
       "dev": true,
       "requires": {
         "arg": "^5.0.0",
diff --git a/package.json b/package.json
index a7e06eaf86e19a560a3b980ea8c43d71267df9d4..a834281698cf0d5c6c6928e4971611424a3c93bf 100644
--- a/package.json
+++ b/package.json
@@ -6,11 +6,9 @@
     "check": "svelte-check --tsconfig ./tsconfig.json",
     "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",
     "dev": "svelte-kit dev",
-    "format": "prettier --write .",
-    "lint": "prettier --check . && eslint--ignore-path .gitignore .",
-    "prettier": "prettier --plugin-search-dir=. --write \"*.cjs\" --write \"src/*.ts\" \"src/**/*.ts\" \"src/**/*.svelte\"",
-    "preview": "svelte-kit preview",
-    "start": "svelte-kit start"
+    "format": "prettier --write --plugin-search-dir=. .",
+    "lint": "prettier --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
+    "preview": "svelte-kit preview"
   },
   "devDependencies": {
     "@auditors/core": "^0.1.7",
@@ -41,7 +39,7 @@
     "prettier-plugin-svelte": "^2.2.0",
     "sanitize-filename": "^1.6.3",
     "sockette": "^2.0.6",
-    "svelte": "^3.37.0",
+    "svelte": "^3.39.0",
     "svelte-check": "^2.0.0",
     "svelte-dnd-action": "^0.9.8",
     "svelte-json-tree": "github:eraviart/svelte-json-tree",
diff --git a/src/app.html b/src/app.html
index c4d7cde65303f85f6dba383d62945e5a03261298..7921122ef85489f3f1e5e2042e61a76d91b89317 100644
--- a/src/app.html
+++ b/src/app.html
@@ -2,7 +2,7 @@
 <html lang="fr">
   <head>
     <meta charset="utf-8" />
-    <link rel="icon" href="/favicon.ico" />
+    <link rel="icon" href="/favicon.png" />
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     %svelte.head%
   </head>
diff --git a/src/global.d.ts b/src/global.d.ts
index c57bce8c6b32f0dd8c723c951f37aa6d1631cc35..357a61643b91e989384c05d8751b418301c8709c 100644
--- a/src/global.d.ts
+++ b/src/global.d.ts
@@ -1,6 +1,4 @@
 /// <reference types="@sveltejs/kit" />
-/// <reference types="svelte" />
-/// <reference types="vite/client" />
 
 // See: https://github.com/isaacHagoel/svelte-dnd-action#typescript
 // Needed until following bug is solved:
diff --git a/src/lib/components/tutorial/StartTutorial.svelte b/src/lib/components/tutorial/StartTutorial.svelte
index a49ca302bd3e4757078193e6f58d5824811987d4..871ce2d0b7542a56a5a3b56ffc2f3009edd23695 100644
--- a/src/lib/components/tutorial/StartTutorial.svelte
+++ b/src/lib/components/tutorial/StartTutorial.svelte
@@ -1,6 +1,3 @@
-<script lang="ts">
-</script>
-
 <div
   class="bg-white border-le-bleu-light border-4 shadow-lg rounded-md my-12 mx-2 xl:mx-10"
 >
diff --git a/src/lib/decompositions.ts b/src/lib/decompositions.ts
index f41442764c283d593e3d8e084ec40777f22182c7..fdd9e6a8964ac73bdf6e8e546389e1c3a67f1fe6 100644
--- a/src/lib/decompositions.ts
+++ b/src/lib/decompositions.ts
@@ -68,9 +68,15 @@ export function decompositionByNameFromCore(
     decomposition.childrenName = decompositionCore.children
     let ancestor: Decomposition | undefined = undefined
     let depth = 0
-    for (const ancestorName of iterDecompositionAncestorsName(decompositionByName, name)) {
+    for (const ancestorName of iterDecompositionAncestorsName(
+      decompositionByName,
+      name,
+    )) {
       if (depth === 0) {
-        const ancestorIndex = ancestor === undefined ? 0 : ancestor.childrenName.indexOf(ancestorName)
+        const ancestorIndex =
+          ancestor === undefined
+            ? 0
+            : ancestor.childrenName.indexOf(ancestorName)
         if (ancestorIndex > 0) {
           depth++
         }
@@ -197,20 +203,22 @@ export function updateDecompositionEvaluations(
   return newDecompositionByName
 }
 
-export function updateVectorIndex(decompositionByName: DecompositionByName, vectorIndex: number
+export function updateVectorIndex(
+  decompositionByName: DecompositionByName,
+  vectorIndex: number,
 ): DecompositionByName {
   let changed = false
   const newDecompositionByName: DecompositionByName = {}
   for (const [name, decomposition] of Object.entries(decompositionByName)) {
     let decompositionChanged = false
     const newDecomposition = { ...decomposition }
-    const { delta, deltaAtVectorIndex, values, valuesAtVectorIndex } = decomposition
+    const { delta, deltaAtVectorIndex, values, valuesAtVectorIndex } =
+      decomposition
     if (vectorIndex < delta.length) {
       const newDeltaAtVectorIndex = delta[vectorIndex]
       if (newDeltaAtVectorIndex != deltaAtVectorIndex) {
         newDecomposition.deltaAtVectorIndex = newDeltaAtVectorIndex
         decompositionChanged = true
-
       }
     }
     if (vectorIndex < values.length) {
@@ -218,10 +226,11 @@ export function updateVectorIndex(decompositionByName: DecompositionByName, vect
       if (newValuesAtVectorIndex != valuesAtVectorIndex) {
         newDecomposition.valuesAtVectorIndex = newValuesAtVectorIndex
         decompositionChanged = true
-
       }
     }
-    newDecompositionByName[name] = decompositionChanged ? newDecomposition : decomposition
+    newDecompositionByName[name] = decompositionChanged
+      ? newDecomposition
+      : decomposition
     if (decompositionChanged) {
       changed = true
     }
diff --git a/src/lib/server/decompositions.ts b/src/lib/server/decompositions.ts
index 8f1e26563c6e5e425567807636821e7630e37e02..1255d075e48b4718692f207f1c52f0cf75527368 100644
--- a/src/lib/server/decompositions.ts
+++ b/src/lib/server/decompositions.ts
@@ -2,11 +2,11 @@ import assert from "assert"
 import fs from "fs-extra"
 
 import type { DecompositionCore } from "$lib/decompositions"
-import { decompositionByNameFromCore, walkDecompositionsCore } from "$lib/decompositions"
-import type {
-  Variable,
-  VariableByName,
-} from "@openfisca/ast"
+import {
+  decompositionByNameFromCore,
+  walkDecompositionsCore,
+} from "$lib/decompositions"
+import type { Variable, VariableByName } from "@openfisca/ast"
 import config from "$lib/server/config"
 import { variableSummaryByName } from "$lib/server/variables"
 import { guessVariableLastReview } from "$lib/variables"
@@ -22,7 +22,11 @@ assert.notStrictEqual(
   undefined,
 )
 
-for (const [variableName, decompositionCore] of walkDecompositionsCore(decompositionCoreByName, rootDecompositionName, false)) {
+for (const [variableName, decompositionCore] of walkDecompositionsCore(
+  decompositionCoreByName,
+  rootDecompositionName,
+  false,
+)) {
   const variable = variableSummaryByName[variableName]
   decompositionCore.label = variable.ux_name ?? variable.label
   const lastReview = guessVariableLastReview(variable)
diff --git a/src/lib/situations.ts b/src/lib/situations.ts
index 10536879b4b530ace8e370857a8ad30dbbabbdcb..a1b9438807a6a346c184393f4343f78c1038036f 100644
--- a/src/lib/situations.ts
+++ b/src/lib/situations.ts
@@ -25,9 +25,9 @@ export interface Population extends PopulationWithoutId {
 export interface PopulationWithoutId {
   name?: string
   [key: string]:
-  | { [instant: string]: boolean | number | string | null } // variable value by instant
-  | string // id & name
-  | string[] // ids of persons (when key is a role and entity is not a person)
+    | { [instant: string]: boolean | number | string | null } // variable value by instant
+    | string // id & name
+    | string[] // ids of persons (when key is a role and entity is not a person)
 }
 
 export interface Situation {
@@ -43,11 +43,11 @@ export function getPopulationReservedKeys(entity: Entity): Set<string> {
     entity.is_person
       ? ["name"]
       : [
-        "name",
-        ...(entity as GroupEntity).roles.map((role) =>
-          getRolePersonsIdKey(role),
-        ),
-      ],
+          "name",
+          ...(entity as GroupEntity).roles.map((role) =>
+            getRolePersonsIdKey(role),
+          ),
+        ],
   )
 }
 
@@ -60,16 +60,23 @@ export function getSituationVariableValue(
 ): number | string {
   const entity = entityByKey[variable.entity]
   const entitySituation = situation[entity.key_plural]
-  return entitySituation?.[populationId]?.[variable.name]?.[
-    year
-  ] ?? variable.default_value
+  return (
+    entitySituation?.[populationId]?.[variable.name]?.[year] ??
+    variable.default_value
+  )
 }
 
-export function indexOfSituationPopulationId(entity: Entity, situation: Situation,
-  populationId: string): number {
+export function indexOfSituationPopulationId(
+  entity: Entity,
+  situation: Situation,
+  populationId: string,
+): number {
   const entitySituation = situation[entity.key_plural]
-  return Object.keys(entitySituation).sort(([populationId1], [populationId2]) => populationId1.localeCompare(populationId2)).indexOf(populationId)
-
+  return Object.keys(entitySituation)
+    .sort(([populationId1], [populationId2]) =>
+      populationId1.localeCompare(populationId2),
+    )
+    .indexOf(populationId)
 }
 
 export function* iterSituationVariablesName(
diff --git a/src/lib/variables.ts b/src/lib/variables.ts
index e3be8f9b7cb9a8f01016ce0e9c5c51b2f3918099..b8734400137914bee1a7c195a6ab21ea42570a62 100644
--- a/src/lib/variables.ts
+++ b/src/lib/variables.ts
@@ -2,14 +2,18 @@ import type { Variable } from "@openfisca/ast"
 
 export type VariableValues = boolean[] | number[] | string[]
 
-export function guessVariableLastReview(variable: Variable): string | undefined {
+export function guessVariableLastReview(
+  variable: Variable,
+): string | undefined {
   if (variable.last_review !== undefined) {
     return variable.last_review
   }
   if (variable.formulas === undefined) {
     return undefined
   }
-  const last_date = Object.keys(variable.formulas).sort((date1, date2) => date2.localeCompare(date1),)[0]
+  const last_date = Object.keys(variable.formulas).sort((date1, date2) =>
+    date2.localeCompare(date1),
+  )[0]
   return last_date === "0001-01-01" ? undefined : last_date
 }
 
@@ -26,7 +30,8 @@ export async function retrieveVariableSummaryByName(
   const res = await fetch(new URL(url, baseUrl).toString())
   if (!res.ok) {
     console.error(
-      `Error ${res.status
+      `Error ${
+        res.status
       } while retrieving variables at ${url}\n\n${await res.text()}`,
     )
     return undefined
diff --git a/src/routes/simulation.svelte b/src/routes/simulation.svelte
index 5db0409bfab0cd138f50731b921fd4be0bf9f3f9..c1f075e9a5cc969c13b130b62e997bb713389d11 100644
--- a/src/routes/simulation.svelte
+++ b/src/routes/simulation.svelte
@@ -15,6 +15,7 @@
   import TestCaseEdit from "$lib/components/test_cases/TestCaseEdit.svelte"
   import TestCasesPane from "$lib/components/test_cases/TestCasesPane.svelte"
   import VariableReferredInputsPane from "$lib/components/variables/VariableReferredInputsPane.svelte"
+  import StartTutorial from "$lib/components/tutorial/StartTutorial.svelte"
   import VariableReferredParametersPane from "$lib/components/variables/VariableReferredParametersPane.svelte"
   import type { DecompositionByName } from "$lib/decompositions"
   import {
@@ -30,7 +31,6 @@
   } from "$lib/situations"
   import { getPopulationReservedKeys } from "$lib/situations"
   import type { SelfTargetAProps } from "$lib/urls"
-  import StartTutorial from "$lib/components/tutorial/StartTutorial.svelte"
 
   type EditionMode =
     | {
diff --git a/static/favicon.ico b/static/favicon.ico
deleted file mode 100644
index d75d248ef0b15096a95054643a4d97f5d9b60846..0000000000000000000000000000000000000000
Binary files a/static/favicon.ico and /dev/null differ
diff --git a/static/favicon.png b/static/favicon.png
new file mode 100644
index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097
Binary files /dev/null and b/static/favicon.png differ
diff --git a/svelte.config.js b/svelte.config.js
index 85eeb2bba537b5b63d0bccbc2065911075e5ed8c..5593b2f7bf883956d7368893dd46340319748322 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -1,5 +1,5 @@
 import node from "@sveltejs/adapter-node"
-import sveltePreprocess from "svelte-preprocess"
+import preprocess from "svelte-preprocess"
 
 /** @type {import('@sveltejs/kit').Config} */
 const config = {
@@ -16,10 +16,7 @@ const config = {
   // Consult https://github.com/sveltejs/svelte-preprocess
   // for more information about preprocessors
   preprocess: [
-    sveltePreprocess({
-      defaults: {
-        style: "postcss",
-      },
+    preprocess({
       postcss: true,
     }),
   ],
diff --git a/tsconfig.json b/tsconfig.json
index 1d2637b85a90aeb19c9d230ae202bec8d2ff7218..1d26442f0843996403dd1b174f078017a0dfad41 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -2,7 +2,10 @@
   "compilerOptions": {
     "moduleResolution": "node",
     "module": "es2020",
-    "lib": ["es2020"],
+    "lib": [
+      "es2020",
+      "DOM"
+    ],
     "target": "es2019",
     /**
       svelte-preprocess cannot figure out whether you have a value or a type, so tell TypeScript
@@ -23,8 +26,18 @@
     "allowJs": true,
     "checkJs": true,
     "paths": {
-      "$lib/*": ["src/lib/*"]
+      "$lib": [
+        "src/lib"
+      ],
+      "$lib/*": [
+        "src/lib/*"
+      ]
     }
   },
-  "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.ts", "src/**/*.svelte"]
-}
+  "include": [
+    "src/**/*.d.ts",
+    "src/**/*.js",
+    "src/**/*.ts",
+    "src/**/*.svelte"
+  ]
+}
\ No newline at end of file