Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/babel/babel-loader.d.ts
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/babel/babel-loader.d.ts	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/babel/babel-loader.d.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -8,7 +8,5 @@
 
 declare module 'babel-loader' {
-  type BabelLoaderCustomizer<T> = (
-    babel: typeof import('@babel/core'),
-  ) => {
+  type BabelLoaderCustomizer<T> = (babel: typeof import('@babel/core')) => {
     customOptions?(
       this: import('webpack').loader.LoaderContext,
@@ -21,4 +19,15 @@
       loaderArguments: { source: string; map?: unknown; customOptions: T },
     ): import('@babel/core').TransformOptions;
+    result?(
+      this: import('webpack').loader.LoaderContext,
+      result: import('@babel/core').BabelFileResult,
+      context: {
+        source: string;
+        map?: unknown;
+        customOptions: T;
+        configuration: import('@babel/core').PartialConfig;
+        options: import('@babel/core').TransformOptions;
+      },
+    ): import('@babel/core').BabelFileResult;
   };
   function custom<T>(customizer: BabelLoaderCustomizer<T>): import('webpack').loader.Loader;
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/babel/webpack-loader.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -7,5 +7,9 @@
  * found in the LICENSE file at https://angular.io/license
  */
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
 Object.defineProperty(exports, "__esModule", { value: true });
+const remapping_1 = __importDefault(require("@ampproject/remapping"));
 const linker_1 = require("@angular/compiler-cli/linker");
 const babel_loader_1 = require("babel-loader");
@@ -119,8 +123,8 @@
             return {
                 ...configuration.options,
-                // Workaround for https://github.com/babel/babel-loader/pull/896 is available
-                // Delete once the above PR is released
+                // Using `false` disables babel from attempting to locate sourcemaps or process any inline maps.
+                // The babel types do not include the false option even though it is valid
                 // eslint-disable-next-line @typescript-eslint/no-explicit-any
-                inputSourceMap: configuration.options.inputSourceMap || false,
+                inputSourceMap: false,
                 plugins,
                 presets: [
@@ -147,4 +151,21 @@
             };
         },
+        result(result, { map: inputSourceMap }) {
+            if (result.map && inputSourceMap) {
+                // Merge the intermediate sourcemap generated by babel with the input source map.
+                // The casting is required due to slight differences in the types for babel and
+                // `@ampproject/remapping` source map objects but both are compatible with Webpack.
+                // This method for merging is used because it provides more accurate output
+                // and is faster while using less memory.
+                result.map = {
+                    // Convert the SourceMap back to simple plain object.
+                    // This is needed because otherwise code-coverage will fail with `don't know how to turn this value into a node`
+                    // Which is throw by Babel when it is invoked again from `istanbul-lib-instrument`.
+                    // https://github.com/babel/babel/blob/780aa48d2a34dc55f556843074b6aed45e7eabeb/packages/babel-types/src/converters/valueToNode.ts#L115-L130
+                    ...remapping_1.default([result.map, inputSourceMap], () => null),
+                };
+            }
+            return result;
+        },
     };
 });
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/browser/index.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/browser/index.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/browser/index.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -132,5 +132,5 @@
         // eslint-disable-next-line max-lines-per-function
         operators_1.concatMap(async (buildEvent) => {
-            var _a, _b, _c, _d, _e, _f, _g, _h;
+            var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
             const spinner = new spinner_1.Spinner();
             spinner.enabled = options.progress !== false;
@@ -242,5 +242,5 @@
                             try {
                                 map = fs.readFileSync(filename + '.map', 'utf8');
-                                if (es5Polyfills) {
+                                if (es5Polyfills || i18n.shouldInline) {
                                     fs.unlinkSync(filename + '.map');
                                 }
@@ -251,4 +251,9 @@
                             fs.unlinkSync(filename);
                             filename = filename.replace(/\-es20\d{2}/, '');
+                        }
+                        else if (i18n.shouldInline) {
+                            // Original files must be deleted with i18n to avoid the original files from
+                            // being copied over the translated files when copying the project assets.
+                            fs.unlinkSync(filename);
                         }
                         const es2015Polyfills = file.file.startsWith('polyfills-es20');
@@ -266,4 +271,6 @@
                             ignoreOriginal: es5Polyfills,
                             optimizeOnly: es2015Polyfills,
+                            // When using i18n, file results are kept in memory for further processing
+                            memoryMode: i18n.shouldInline,
                         });
                         // ES2015 polyfills are only optimized; optimization check was performed above
@@ -280,4 +287,7 @@
                     let processRuntimeAction;
                     for (const action of actions) {
+                        if (options.verbose) {
+                            context.logger.info(`[${new Date().toISOString()}] Differential loading file queued: ${action.filename}`);
+                        }
                         // If SRI is enabled always process the runtime bundle
                         // Lazy route integrity values are stored in the runtime bundle
@@ -289,107 +299,122 @@
                         }
                     }
-                    const executor = new action_executor_1.BundleActionExecutor({ cachePath: cacheDownlevelPath, i18n }, options.subresourceIntegrity ? 'sha384' : undefined);
+                    const differentialLoadingExecutor = new action_executor_1.BundleActionExecutor({ cachePath: cacheDownlevelPath, i18n }, options.subresourceIntegrity ? 'sha384' : undefined);
                     // Execute the bundle processing actions
                     try {
                         spinner.start('Generating ES5 bundles for differential loading...');
-                        for await (const result of executor.processAll(processActions)) {
+                        for await (const result of differentialLoadingExecutor.processAll(processActions)) {
+                            if (options.verbose) {
+                                if (result.original) {
+                                    context.logger.info(`[${new Date().toISOString()}] Differential loading file processed: ${result.original.filename}`);
+                                }
+                                if (result.downlevel) {
+                                    context.logger.info(`[${new Date().toISOString()}] Differential loading file processed: ${result.downlevel.filename}`);
+                                }
+                            }
                             processResults.push(result);
                         }
-                        // Runtime must be processed after all other files
-                        if (processRuntimeAction) {
-                            const runtimeOptions = {
-                                ...processRuntimeAction,
-                                runtimeData: processResults,
-                                supportedBrowsers: buildBrowserFeatures.supportedBrowsers,
-                            };
-                            processResults.push(await Promise.resolve().then(() => __importStar(require('../utils/process-bundle'))).then((m) => m.process(runtimeOptions)));
-                        }
-                        spinner.succeed('ES5 bundle generation complete.');
-                        if (i18n.shouldInline) {
-                            spinner.start('Generating localized bundles...');
-                            const inlineActions = [];
-                            const processedFiles = new Set();
-                            for (const result of processResults) {
-                                if (result.original) {
-                                    inlineActions.push({
-                                        filename: path.basename(result.original.filename),
-                                        code: fs.readFileSync(result.original.filename, 'utf8'),
-                                        map: result.original.map &&
-                                            fs.readFileSync(result.original.map.filename, 'utf8'),
-                                        outputPath: baseOutputPath,
-                                        es5: false,
-                                        missingTranslation: options.i18nMissingTranslation,
-                                        setLocale: result.name === mainChunkId,
-                                    });
-                                    processedFiles.add(result.original.filename);
-                                    if (result.original.map) {
-                                        processedFiles.add(result.original.map.filename);
+                    }
+                    finally {
+                        differentialLoadingExecutor.stop();
+                    }
+                    // Runtime must be processed after all other files
+                    if (processRuntimeAction) {
+                        const runtimeOptions = {
+                            ...processRuntimeAction,
+                            runtimeData: processResults,
+                            supportedBrowsers: buildBrowserFeatures.supportedBrowsers,
+                        };
+                        processResults.push(await Promise.resolve().then(() => __importStar(require('../utils/process-bundle'))).then((m) => m.process(runtimeOptions)));
+                    }
+                    if (options.verbose) {
+                        context.logger.info(`[${new Date().toISOString()}] Differential loading processing complete.`);
+                    }
+                    spinner.succeed('ES5 bundle generation complete.');
+                    if (i18n.shouldInline) {
+                        spinner.start('Generating localized bundles...');
+                        const inlineActions = [];
+                        for (const result of processResults) {
+                            if (result.original) {
+                                if (options.verbose) {
+                                    context.logger.info(`[${new Date().toISOString()}] i18n localize file queued: ${result.original.filename}`);
+                                }
+                                inlineActions.push({
+                                    filename: path.basename(result.original.filename),
+                                    // Memory mode is always enabled for i18n
+                                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+                                    code: result.original.content,
+                                    map: (_a = result.original.map) === null || _a === void 0 ? void 0 : _a.content,
+                                    outputPath: baseOutputPath,
+                                    es5: false,
+                                    missingTranslation: options.i18nMissingTranslation,
+                                    setLocale: result.name === mainChunkId,
+                                });
+                            }
+                            if (result.downlevel) {
+                                if (options.verbose) {
+                                    context.logger.info(`[${new Date().toISOString()}] i18n localize file queued: ${result.downlevel.filename}`);
+                                }
+                                inlineActions.push({
+                                    filename: path.basename(result.downlevel.filename),
+                                    // Memory mode is always enabled for i18n
+                                    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+                                    code: result.downlevel.content,
+                                    map: (_b = result.downlevel.map) === null || _b === void 0 ? void 0 : _b.content,
+                                    outputPath: baseOutputPath,
+                                    es5: true,
+                                    missingTranslation: options.i18nMissingTranslation,
+                                    setLocale: result.name === mainChunkId,
+                                });
+                            }
+                        }
+                        let hasErrors = false;
+                        const i18nExecutor = new action_executor_1.BundleActionExecutor({ i18n }, options.subresourceIntegrity ? 'sha384' : undefined);
+                        try {
+                            let localizedCount = 0;
+                            for await (const result of i18nExecutor.inlineAll(inlineActions)) {
+                                localizedCount++;
+                                if (options.verbose) {
+                                    context.logger.info(`[${new Date().toISOString()}] (${localizedCount}/${inlineActions.length}) Localized "${result.file}" [${result.count} translation(s)].`);
+                                }
+                                for (const diagnostic of result.diagnostics) {
+                                    spinner.stop();
+                                    if (diagnostic.type === 'error') {
+                                        hasErrors = true;
+                                        context.logger.error(diagnostic.message);
                                     }
-                                }
-                                if (result.downlevel) {
-                                    inlineActions.push({
-                                        filename: path.basename(result.downlevel.filename),
-                                        code: fs.readFileSync(result.downlevel.filename, 'utf8'),
-                                        map: result.downlevel.map &&
-                                            fs.readFileSync(result.downlevel.map.filename, 'utf8'),
-                                        outputPath: baseOutputPath,
-                                        es5: true,
-                                        missingTranslation: options.i18nMissingTranslation,
-                                        setLocale: result.name === mainChunkId,
-                                    });
-                                    processedFiles.add(result.downlevel.filename);
-                                    if (result.downlevel.map) {
-                                        processedFiles.add(result.downlevel.map.filename);
+                                    else {
+                                        context.logger.warn(diagnostic.message);
                                     }
-                                }
-                            }
-                            let hasErrors = false;
-                            try {
-                                for await (const result of executor.inlineAll(inlineActions)) {
-                                    if (options.verbose) {
-                                        context.logger.info(`Localized "${result.file}" [${result.count} translation(s)].`);
-                                    }
-                                    for (const diagnostic of result.diagnostics) {
-                                        spinner.stop();
-                                        if (diagnostic.type === 'error') {
-                                            hasErrors = true;
-                                            context.logger.error(diagnostic.message);
-                                        }
-                                        else {
-                                            context.logger.warn(diagnostic.message);
-                                        }
-                                        spinner.start();
-                                    }
-                                }
-                                // Copy any non-processed files into the output locations
-                                await copy_assets_1.copyAssets([
-                                    {
-                                        glob: '**/*',
-                                        input: webpackOutputPath,
-                                        output: '',
-                                        ignore: [...processedFiles].map((f) => path.relative(webpackOutputPath, f)),
-                                    },
-                                ], Array.from(outputPaths.values()), '');
-                            }
-                            catch (err) {
-                                spinner.fail('Localized bundle generation failed.');
-                                return { success: false, error: mapErrorToMessage(err) };
-                            }
-                            if (hasErrors) {
-                                spinner.fail('Localized bundle generation failed.');
-                            }
-                            else {
-                                spinner.succeed('Localized bundle generation complete.');
-                            }
-                            if (hasErrors) {
-                                return { success: false };
-                            }
-                        }
-                    }
-                    finally {
-                        executor.stop();
+                                    spinner.start();
+                                }
+                            }
+                            // Copy any non-processed files into the output locations
+                            await copy_assets_1.copyAssets([
+                                {
+                                    glob: '**/*',
+                                    input: webpackOutputPath,
+                                    output: '',
+                                },
+                            ], Array.from(outputPaths.values()), '');
+                        }
+                        catch (err) {
+                            spinner.fail('Localized bundle generation failed.');
+                            return { success: false, error: mapErrorToMessage(err) };
+                        }
+                        finally {
+                            i18nExecutor.stop();
+                        }
+                        if (hasErrors) {
+                            spinner.fail('Localized bundle generation failed.');
+                        }
+                        else {
+                            spinner.succeed('Localized bundle generation complete.');
+                        }
+                        if (hasErrors) {
+                            return { success: false };
+                        }
                     }
                     for (const result of processResults) {
-                        const chunk = (_a = webpackStats.chunks) === null || _a === void 0 ? void 0 : _a.find((chunk) => { var _a; return ((_a = chunk.id) === null || _a === void 0 ? void 0 : _a.toString()) === result.name; });
+                        const chunk = (_c = webpackStats.chunks) === null || _c === void 0 ? void 0 : _c.find((chunk) => { var _a; return ((_a = chunk.id) === null || _a === void 0 ? void 0 : _a.toString()) === result.name; });
                         if (result.original) {
                             bundleInfoStats.push(generateBundleInfoStats(result.original, chunk, 'modern'));
@@ -399,7 +424,7 @@
                         }
                     }
-                    const unprocessedChunks = ((_b = webpackStats.chunks) === null || _b === void 0 ? void 0 : _b.filter((chunk) => !processResults.find((result) => { var _a; return ((_a = chunk.id) === null || _a === void 0 ? void 0 : _a.toString()) === result.name; }))) || [];
+                    const unprocessedChunks = ((_d = webpackStats.chunks) === null || _d === void 0 ? void 0 : _d.filter((chunk) => !processResults.find((result) => { var _a; return ((_a = chunk.id) === null || _a === void 0 ? void 0 : _a.toString()) === result.name; }))) || [];
                     for (const chunk of unprocessedChunks) {
-                        const asset = (_c = webpackStats.assets) === null || _c === void 0 ? void 0 : _c.find((a) => { var _a; return a.name === ((_a = chunk.files) === null || _a === void 0 ? void 0 : _a[0]); });
+                        const asset = (_e = webpackStats.assets) === null || _e === void 0 ? void 0 : _e.find((a) => { var _a; return a.name === ((_a = chunk.files) === null || _a === void 0 ? void 0 : _a[0]); });
                         bundleInfoStats.push(stats_1.generateBundleStats({ ...chunk, size: asset === null || asset === void 0 ? void 0 : asset.size }));
                     }
@@ -422,8 +447,8 @@
                         switch (severity) {
                             case bundle_calculator_1.ThresholdSeverity.Warning:
-                                (_d = webpackStats.warnings) === null || _d === void 0 ? void 0 : _d.push({ message });
+                                (_f = webpackStats.warnings) === null || _f === void 0 ? void 0 : _f.push({ message });
                                 break;
                             case bundle_calculator_1.ThresholdSeverity.Error:
-                                (_e = webpackStats.errors) === null || _e === void 0 ? void 0 : _e.push({ message });
+                                (_g = webpackStats.errors) === null || _g === void 0 ? void 0 : _g.push({ message });
                                 break;
                             default:
@@ -435,5 +460,5 @@
                 if (buildSuccess) {
                     // Copy assets
-                    if (!options.watch && ((_f = options.assets) === null || _f === void 0 ? void 0 : _f.length)) {
+                    if (!options.watch && ((_h = options.assets) === null || _h === void 0 ? void 0 : _h.length)) {
                         spinner.start('Copying assets...');
                         try {
@@ -450,6 +475,6 @@
                         const WOFFSupportNeeded = !buildBrowserFeatures.isFeatureSupported('woff2');
                         const entrypoints = package_chunk_sort_1.generateEntryPoints({
-                            scripts: (_g = options.scripts) !== null && _g !== void 0 ? _g : [],
-                            styles: (_h = options.styles) !== null && _h !== void 0 ? _h : [],
+                            scripts: (_j = options.scripts) !== null && _j !== void 0 ? _j : [],
+                            styles: (_k = options.styles) !== null && _k !== void 0 ? _k : [],
                         });
                         const indexHtmlGenerator = new index_html_generator_1.IndexHtmlGenerator({
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/dev-server/index.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/dev-server/index.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/dev-server/index.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -275,4 +275,7 @@
                 logger.info(`\n${color_1.colors.greenBright(color_1.colors.symbols.check)} Compiled successfully.`);
             }
+            else {
+                logger.info(`\n${color_1.colors.redBright(color_1.colors.symbols.cross)} Failed to compile.`);
+            }
             return { ...buildEvent, baseUrl: serverAddress };
         }));
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/action-executor.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/action-executor.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/action-executor.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -63,11 +63,10 @@
         for (const action of actions) {
             const execution = executor(action);
-            executions.set(execution, execution.then((result) => {
-                executions.delete(execution);
-                return result;
-            }));
+            executions.set(execution, execution.then((result) => [execution, result]));
         }
         while (executions.size > 0) {
-            yield Promise.race(executions.values());
+            const [execution, result] = await Promise.race(executions.values());
+            executions.delete(execution);
+            yield result;
         }
     }
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/process-bundle.d.ts
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/process-bundle.d.ts	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/process-bundle.d.ts	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -25,4 +25,5 @@
     replacements?: [string, string][];
     supportedBrowsers?: string[] | Record<string, string>;
+    memoryMode?: boolean;
 }
 export interface ProcessBundleResult {
@@ -36,7 +37,9 @@
     size: number;
     integrity?: string;
+    content?: string;
     map?: {
         filename: string;
         size: number;
+        content?: string;
     };
 }
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/process-bundle.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/process-bundle.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/utils/process-bundle.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -135,5 +135,5 @@
 exports.process = process;
 async function processBundle(options) {
-    const { optimize, isOriginal, code, map, downlevelMap, filename: filepath, hiddenSourceMaps, cacheKeys = [], integrityAlgorithm, } = options;
+    const { optimize, isOriginal, code, map, downlevelMap, filename: filepath, hiddenSourceMaps, cacheKeys = [], integrityAlgorithm, memoryMode, } = options;
     const filename = path.basename(filepath);
     let resultCode = code;
@@ -169,9 +169,13 @@
         }
         await cachePut(mapContent, cacheKeys[isOriginal ? 1 /* OriginalMap */ : 3 /* DownlevelMap */]);
-        fs.writeFileSync(filepath + '.map', mapContent);
-    }
-    const fileResult = createFileEntry(filepath, resultCode, mapContent, integrityAlgorithm);
+        if (!memoryMode) {
+            fs.writeFileSync(filepath + '.map', mapContent);
+        }
+    }
+    const fileResult = createFileEntry(filepath, resultCode, mapContent, memoryMode, integrityAlgorithm);
     await cachePut(resultCode, cacheKeys[isOriginal ? 0 /* OriginalCode */ : 2 /* DownlevelCode */], fileResult.integrity);
-    fs.writeFileSync(filepath, resultCode);
+    if (!memoryMode) {
+        fs.writeFileSync(filepath, resultCode);
+    }
     return fileResult;
 }
@@ -201,9 +205,10 @@
     return { code: minifyOutput.code, map: minifyOutput.map };
 }
-function createFileEntry(filename, code, map, integrityAlgorithm) {
+function createFileEntry(filename, code, map, memoryMode, integrityAlgorithm) {
     return {
         filename: filename,
         size: Buffer.byteLength(code),
         integrity: integrityAlgorithm && generateIntegrityValue(integrityAlgorithm, code),
+        content: memoryMode ? code : undefined,
         map: !map
             ? undefined
@@ -211,4 +216,5 @@
                 filename: filename + '.map',
                 size: Buffer.byteLength(map),
+                content: memoryMode ? map : undefined,
             },
     };
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/webpack/configs/browser.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/webpack/configs/browser.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/webpack/configs/browser.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -38,4 +38,5 @@
         resolve: {
             mainFields: ['es2015', 'browser', 'module', 'main'],
+            conditionNames: ['es2015', '...'],
         },
         output: {
Index: trip-planner-front/node_modules/@angular-devkit/build-angular/src/webpack/configs/test.js
===================================================================
--- trip-planner-front/node_modules/@angular-devkit/build-angular/src/webpack/configs/test.js	(revision 6a3a178323fd905112b5392bd9d3cb83b66ef2d3)
+++ trip-planner-front/node_modules/@angular-devkit/build-angular/src/webpack/configs/test.js	(revision 1ad8e64a349fcc7c996155279b16efc2cfe001dd)
@@ -62,4 +62,5 @@
         resolve: {
             mainFields: ['es2015', 'browser', 'module', 'main'],
+            conditionNames: ['es2015', '...'],
         },
         devtool: false,
