diff --git a/ExerciseChecker/.env.vault b/ExerciseChecker/.env.vault
index 2303c6a03102e88789ca87a6ac638fde4d4138f9..586a52eebe627a6a2bfbeb3343ccd928cba1599b 100644
--- a/ExerciseChecker/.env.vault
+++ b/ExerciseChecker/.env.vault
@@ -4,8 +4,8 @@
 #/--------------------------------------------------/
 
 # development
-DOTENV_VAULT_DEVELOPMENT="1IL1le/MSmLP5ikyD+SN+O1/lxN+d3xvFqrAKxAd9Kil5QJwZ6QBHB2PshSK4velr89Es2J05xYjjrxm5bCavNiHK6ZEPn0lgvQBRkEuZB+xm728lYE684Uij98v10K5ZyOGW6jlXzbfytnexit4QZOFILTpJEZzyXZYP+PjW1fa5ecs++Pml76UTsIuyw7lFvJ6x0oeMljbaUIZGys5MLQPz8NepwmZNKu8qG5ld6jZJ47rvSvjxJQkUPwmHkxPcuxztetdkIBOYdXvbhR3FKpxQlAosdq1YaznQooZdj1PCSBmLE/217M+l4yCUPfj3fVMWIzlcLuDdwjfq5G3E82LIBi5L7zPFaQZE4DkaKZRO5utpF6DliGSueRV/+Rf/sJGjCbAyxvSaofkn3EZwbSMqfDW5kDpQzFfdPOoCUNYu3tTqrTNeTY7lgurIjidaqHkZQS1rau8cU+6J3C0GB34amREQx5crrf/obeEfkBtpZKTZG7+a5u5ZGcp+roiIqAFhOMtbh/aqpqmLcGdTtRRmHoOCV+YLb6q1YZiJNA/JIqGTrQncj4KeRIsgnhENFQa0MQ8U7ROrKICalSY0Vg4B/EMALFadi2oXA57+FVWO1DnjErYKFrmfVBW2+obYovrB95oE4QhTHTu/HTW1r7YNZUAAtLGMguqfbAjrhL7jVbduKeo7BRGJmxHsv4UVMeUoiRgKpd5Ig/t9y7+feSaKC1KeDeBgBD6IpfM9hl9LcyI/SEKML0O5oZORXvc8L7vBBB+ylFfS/LfehCzdLbcqSVog1YgVQAPg7wD+8m/91BgEqy7aCdDT4K+U9kDx8hECDTohcooBH3NVz2F5QT9mxOvlZ+ImG3VANcH3sm4CcGvHHPapervtvNjBApr6F4xW7KHiCUr65X5yQ1ilHg7Bkf2+MthCaQHG0Jo5Fwb3nk3Sp0SUmB/YZn/0ruOQ8cKTHkSAb8y+MXCFpC4L/0gBYsEPWgvAi5S2FvOeVZiIYMvxHYxulqRrErl2euLVrGCHoFdxEQdJ92AlyEYztYQG/dR2oRRYlhw/tRCPpZZzfGvAaI7FgmKIppkzt8="
+DOTENV_VAULT_DEVELOPMENT="Au1M8CnhJUGXCLf5E8mKtiOMbDsfBjJv0XOQqHUHooo2R+EaGhcAtrQb6SbgC8DNZE0yTbQob7QpapvLENGyXlrfrM6MPHAeVMJbV9w0EmAvvaKPK3Ri5EOENVPT+IF7L34T+5Tzd5VNMSaVntIYKt7rjyOVMbmr72mtUnyw1ZFCiKPSRUiYlEIfuxgvUZ2hB0GVh0XnUv+yXUAO8GLbbg45xGWYQUu+7SBEmnC9xOVuW0jTgluroTqu8GqWwK3Kiq87h13WPCVewVxWPtPIphdOxCxF8ockXvJ4oDgnMjiCKOYihxj1e25r83kLPpwCguOQr4/PFFKF20AfdNSa9cAZjMrWe5BIgpDCGOC9/q08OzGQfwR+KOQF1+aHWhjwvlA1+M4wuCH5ZSN8jOSsaPrMcEMeF/nHpU/3sGnGxcMo2zAjcPXwgbFqFEuAZyNz1rOJPMyv335p4ZXkpBsnkUy8BQ3sZDnybx+dZETvOYH2/17aNGGGN+eS9A+VWGegqeD1JRYdP6d+hWDWuEgSWDpmcHF4PW9R8xQxZZavhj+nposY+Evcmp1/qnYeERbavVyXh2L49fJfZzy/0rZzcgrMvrN3yOaKtjf5kmvZmHUNi4Y9WcebZXokcAHYrPPvWNq5yXtZVvVAxvLpLTi1DMcT7FqnAVYaqg4DxwIZ6Ny2kEssloi/bvNp0CidCcCovMh4HTjrRWp7IUv4YA9FekCQuf5dk+MZYf9n57Q6AOsI0YllzG5S/FfklhPkhOP7Twqy0LHcBHMjW79gpC1q2ZxM+iHIJVsZZ0LMduNvjLvNWe1c77lIH4eKDsD5Ocz+vECDcl7FFhSYEDHmN2rAJzL72+2IehPGVuHo/AMpyk9VCFk4viVgZNv+Bj15JC6/ioMPTZUCAQ1TD37am70gwVHCfLqfPK+W81MbXOCtuX8U/OStjSOGs9Y+0MF/My2v3XhZLer3Z4OTHAxFBd0B4tT4CxixYuNuD1QBxB4FjTUrbKbsZskMFd+75T9aGCaLsDfWzKrgWgElp6IrXLg4uvg16rIWMOL13YE+3NYYucEE1ZdPW+ZbAr1h8SCdZTXHEdgRQACEyqCiyJs2Xpy01hU59hMto+M8sA935xhAePOPDZ7jD4BqWOtQFP2+evXmsvvlf0lU7ANUT7QIYJKKwGA4rSpP7A=="
 
 # production
-DOTENV_VAULT_PRODUCTION="AkhlY5isBoAxVj632ISmuP6gPrB1u1DfsPUIw64HlEl1pr7xSsdQlyemBukr0XlKoE+IKBFy6hfVgqWvxe48BlCzMx41xVjfp5NoZGTXsJGgqlPa3NJDdWTTgSn68Q11TVagGOCQjQnRVjAV6NQFdwP1aKJ8/lg77cPlKrlWRphzAG0hHWWFecxOVs6DoMZPtHW6mabBiyC8MlBRhd4vqV84H1nbYlkSPzEcd9VRhZGLoA3uTHXKnXDoMeNKSK5Z9PxL/PmM/3duXKi/3NNvksLdAJlKGF9Q1sLQpWVDKtjoaKf5GumanxBXMdp5Gt5s0tf1TNAKkj9l6+HYN8jBkhVEh/OiHzMMhvMDDo+ZwhL6U8z0aTK+W8Y8KmGQ0BYp0uEtFSaxa95zJ18YBbs8FPLlUAvBlOlt5F7Z8tSkaSCcC3PNMRsnnzbwJquIh5AyS5scDqsvkdKmfSWb+LLdaY6TLa4conh5iFKkxe5GQ9JmaTGPBHzvhxJRJkUTZcpM5yPCizjFsa51E+FQqk+heI1Y0oAlL69xw+DOyNhAYU/rZJDkGyi7X9JZjgvpNROi1M1h72fO5/uz47mvlxzzg45w4nwk3k3R7azXzzdWsznPcEXu74LAfXC4+SRZuLEOtBbzHRLgM2WIo+CTOuqZGMPSqWhUWFmeCUL+9oON3K93IuvBB+ImtMKxqZIUevzlvv+yaKHod9PjOnpQ1FjKmgM9HZPsrcF/Y6Em98ckVaBpNJztfdVjsihVZGrpr2xlO9RmaQ=="
+DOTENV_VAULT_PRODUCTION="UYGmmTiLq+yxMucNPc82nYxyvSfH9PMEVF91hN7qcR4KqaJtKIiiUXOwln+sEYf67Ga/8qSdLg67r5oka07sG0DWVMuWZjUq3RCPscFDZkILxcfg2C29o4gKcg6Kp4xDsFHA25I1Gu/6TZML6V5kk59a31TUDY3mA4AjvFANVh7bm90hWkKpa57YcIO6guH2RsDeuAYQEQt0m3o4zT1/QA7+f844Z7szCNa0vQ/U3h7mL16nqLDYzokWE6euIU9BYFMNL+H54odF8wGOnESMq032FYRbsN4nfeA2CvNclkIQnz3zn1zVGTQLNE/kDqTJOvrDA6tc6InM5ow1EoD6/8Do/Z/knB6Y0fo9BDDrsD0NTWFT0u/ukoURG8Eja9kw011S+bQiT3K3L+lpVL6Sy2Z4vK7qicg90BoejAdb9xvQ80zqqe7+jolczJeD+QeGSg1u2l7G0RAbuMiNKS4Rt3imTm3jYcYsE+YEUcDIciHuTtb9a4agZve4JsaQgu5+miLZWsNkPlCcD24L2d8M8rrxphjhsnFgRVqKXX77ec8d/SNt6NpS3DHgmEn3YQBdu1lkijLCVFXLJf0PlFSIRhaoSh/UBr+zcrfWURsZeFpOg5/Ssah2aocZzHJaddHrcWO6iXCEozsiLWeAZf0sxh9qDkcopaQQv7BeTdHMyGBwyDqWv1lbmNzOfXXRQojJRrGt+0QU4oGVGqLXHxoW9ruhmHTry+Vnr5jOjUchaIhrLOEg8GFPJ5PLSugoNpZ24IRrjA=="
 
diff --git a/ExerciseChecker/.idea/jetbrainsConfiguration b/ExerciseChecker/.idea/jetbrainsConfiguration
index 4d703a2dd39ec0c2b71bbbbda8900588c4e360bd..ffc5d65f9f0f0e825688177425e526131aa84631 160000
--- a/ExerciseChecker/.idea/jetbrainsConfiguration
+++ b/ExerciseChecker/.idea/jetbrainsConfiguration
@@ -1 +1 @@
-Subproject commit 4d703a2dd39ec0c2b71bbbbda8900588c4e360bd
+Subproject commit ffc5d65f9f0f0e825688177425e526131aa84631
diff --git a/ExerciseChecker/src/app.ts b/ExerciseChecker/src/app.ts
index 63eef070ae3635dcf2c0245dd9e39337469df870..79e07d2e8e23ef4900d9a228f8a5e31767d8d66c 100644
--- a/ExerciseChecker/src/app.ts
+++ b/ExerciseChecker/src/app.ts
@@ -1,21 +1,24 @@
 // Read from the .env file
-// ATTENTION : This lines MUST be the first of this file (except for the path import)
-const path = require('node:path');
-const myEnv = require('dotenv').config({
-                                           path      : path.join(__dirname, '../.env'),
-                                           DOTENV_KEY: 'dotenv://:key_bebfddf18e3dd9a0bafafe0e383313f75add1da6fbe41ea5fde51f37ef1776aa@dotenv.local/vault/.env.vault?environment=development'
-                                       });
-require('dotenv-expand').expand(myEnv);
+// ATTENTION : These lines MUST be the first of this file (except for the path import)
+import path = require('node:path');
+import myEnv = require('dotenv');
+import dotenvExpand = require('dotenv-expand');
+
+
+dotenvExpand.expand(myEnv.config({
+                                     path      : path.join(__dirname, '../.env'),
+                                     DOTENV_KEY: 'dotenv://:key_bebfddf18e3dd9a0bafafe0e383313f75add1da6fbe41ea5fde51f37ef1776aa@dotenv.local/vault/.env.vault?environment=development'
+                                 }));
+
 require('./shared/helpers/TypeScriptExtensions'); // ATTENTION : This line MUST be the second of this file
 
+
 import ClientsSharedConfig                  from './sharedByClients/config/ClientsSharedConfig';
 import Styles                               from './types/Style';
 import Icon                                 from './sharedByClients/types/Icon';
 import RecursiveFilesStats                  from './shared/helpers/recursiveFilesStats/RecursiveFilesStats';
 import Toolbox                              from './shared/helpers/Toolbox';
 import ExerciseCheckerError                 from './shared/types/Dojo/ExerciseCheckerError';
-import { exec }                             from 'child_process';
-import util                                 from 'util';
 import fs                                   from 'fs-extra';
 import HttpManager                          from './managers/HttpManager';
 import DojoBackendManager                   from './managers/DojoBackendManager';
@@ -28,8 +31,6 @@ import ClientsSharedExerciseHelper          from './sharedByClients/helpers/Dojo
 
 
 (async () => {
-    const execAsync = util.promisify(exec);
-
     HttpManager.registerAxiosInterceptor();
 
     console.log(Styles.APP_NAME(`${ Config.appName } (version {{VERSION}})`));
@@ -94,13 +95,13 @@ import ClientsSharedExerciseHelper          from './sharedByClients/helpers/Dojo
                     }
                 });
 
-                exerciseDockerCompose.events.on('finished', (success: boolean, exitCode: number) => {
+                exerciseDockerCompose.events.on('finished', (success: boolean) => {
                     success ? resolve() : reject();
                 });
 
                 exerciseDockerCompose.run();
             });
-        } catch ( error ) { }
+        } catch ( error ) { /* empty */ }
 
         fs.rmSync(composeOverridePath, { force: true });
         fs.writeFileSync(path.join(Config.folders.resultsDojo, 'dockerComposeLogs.txt'), exerciseDockerCompose.allLogs);
@@ -138,7 +139,7 @@ import ClientsSharedExerciseHelper          from './sharedByClients/helpers/Dojo
 
                 exerciseResultsValidation.run();
             });
-        } catch ( error ) { }
+        } catch ( error ) { /* empty */ }
     }
 
 
@@ -146,9 +147,9 @@ import ClientsSharedExerciseHelper          from './sharedByClients/helpers/Dojo
     {
         try {
             console.log(Styles.INFO(`${ Icon.INFO } Uploading results to the dojo server`));
-            const commit: any = {};
+            const commit: Record<string, string> = {};
             Toolbox.getKeysWithPrefix(process.env, 'CI_COMMIT_').forEach(key => {
-                commit[Toolbox.snakeToCamel(key.replace('CI_COMMIT_', ''))] = process.env[key];
+                commit[Toolbox.snakeToCamel(key.replace('CI_COMMIT_', ''))] = process.env[key] as string;
             });
 
             const files = await RecursiveFilesStats.explore(Config.folders.resultsVolume, {
diff --git a/ExerciseChecker/src/managers/DojoBackendManager.ts b/ExerciseChecker/src/managers/DojoBackendManager.ts
index 0799a3c8fe09cc874939d93818f345fe3779e1fb..102069ead041b6877029dad772edb7fb81a45211 100644
--- a/ExerciseChecker/src/managers/DojoBackendManager.ts
+++ b/ExerciseChecker/src/managers/DojoBackendManager.ts
@@ -5,6 +5,7 @@ import ExerciseAssignment  from '../sharedByClients/models/ExerciseAssignment';
 import Config              from '../config/Config';
 import ExerciseResultsFile from '../shared/types/Dojo/ExerciseResultsFile';
 import ApiRoute            from '../sharedByClients/types/Dojo/ApiRoute';
+import { IFileDirStat }    from '../shared/helpers/recursiveFilesStats/RecursiveFilesStats';
 
 
 class DojoBackendManager {
@@ -20,18 +21,14 @@ class DojoBackendManager {
         }
     }
 
-    public async sendResults(exitCode: number, commit: any, results: ExerciseResultsFile, files: any, archiveBase64: string): Promise<void> {
-        try {
-            await axios.post(this.getApiUrl(ApiRoute.EXERCISE_RESULTS).replace('{{id}}', Config.exercise.id), {
-                exitCode     : exitCode,
-                commit       : JSON.stringify(commit),
-                results      : JSON.stringify(results),
-                files        : JSON.stringify(files),
-                archiveBase64: archiveBase64
-            });
-        } catch ( error ) {
-            throw error;
-        }
+    public async sendResults(exitCode: number, commit: Record<string, string>, results: ExerciseResultsFile, files: Array<IFileDirStat>, archiveBase64: string): Promise<void> {
+        await axios.post(this.getApiUrl(ApiRoute.EXERCISE_RESULTS).replace('{{id}}', Config.exercise.id), {
+            exitCode     : exitCode,
+            commit       : JSON.stringify(commit),
+            results      : JSON.stringify(results),
+            files        : JSON.stringify(files),
+            archiveBase64: archiveBase64
+        });
     }
 }
 
diff --git a/ExerciseChecker/src/managers/HttpManager.ts b/ExerciseChecker/src/managers/HttpManager.ts
index 54d6990ad2c31f3a0307a56b13f305b0285ee0db..342f08b2ba5ee0cea251fbf926d2dc54d4e36958 100644
--- a/ExerciseChecker/src/managers/HttpManager.ts
+++ b/ExerciseChecker/src/managers/HttpManager.ts
@@ -59,7 +59,7 @@ class HttpManager {
         }, (error) => {
             if ( error.response ) {
                 if ( error.response.status === StatusCodes.METHOD_NOT_ALLOWED && error.response.data ) {
-                    const data: DojoBackendResponse<{}> = error.response.data;
+                    const data: DojoBackendResponse<void> = error.response.data;
 
                     switch ( data.code ) {
                         case DojoStatusCode.CLIENT_NOT_SUPPORTED:
diff --git a/ExerciseChecker/src/shared b/ExerciseChecker/src/shared
index 4a5eb68209ae9204b6d4cc8020bd62cf6a5be989..101cc26895eb0b5fe97e03bb96039e0cddd94391 160000
--- a/ExerciseChecker/src/shared
+++ b/ExerciseChecker/src/shared
@@ -1 +1 @@
-Subproject commit 4a5eb68209ae9204b6d4cc8020bd62cf6a5be989
+Subproject commit 101cc26895eb0b5fe97e03bb96039e0cddd94391