Index: frontend/node_modules/webpack/hot/dev-server.js
===================================================================
--- frontend/node_modules/webpack/hot/dev-server.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/dev-server.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,90 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+/* globals __webpack_hash__ */
+if (module.hot) {
+	/** @type {undefined|string} */
+	var lastHash;
+	var upToDate = function upToDate() {
+		return /** @type {string} */ (lastHash).indexOf(__webpack_hash__) >= 0;
+	};
+	var log = require("./log");
+	var check = function check() {
+		module.hot
+			.check(true)
+			.then(function (updatedModules) {
+				if (!updatedModules) {
+					log(
+						"warning",
+						"[HMR] Cannot find update. " +
+							(typeof window !== "undefined"
+								? "Need to do a full reload!"
+								: "Please reload manually!")
+					);
+					log(
+						"warning",
+						"[HMR] (Probably because of restarting the webpack-dev-server)"
+					);
+					if (typeof window !== "undefined") {
+						window.location.reload();
+					}
+					return;
+				}
+
+				if (!upToDate()) {
+					check();
+				}
+
+				require("./log-apply-result")(updatedModules, updatedModules);
+
+				if (upToDate()) {
+					log("info", "[HMR] App is up to date.");
+				}
+			})
+			.catch(function (err) {
+				var status = module.hot.status();
+				if (["abort", "fail"].indexOf(status) >= 0) {
+					log(
+						"warning",
+						"[HMR] Cannot apply update. " +
+							(typeof window !== "undefined"
+								? "Need to do a full reload!"
+								: "Please reload manually!")
+					);
+					log("warning", "[HMR] " + log.formatError(err));
+					if (typeof window !== "undefined") {
+						window.location.reload();
+					}
+				} else {
+					log("warning", "[HMR] Update failed: " + log.formatError(err));
+				}
+			});
+	};
+	/** @type {EventTarget | NodeJS.EventEmitter} */
+	var hotEmitter = require("./emitter");
+	/**
+	 * @param {CustomEvent<{ currentHash: string }>} event event or hash
+	 */
+	var handler = function (event) {
+		lastHash = typeof event === "string" ? event : event.detail.currentHash;
+		if (!upToDate() && module.hot.status() === "idle") {
+			log("info", "[HMR] Checking for updates on the server...");
+			check();
+		}
+	};
+
+	if (typeof EventTarget !== "undefined" && hotEmitter instanceof EventTarget) {
+		hotEmitter.addEventListener(
+			"webpackHotUpdate",
+			/** @type {EventListener} */
+			(handler)
+		);
+	} else {
+		hotEmitter.on("webpackHotUpdate", handler);
+	}
+
+	log("info", "[HMR] Waiting for update signal from WDS...");
+} else {
+	throw new Error("[HMR] Hot Module Replacement is disabled.");
+}
Index: frontend/node_modules/webpack/hot/emitter-event-target.js
===================================================================
--- frontend/node_modules/webpack/hot/emitter-event-target.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/emitter-event-target.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+if (typeof EventTarget !== "function") {
+	throw new Error(
+		"Environment doesn't support lazy compilation (requires EventTarget)"
+	);
+}
+
+module.exports = new EventTarget();
Index: frontend/node_modules/webpack/hot/emitter.js
===================================================================
--- frontend/node_modules/webpack/hot/emitter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/emitter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+var EventEmitter = require("events");
+module.exports = new EventEmitter();
Index: frontend/node_modules/webpack/hot/lazy-compilation-node.js
===================================================================
--- frontend/node_modules/webpack/hot/lazy-compilation-node.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/lazy-compilation-node.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,66 @@
+"use strict";
+
+/* global __resourceQuery */
+
+var urlBase = decodeURIComponent(__resourceQuery.slice(1));
+
+/**
+ * @param {{ data: string, onError: (err: Error) => void, active: boolean, module: module }} options options
+ * @returns {() => void} function to destroy response
+ */
+exports.keepAlive = function (options) {
+	var data = options.data;
+
+	/**
+	 * @param {Error} err error
+	 */
+	function errorHandler(err) {
+		err.message =
+			"Problem communicating active modules to the server: " + err.message;
+		options.onError(err);
+	}
+
+	/** @type {Promise<import("http") | import("https")>} */
+	var mod = require("./load-http")(urlBase.startsWith("https"));
+
+	/** @type {import("http").ClientRequest} */
+	var request;
+	/** @type {import("http").IncomingMessage} */
+	var response;
+
+	mod.then(function (client) {
+		request = client.request(
+			urlBase + data,
+			{
+				agent: false,
+				headers: { accept: "text/event-stream" }
+			},
+			function (res) {
+				response = res;
+				response.on("error", errorHandler);
+
+				if (!options.active && !options.module.hot) {
+					console.log(
+						"Hot Module Replacement is not enabled. Waiting for process restart..."
+					);
+				}
+			}
+		);
+
+		request.on("error", errorHandler);
+		request.end();
+	});
+
+	return function () {
+		if (response) {
+			response.destroy();
+		}
+	};
+};
+
+/**
+ * @param {string} value new url value
+ */
+exports.setUrl = function (value) {
+	urlBase = value;
+};
Index: frontend/node_modules/webpack/hot/lazy-compilation-universal.js
===================================================================
--- frontend/node_modules/webpack/hot/lazy-compilation-universal.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/lazy-compilation-universal.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+"use strict";
+
+/* global __resourceQuery */
+
+var isNodeLikeEnv =
+	typeof global !== "undefined" && typeof global.process !== "undefined";
+
+var handler = isNodeLikeEnv
+	? require("./lazy-compilation-node")
+	: require("./lazy-compilation-web");
+
+handler.setUrl(decodeURIComponent(__resourceQuery.slice(1)));
+
+/**
+ * @param {{ data: string, onError: (err: Error) => void, active: boolean, module: module }} options options
+ * @returns {() => void} function to destroy response
+ */
+module.exports = handler;
Index: frontend/node_modules/webpack/hot/lazy-compilation-web.js
===================================================================
--- frontend/node_modules/webpack/hot/lazy-compilation-web.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/lazy-compilation-web.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,93 @@
+"use strict";
+
+/* global __resourceQuery */
+
+if (typeof EventSource !== "function") {
+	throw new Error(
+		"Environment doesn't support lazy compilation (requires EventSource)"
+	);
+}
+
+var urlBase = decodeURIComponent(__resourceQuery.slice(1));
+/** @type {EventSource | undefined} */
+var activeEventSource;
+var activeKeys = new Map();
+var errorHandlers = new Set();
+
+var updateEventSource = function updateEventSource() {
+	if (activeEventSource) activeEventSource.close();
+	if (activeKeys.size) {
+		activeEventSource = new EventSource(
+			urlBase + Array.from(activeKeys.keys()).join("@")
+		);
+		/**
+		 * @this {EventSource}
+		 * @param {Event & { message?: string, filename?: string, lineno?: number, colno?: number, error?: Error }} event event
+		 */
+		activeEventSource.onerror = function (event) {
+			errorHandlers.forEach(function (onError) {
+				onError(
+					new Error(
+						"Problem communicating active modules to the server: " +
+							event.message +
+							" " +
+							event.filename +
+							":" +
+							event.lineno +
+							":" +
+							event.colno +
+							" " +
+							event.error
+					)
+				);
+			});
+		};
+	} else {
+		activeEventSource = undefined;
+	}
+};
+
+/**
+ * @param {{ data: string, onError: (err: Error) => void, active: boolean, module: module }} options options
+ * @returns {() => void} function to destroy response
+ */
+exports.keepAlive = function (options) {
+	var data = options.data;
+	var onError = options.onError;
+
+	errorHandlers.add(onError);
+
+	var value = activeKeys.get(data) || 0;
+
+	activeKeys.set(data, value + 1);
+
+	if (value === 0) {
+		updateEventSource();
+	}
+
+	if (!options.active && !options.module.hot) {
+		console.log(
+			"Hot Module Replacement is not enabled. Waiting for process restart..."
+		);
+	}
+
+	return function () {
+		errorHandlers.delete(onError);
+		setTimeout(function () {
+			var value = activeKeys.get(data);
+			if (value === 1) {
+				activeKeys.delete(data);
+				updateEventSource();
+			} else {
+				activeKeys.set(data, value - 1);
+			}
+		}, 1000);
+	};
+};
+
+/**
+ * @param {string} value new url value
+ */
+exports.setUrl = function (value) {
+	urlBase = value;
+};
Index: frontend/node_modules/webpack/hot/load-http.js
===================================================================
--- frontend/node_modules/webpack/hot/load-http.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/load-http.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+/**
+ * @param {boolean} isHTTPS true when need https module, otherwise false
+ * @returns {Promise<import("http") | import("https")>}
+ */
+module.exports = function (isHTTPS) {
+	return isHTTPS ? import("https") : import("http");
+};
Index: frontend/node_modules/webpack/hot/log-apply-result.js
===================================================================
--- frontend/node_modules/webpack/hot/log-apply-result.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/log-apply-result.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,49 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+/**
+ * @param {(string | number)[]} updatedModules updated modules
+ * @param {(string | number)[] | null} renewedModules renewed modules
+ */
+module.exports = function (updatedModules, renewedModules) {
+	var unacceptedModules = updatedModules.filter(function (moduleId) {
+		return renewedModules && renewedModules.indexOf(moduleId) < 0;
+	});
+	var log = require("./log");
+
+	if (unacceptedModules.length > 0) {
+		log(
+			"warning",
+			"[HMR] The following modules couldn't be hot updated: (They would need a full reload!)"
+		);
+		unacceptedModules.forEach(function (moduleId) {
+			log("warning", "[HMR]  - " + moduleId);
+		});
+	}
+
+	if (!renewedModules || renewedModules.length === 0) {
+		log("info", "[HMR] Nothing hot updated.");
+	} else {
+		log("info", "[HMR] Updated modules:");
+		renewedModules.forEach(function (moduleId) {
+			if (typeof moduleId === "string" && moduleId.indexOf("!") !== -1) {
+				var parts = moduleId.split("!");
+				log.groupCollapsed("info", "[HMR]  - " + parts.pop());
+				log("info", "[HMR]  - " + moduleId);
+				log.groupEnd("info");
+			} else {
+				log("info", "[HMR]  - " + moduleId);
+			}
+		});
+		var numberIds = renewedModules.every(function (moduleId) {
+			return typeof moduleId === "number";
+		});
+		if (numberIds)
+			log(
+				"info",
+				'[HMR] Consider using the optimization.moduleIds: "named" for module names.'
+			);
+	}
+};
Index: frontend/node_modules/webpack/hot/log.js
===================================================================
--- frontend/node_modules/webpack/hot/log.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/log.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,78 @@
+/** @typedef {"info" | "warning" | "error"} LogLevel */
+
+/** @type {LogLevel} */
+var logLevel = "info";
+
+function dummy() {}
+
+/**
+ * @param {LogLevel} level log level
+ * @returns {boolean} true, if should log
+ */
+function shouldLog(level) {
+	var shouldLog =
+		(logLevel === "info" && level === "info") ||
+		(["info", "warning"].indexOf(logLevel) >= 0 && level === "warning") ||
+		(["info", "warning", "error"].indexOf(logLevel) >= 0 && level === "error");
+	return shouldLog;
+}
+
+/**
+ * @param {(msg?: string) => void} logFn log function
+ * @returns {(level: LogLevel, msg?: string) => void} function that logs when log level is sufficient
+ */
+function logGroup(logFn) {
+	return function (level, msg) {
+		if (shouldLog(level)) {
+			logFn(msg);
+		}
+	};
+}
+
+/**
+ * @param {LogLevel} level log level
+ * @param {string|Error} msg message
+ */
+module.exports = function (level, msg) {
+	if (shouldLog(level)) {
+		if (level === "info") {
+			console.log(msg);
+		} else if (level === "warning") {
+			console.warn(msg);
+		} else if (level === "error") {
+			console.error(msg);
+		}
+	}
+};
+
+/**
+ * @param {Error} err error
+ * @returns {string} formatted error
+ */
+module.exports.formatError = function (err) {
+	var message = err.message;
+	var stack = err.stack;
+	if (!stack) {
+		return message;
+	} else if (stack.indexOf(message) < 0) {
+		return message + "\n" + stack;
+	}
+	return stack;
+};
+
+var group = console.group || dummy;
+var groupCollapsed = console.groupCollapsed || dummy;
+var groupEnd = console.groupEnd || dummy;
+
+module.exports.group = logGroup(group);
+
+module.exports.groupCollapsed = logGroup(groupCollapsed);
+
+module.exports.groupEnd = logGroup(groupEnd);
+
+/**
+ * @param {LogLevel} level log level
+ */
+module.exports.setLogLevel = function (level) {
+	logLevel = level;
+};
Index: frontend/node_modules/webpack/hot/only-dev-server.js
===================================================================
--- frontend/node_modules/webpack/hot/only-dev-server.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/only-dev-server.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,118 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+/* globals __webpack_hash__ */
+if (module.hot) {
+	/** @type {undefined | string} */
+	var lastHash;
+	var upToDate = function upToDate() {
+		return /** @type {string} */ (lastHash).indexOf(__webpack_hash__) >= 0;
+	};
+	var log = require("./log");
+	var check = function check() {
+		module.hot
+			.check()
+			.then(function (updatedModules) {
+				if (!updatedModules) {
+					log("warning", "[HMR] Cannot find update. Need to do a full reload!");
+					log(
+						"warning",
+						"[HMR] (Probably because of restarting the webpack-dev-server)"
+					);
+					return;
+				}
+
+				return module.hot
+					.apply({
+						ignoreUnaccepted: true,
+						ignoreDeclined: true,
+						ignoreErrored: true,
+						onUnaccepted: function (data) {
+							log(
+								"warning",
+								"Ignored an update to unaccepted module " +
+									data.chain.join(" -> ")
+							);
+						},
+						onDeclined: function (data) {
+							log(
+								"warning",
+								"Ignored an update to declined module " +
+									data.chain.join(" -> ")
+							);
+						},
+						onErrored: function (data) {
+							log("error", data.error);
+							log(
+								"warning",
+								"Ignored an error while updating module " +
+									data.moduleId +
+									" (" +
+									data.type +
+									")"
+							);
+						}
+					})
+					.then(function (renewedModules) {
+						if (!upToDate()) {
+							check();
+						}
+
+						require("./log-apply-result")(updatedModules, renewedModules);
+
+						if (upToDate()) {
+							log("info", "[HMR] App is up to date.");
+						}
+					});
+			})
+			.catch(function (err) {
+				var status = module.hot.status();
+				if (["abort", "fail"].indexOf(status) >= 0) {
+					log(
+						"warning",
+						"[HMR] Cannot check for update. Need to do a full reload!"
+					);
+					log("warning", "[HMR] " + log.formatError(err));
+				} else {
+					log("warning", "[HMR] Update check failed: " + log.formatError(err));
+				}
+			});
+	};
+	/** @type {EventTarget | NodeJS.EventEmitter} */
+	var hotEmitter = require("./emitter");
+	/**
+	 * @param {CustomEvent<{ currentHash: string }>} event event or hash
+	 */
+	var handler = function (event) {
+		lastHash = typeof event === "string" ? event : event.detail.currentHash;
+		if (!upToDate()) {
+			var status = module.hot.status();
+			if (status === "idle") {
+				log("info", "[HMR] Checking for updates on the server...");
+				check();
+			} else if (["abort", "fail"].indexOf(status) >= 0) {
+				log(
+					"warning",
+					"[HMR] Cannot apply update as a previous update " +
+						status +
+						"ed. Need to do a full reload!"
+				);
+			}
+		}
+	};
+
+	if (typeof EventTarget !== "undefined" && hotEmitter instanceof EventTarget) {
+		hotEmitter.addEventListener(
+			"webpackHotUpdate",
+			/** @type {EventListener} */
+			(handler)
+		);
+	} else {
+		hotEmitter.on("webpackHotUpdate", handler);
+	}
+
+	log("info", "[HMR] Waiting for update signal from WDS...");
+} else {
+	throw new Error("[HMR] Hot Module Replacement is disabled.");
+}
Index: frontend/node_modules/webpack/hot/poll.js
===================================================================
--- frontend/node_modules/webpack/hot/poll.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/poll.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,41 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+/* globals __resourceQuery */
+if (module.hot) {
+	// eslint-disable-next-line no-implicit-coercion
+	var hotPollInterval = +__resourceQuery.slice(1) || 10 * 60 * 1000;
+	var log = require("./log");
+
+	/**
+	 * @param {boolean=} fromUpdate true when called from update
+	 */
+	var checkForUpdate = function checkForUpdate(fromUpdate) {
+		if (module.hot.status() === "idle") {
+			module.hot
+				.check(true)
+				.then(function (updatedModules) {
+					if (!updatedModules) {
+						if (fromUpdate) log("info", "[HMR] Update applied.");
+						return;
+					}
+					require("./log-apply-result")(updatedModules, updatedModules);
+					checkForUpdate(true);
+				})
+				.catch(function (err) {
+					var status = module.hot.status();
+					if (["abort", "fail"].indexOf(status) >= 0) {
+						log("warning", "[HMR] Cannot apply update.");
+						log("warning", "[HMR] " + log.formatError(err));
+						log("warning", "[HMR] You need to restart the application!");
+					} else {
+						log("warning", "[HMR] Update failed: " + log.formatError(err));
+					}
+				});
+		}
+	};
+	setInterval(checkForUpdate, hotPollInterval);
+} else {
+	throw new Error("[HMR] Hot Module Replacement is disabled.");
+}
Index: frontend/node_modules/webpack/hot/signal.js
===================================================================
--- frontend/node_modules/webpack/hot/signal.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/webpack/hot/signal.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,66 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+/* globals __resourceQuery */
+if (module.hot) {
+	var log = require("./log");
+
+	/**
+	 * @param {boolean=} fromUpdate true when called from update
+	 */
+	var checkForUpdate = function checkForUpdate(fromUpdate) {
+		module.hot
+			.check()
+			.then(function (updatedModules) {
+				if (!updatedModules) {
+					if (fromUpdate) log("info", "[HMR] Update applied.");
+					else log("warning", "[HMR] Cannot find update.");
+					return;
+				}
+
+				return module.hot
+					.apply({
+						ignoreUnaccepted: true,
+						onUnaccepted: function (data) {
+							log(
+								"warning",
+								"Ignored an update to unaccepted module " +
+									data.chain.join(" -> ")
+							);
+						}
+					})
+					.then(function (renewedModules) {
+						require("./log-apply-result")(updatedModules, renewedModules);
+
+						checkForUpdate(true);
+						return null;
+					});
+			})
+			.catch(function (err) {
+				var status = module.hot.status();
+				if (["abort", "fail"].indexOf(status) >= 0) {
+					log("warning", "[HMR] Cannot apply update.");
+					log("warning", "[HMR] " + log.formatError(err));
+					log("warning", "[HMR] You need to restart the application!");
+				} else {
+					log("warning", "[HMR] Update failed: " + (err.stack || err.message));
+				}
+			});
+	};
+
+	process.on(__resourceQuery.slice(1) || "SIGUSR2", function () {
+		if (module.hot.status() !== "idle") {
+			log(
+				"warning",
+				"[HMR] Got signal but currently in " + module.hot.status() + " state."
+			);
+			log("warning", "[HMR] Need to be in idle state to start hot update.");
+			return;
+		}
+
+		checkForUpdate();
+	});
+} else {
+	throw new Error("[HMR] Hot Module Replacement is disabled.");
+}
