Index: .mvn/wrapper/maven-wrapper.properties
===================================================================
--- .mvn/wrapper/maven-wrapper.properties	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ .mvn/wrapper/maven-wrapper.properties	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+wrapperVersion=3.3.2
+distributionType=only-script
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
Index: ckend/.mvn/wrapper/maven-wrapper.properties
===================================================================
--- backend/.mvn/wrapper/maven-wrapper.properties	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-wrapperVersion=3.3.2
-distributionType=only-script
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
Index: ckend/mvnw
===================================================================
--- backend/mvnw	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,259 +1,0 @@
-#!/bin/sh
-# ----------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# ----------------------------------------------------------------------------
-
-# ----------------------------------------------------------------------------
-# Apache Maven Wrapper startup batch script, version 3.3.2
-#
-# Optional ENV vars
-# -----------------
-#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
-#   MVNW_REPOURL - repo url base for downloading maven distribution
-#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
-#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
-# ----------------------------------------------------------------------------
-
-set -euf
-[ "${MVNW_VERBOSE-}" != debug ] || set -x
-
-# OS specific support.
-native_path() { printf %s\\n "$1"; }
-case "$(uname)" in
-CYGWIN* | MINGW*)
-  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
-  native_path() { cygpath --path --windows "$1"; }
-  ;;
-esac
-
-# set JAVACMD and JAVACCMD
-set_java_home() {
-  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
-  if [ -n "${JAVA_HOME-}" ]; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-      JAVACCMD="$JAVA_HOME/jre/sh/javac"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-      JAVACCMD="$JAVA_HOME/bin/javac"
-
-      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
-        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
-        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
-        return 1
-      fi
-    fi
-  else
-    JAVACMD="$(
-      'set' +e
-      'unset' -f command 2>/dev/null
-      'command' -v java
-    )" || :
-    JAVACCMD="$(
-      'set' +e
-      'unset' -f command 2>/dev/null
-      'command' -v javac
-    )" || :
-
-    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
-      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
-      return 1
-    fi
-  fi
-}
-
-# hash string like Java String::hashCode
-hash_string() {
-  str="${1:-}" h=0
-  while [ -n "$str" ]; do
-    char="${str%"${str#?}"}"
-    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
-    str="${str#?}"
-  done
-  printf %x\\n $h
-}
-
-verbose() { :; }
-[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
-
-die() {
-  printf %s\\n "$1" >&2
-  exit 1
-}
-
-trim() {
-  # MWRAPPER-139:
-  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
-  #   Needed for removing poorly interpreted newline sequences when running in more
-  #   exotic environments such as mingw bash on Windows.
-  printf "%s" "${1}" | tr -d '[:space:]'
-}
-
-# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
-while IFS="=" read -r key value; do
-  case "${key-}" in
-  distributionUrl) distributionUrl=$(trim "${value-}") ;;
-  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
-  esac
-done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
-[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
-
-case "${distributionUrl##*/}" in
-maven-mvnd-*bin.*)
-  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
-  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
-  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
-  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
-  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
-  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
-  *)
-    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
-    distributionPlatform=linux-amd64
-    ;;
-  esac
-  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
-  ;;
-maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
-*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
-esac
-
-# apply MVNW_REPOURL and calculate MAVEN_HOME
-# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
-[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
-distributionUrlName="${distributionUrl##*/}"
-distributionUrlNameMain="${distributionUrlName%.*}"
-distributionUrlNameMain="${distributionUrlNameMain%-bin}"
-MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
-MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
-
-exec_maven() {
-  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
-  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
-}
-
-if [ -d "$MAVEN_HOME" ]; then
-  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
-  exec_maven "$@"
-fi
-
-case "${distributionUrl-}" in
-*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
-*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
-esac
-
-# prepare tmp dir
-if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
-  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
-  trap clean HUP INT TERM EXIT
-else
-  die "cannot create temp dir"
-fi
-
-mkdir -p -- "${MAVEN_HOME%/*}"
-
-# Download and Install Apache Maven
-verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
-verbose "Downloading from: $distributionUrl"
-verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
-
-# select .zip or .tar.gz
-if ! command -v unzip >/dev/null; then
-  distributionUrl="${distributionUrl%.zip}.tar.gz"
-  distributionUrlName="${distributionUrl##*/}"
-fi
-
-# verbose opt
-__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
-[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
-
-# normalize http auth
-case "${MVNW_PASSWORD:+has-password}" in
-'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
-has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
-esac
-
-if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
-  verbose "Found wget ... using wget"
-  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
-elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
-  verbose "Found curl ... using curl"
-  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
-elif set_java_home; then
-  verbose "Falling back to use Java to download"
-  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
-  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
-  cat >"$javaSource" <<-END
-	public class Downloader extends java.net.Authenticator
-	{
-	  protected java.net.PasswordAuthentication getPasswordAuthentication()
-	  {
-	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
-	  }
-	  public static void main( String[] args ) throws Exception
-	  {
-	    setDefault( new Downloader() );
-	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
-	  }
-	}
-	END
-  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
-  verbose " - Compiling Downloader.java ..."
-  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
-  verbose " - Running Downloader.java ..."
-  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
-fi
-
-# If specified, validate the SHA-256 sum of the Maven distribution zip file
-if [ -n "${distributionSha256Sum-}" ]; then
-  distributionSha256Result=false
-  if [ "$MVN_CMD" = mvnd.sh ]; then
-    echo "Checksum validation is not supported for maven-mvnd." >&2
-    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
-    exit 1
-  elif command -v sha256sum >/dev/null; then
-    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
-      distributionSha256Result=true
-    fi
-  elif command -v shasum >/dev/null; then
-    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
-      distributionSha256Result=true
-    fi
-  else
-    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
-    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
-    exit 1
-  fi
-  if [ $distributionSha256Result = false ]; then
-    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
-    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
-    exit 1
-  fi
-fi
-
-# unzip and move
-if command -v unzip >/dev/null; then
-  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
-else
-  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
-fi
-printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
-mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
-
-clean || :
-exec_maven "$@"
Index: ckend/mvnw.cmd
===================================================================
--- backend/mvnw.cmd	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,149 +1,0 @@
-<# : batch portion
-@REM ----------------------------------------------------------------------------
-@REM Licensed to the Apache Software Foundation (ASF) under one
-@REM or more contributor license agreements.  See the NOTICE file
-@REM distributed with this work for additional information
-@REM regarding copyright ownership.  The ASF licenses this file
-@REM to you under the Apache License, Version 2.0 (the
-@REM "License"); you may not use this file except in compliance
-@REM with the License.  You may obtain a copy of the License at
-@REM
-@REM    http://www.apache.org/licenses/LICENSE-2.0
-@REM
-@REM Unless required by applicable law or agreed to in writing,
-@REM software distributed under the License is distributed on an
-@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-@REM KIND, either express or implied.  See the License for the
-@REM specific language governing permissions and limitations
-@REM under the License.
-@REM ----------------------------------------------------------------------------
-
-@REM ----------------------------------------------------------------------------
-@REM Apache Maven Wrapper startup batch script, version 3.3.2
-@REM
-@REM Optional ENV vars
-@REM   MVNW_REPOURL - repo url base for downloading maven distribution
-@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
-@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
-@REM ----------------------------------------------------------------------------
-
-@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
-@SET __MVNW_CMD__=
-@SET __MVNW_ERROR__=
-@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
-@SET PSModulePath=
-@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
-  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
-)
-@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
-@SET __MVNW_PSMODULEP_SAVE=
-@SET __MVNW_ARG0_NAME__=
-@SET MVNW_USERNAME=
-@SET MVNW_PASSWORD=
-@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
-@echo Cannot start maven from wrapper >&2 && exit /b 1
-@GOTO :EOF
-: end batch / begin powershell #>
-
-$ErrorActionPreference = "Stop"
-if ($env:MVNW_VERBOSE -eq "true") {
-  $VerbosePreference = "Continue"
-}
-
-# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
-$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
-if (!$distributionUrl) {
-  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
-}
-
-switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
-  "maven-mvnd-*" {
-    $USE_MVND = $true
-    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
-    $MVN_CMD = "mvnd.cmd"
-    break
-  }
-  default {
-    $USE_MVND = $false
-    $MVN_CMD = $script -replace '^mvnw','mvn'
-    break
-  }
-}
-
-# apply MVNW_REPOURL and calculate MAVEN_HOME
-# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
-if ($env:MVNW_REPOURL) {
-  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
-  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
-}
-$distributionUrlName = $distributionUrl -replace '^.*/',''
-$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
-$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
-if ($env:MAVEN_USER_HOME) {
-  $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
-}
-$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
-$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
-
-if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
-  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
-  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
-  exit $?
-}
-
-if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
-  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
-}
-
-# prepare tmp dir
-$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
-$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
-$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
-trap {
-  if ($TMP_DOWNLOAD_DIR.Exists) {
-    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
-    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
-  }
-}
-
-New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
-
-# Download and Install Apache Maven
-Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
-Write-Verbose "Downloading from: $distributionUrl"
-Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
-
-$webclient = New-Object System.Net.WebClient
-if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
-  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
-}
-[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
-$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
-
-# If specified, validate the SHA-256 sum of the Maven distribution zip file
-$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
-if ($distributionSha256Sum) {
-  if ($USE_MVND) {
-    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
-  }
-  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
-  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
-    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
-  }
-}
-
-# unzip and move
-Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
-Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
-try {
-  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
-} catch {
-  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
-    Write-Error "fail to move MAVEN_HOME"
-  }
-} finally {
-  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
-  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
-}
-
-Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
Index: ckend/pom.xml
===================================================================
--- backend/pom.xml	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,135 +1,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.springframework.boot</groupId>
-        <artifactId>spring-boot-starter-parent</artifactId>
-        <version>3.4.2</version>
-        <relativePath/> <!-- lookup parent from repository -->
-    </parent>
-    <groupId>mk.ukim.finki.db</groupId>
-    <artifactId>DistributorApp</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
-    <name>DistributorApp</name>
-    <description>DistributorApp</description>
-    <url/>
-    <licenses>
-        <license/>
-    </licenses>
-    <developers>
-        <developer/>
-    </developers>
-    <scm>
-        <connection/>
-        <developerConnection/>
-        <tag/>
-        <url/>
-    </scm>
-    <properties>
-        <java.version>17</java.version>
-    </properties>
-    <dependencies>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-web</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-validation</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.postgresql</groupId>
-            <artifactId>postgresql</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>com.h2database</groupId>
-            <artifactId>h2</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.projectlombok</groupId>
-            <artifactId>lombok</artifactId>
-            <optional>true</optional>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-thymeleaf</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.thymeleaf.extras</groupId>
-            <artifactId>thymeleaf-extras-springsecurity6</artifactId>
-            <version>3.1.1.RELEASE</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-data-jpa</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-mail</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-actuator</artifactId>
-        </dependency>
-
-<!--        JWT Dependencies: -->
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt-api</artifactId>
-            <version>0.11.5</version>
-        </dependency>
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt-impl</artifactId>
-            <version>0.11.5</version>
-            <scope>runtime</scope>
-        </dependency>
-        <dependency>
-            <groupId>io.jsonwebtoken</groupId>
-            <artifactId>jjwt-jackson</artifactId>
-            <version>0.11.5</version>
-            <scope>runtime</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-                <configuration>
-                    <excludes>
-                        <exclude>
-                            <groupId>org.projectlombok</groupId>
-                            <artifactId>lombok</artifactId>
-                        </exclude>
-                    </excludes>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/DistributorAppApplication.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/DistributorAppApplication.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package mk.ukim.finki.db.distributorapp;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.web.servlet.ServletComponentScan;
-
-@SpringBootApplication
-@ServletComponentScan
-public class DistributorAppApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(DistributorAppApplication.class, args);
-    }
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-public class EmailAlreadyExistsException extends RuntimeException {
-    public EmailAlreadyExistsException(String email) {
-        super("User with the email " + email + " already exists.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-public class InvalidArgumentsException extends RuntimeException {
-
-    public InvalidArgumentsException() {
-        super("Invalid argument.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-public class InvalidUserCredentialsException extends RuntimeException {
-
-    public InvalidUserCredentialsException() {
-        super("Invalid user credentials");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,4 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-public class InvalidUsernameOrPasswordException extends RuntimeException {
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-public class PasswordsDoNotMatchException extends RuntimeException {
-    public PasswordsDoNotMatchException() {
-        super("The two passwords do not match.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-import org.springframework.http.HttpStatus;
-import org.springframework.web.bind.annotation.ResponseStatus;
-
-@ResponseStatus(HttpStatus.NOT_FOUND)
-public class UserNotFoundException extends RuntimeException {
-
-    public UserNotFoundException(String username) {
-        super(String.format("User with username: %s was not found", username));
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-package mk.ukim.finki.db.distributorapp._exceptions;
-
-public class UsernameAlreadyExistsException extends RuntimeException {
-    public UsernameAlreadyExistsException(String username) {
-        super("User with the username " + username + " already exists.");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.User;
-import mk.ukim.finki.db.distributorapp.users.UserRepository;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-@Service
-@RequiredArgsConstructor
-public class CustomUserDetailsService implements UserDetailsService {
-
-    private final UserRepository userRepository;
-
-    @Override
-    @Transactional
-    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
-        return new User(this.userRepository.findUsersByUserEmailIgnoreCaseDto(email));
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,39 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.stereotype.Component;
-
-@Component
-@RequiredArgsConstructor
-public class CustomUsernamePasswordAuthenticationProvider implements AuthenticationProvider {
-    private final UserService userService;
-    private final CustomUserDetailsService customUserDetailsService;
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String email = authentication.getName();
-        String password = authentication.getCredentials().toString();
-
-        if ("".equals(email) || "".equals(password)) {
-            throw new BadCredentialsException("Invalid email or password");
-        }
-
-        UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(email);
-        String salt = this.userService.findFullUserDtoByEmail(email).getUserSalt();
-        if (!PassEncryption.verifyUserPassword(password, userDetails.getPassword(), salt))
-            throw new BadCredentialsException("Invalid password");
-        return new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
-    }
-
-    @Override
-    public boolean supports(Class<?> aClass) {
-        return aClass.equals(UsernamePasswordAuthenticationToken.class);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-
-@Service("emailService")
-public class EmailService {
-    private final JavaMailSender javaMailSender;
-
-    @Autowired
-    public EmailService(JavaMailSender javaMailSender) {
-        this.javaMailSender = javaMailSender;
-    }
-
-    @Async
-    public void sendEmail(SimpleMailMessage message) {
-        javaMailSender.send(message);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import org.springframework.stereotype.Component;
-
-import javax.crypto.SecretKeyFactory;
-import javax.crypto.spec.PBEKeySpec;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.spec.InvalidKeySpecException;
-import java.util.Arrays;
-import java.util.Base64;
-import java.util.Random;
-
-@Component
-public class PassEncryption {
-    private static final Random random = new SecureRandom();
-    private static final String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-    private static final int iterations = 20000;
-    private static final int keyLength = 256;
-
-    public static String genSaltValue(int length) {
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < length; i++) {
-            sb.append(characters.charAt(random.nextInt(characters.length())));
-        }
-
-        return new String(sb);
-    }
-
-    public static byte[] hash(char[] password, byte[] salt) {
-        PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
-        Arrays.fill(password, Character.MIN_VALUE);
-        try {
-            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
-            return skf.generateSecret(spec).getEncoded();
-        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
-            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
-        } finally {
-            spec.clearPassword();
-        }
-    }
-
-    public static String generateSecurePassword(String password, String salt) {
-        String res;
-        byte[] securePassword = hash(password.toCharArray(), salt.getBytes());
-
-        res = Base64.getEncoder().encodeToString(securePassword);
-        return res;
-    }
-
-    public static boolean verifyUserPassword(String providedPassword, String securedPassword, String salt) {
-        boolean res;
-        String newSecuredPassword = generateSecurePassword(providedPassword, salt);
-        res = newSecuredPassword.equals(securedPassword);
-
-        return res;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Component;
-
-import static mk.ukim.finki.db.distributorapp._security.PassEncryption.generateSecurePassword;
-import static mk.ukim.finki.db.distributorapp._security.PassEncryption.verifyUserPassword;
-
-@Component
-public class PassEncryptionPasswordEncoder implements PasswordEncoder {
-
-    @Override
-    public String encode(CharSequence rawPassword) {
-        throw new UnsupportedOperationException("Salt must be provided explicitly!");
-    }
-
-    public String encodeWithSalt(CharSequence rawPassword, String salt) {
-        return generateSecurePassword(rawPassword.toString(), salt);
-    }
-
-    @Override
-    public boolean matches(CharSequence rawPassword, String encodedPassword) {
-        throw new UnsupportedOperationException("Use matchesWithSalt for explicit salt verification!");
-    }
-
-    public boolean matchesWithSalt(CharSequence rawPassword, String encodedPassword, String salt) {
-        return verifyUserPassword(rawPassword.toString(), encodedPassword, salt);
-    }
-}
-
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,123 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp._security.jwt.JwtAuthenticationFilter;
-import mk.ukim.finki.db.distributorapp._security.jwt.JwtTokenProvider;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.config.Customizer;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.security.provisioning.InMemoryUserDetailsManager;
-import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.CorsConfigurationSource;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-
-import java.util.List;
-
-@Configuration
-@EnableWebSecurity
-@RequiredArgsConstructor
-public class SecurityConfig {
-
-    private final CustomUsernamePasswordAuthenticationProvider authenticationProvider;
-    private final SuperUserAuthenticationProvider superUserAuthenticationProvider;
-    private final JwtTokenProvider jwtTokenProvider;
-
-    @Bean
-    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
-        http
-                .requiresChannel(channel -> channel
-                        .anyRequest().requiresSecure() // Force HTTPS for all requests.
-                )
-                .cors(Customizer.withDefaults())
-                .authorizeHttpRequests(auth -> auth
-                        .requestMatchers("/auth/**", "/api/auth/**", "/reset-password/**", "/css/**", "/js/**").permitAll()
-                        .requestMatchers("/admin/**").hasRole("ADMIN")
-                        .requestMatchers("/customer/**", "/api/customer/**").hasAnyRole("CUSTOMER", "ADMIN")
-                        .requestMatchers("/manager/**", "/api/manager/**").hasAnyRole("MANAGER", "ADMIN")
-                        .requestMatchers("/driver/**", "/api/driver/**").hasAnyRole("DRIVER", "ADMIN")
-                        .anyRequest()
-                        .authenticated()
-                )
-                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
-//                .formLogin(login -> login
-//                        .loginPage("/auth/login")
-//                        .loginProcessingUrl("/auth/login")
-//                        .usernameParameter("email")
-//                        .passwordParameter("password")
-//                        .defaultSuccessUrl("/home", true)
-//                        .failureUrl("/auth/login?error=true")
-//                        .permitAll()
-//                )
-                .logout(logout -> logout
-                        .logoutUrl("/logout")
-                        .logoutSuccessUrl("/login?logout")
-                        .clearAuthentication(true)
-                        .invalidateHttpSession(true)
-                        .deleteCookies("JSESSIONID")
-                        .logoutSuccessUrl("/")
-                        .permitAll()
-                )
-                .exceptionHandling(exception ->
-                        exception.authenticationEntryPoint((request, response, authException) -> {
-                            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
-                        })
-                )
-                .csrf(AbstractHttpConfigurer::disable);
-
-        return http.build();
-    }
-
-    @Bean
-    public CorsConfigurationSource corsConfigurationSource() {
-        CorsConfiguration configuration = new CorsConfiguration();
-
-        configuration.setAllowedOrigins(List.of("https://10.0.2.2:8443"));
-        configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
-        configuration.setAllowedHeaders(List.of("*"));
-        configuration.setAllowCredentials(true);
-        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-        source.registerCorsConfiguration("/**", configuration);
-        return source;
-    }
-
-    @Bean
-    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
-        PasswordEncoder standardEncoder = new BCryptPasswordEncoder();
-        UserDetails superUser = User.withUsername("superuser@admin.com")
-                .password(standardEncoder.encode("supersecret"))
-                .roles("ADMIN")
-                .build();
-        return new InMemoryUserDetailsManager(superUser);
-    }
-
-    @Bean
-    public AuthenticationManager authenticationManager(
-            HttpSecurity http
-    ) throws Exception {
-        AuthenticationManagerBuilder authenticationManagerBuilder =
-                http.getSharedObject(AuthenticationManagerBuilder.class);
-
-        authenticationManagerBuilder.authenticationProvider(superUserAuthenticationProvider);
-        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
-
-        return authenticationManagerBuilder.build();
-    }
-
-    @Bean
-    public PasswordEncoder passwordEncoder() {
-        return new PassEncryptionPasswordEncoder();
-    }
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,46 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security;
-
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Component;
-
-@Component
-public class SuperUserAuthenticationProvider implements AuthenticationProvider {
-
-    private static final String SUPERUSER_ENCODED_PASSWORD = "$2a$12$KC9Z0kHyu06iV4xlpKOgL.p2KH3NS9EY/N3g97nGAtC/NCpRXVgXa";
-
-    private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String username = authentication.getName();
-        String rawPassword = authentication.getCredentials().toString();
-
-        if (!"superuser@admin.com".equalsIgnoreCase(username)) {
-            return null;
-        }
-
-        if (!passwordEncoder.matches(rawPassword, SUPERUSER_ENCODED_PASSWORD)) {
-            throw new BadCredentialsException("Invalid superuser credentials");
-        }
-
-        UserDetails superUser = User.withUsername("superuser@admin.com")
-                .password(SUPERUSER_ENCODED_PASSWORD)
-                .roles("ADMIN")
-                .build();
-
-        return new UsernamePasswordAuthenticationToken(superUser, superUser.getPassword(), superUser.getAuthorities());
-    }
-
-    @Override
-    public boolean supports(Class<?> authentication) {
-        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,94 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.auth;
-
-import jakarta.servlet.http.HttpServletRequest;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
-import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import mk.ukim.finki.db.distributorapp._exceptions.InvalidUserCredentialsException;
-import mk.ukim.finki.db.distributorapp.city.CityService;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import java.util.List;
-
-
-@Controller
-@RequestMapping("/auth")
-public class AuthController {
-
-    private final CityService cityService;
-    private final AuthService authService;
-
-    public AuthController(CityService cityService, AuthService authService) {
-        this.cityService = cityService;
-        this.authService = authService;
-    }
-
-    @GetMapping("/login")
-    public String login(@RequestParam(value = "error", required = false) String error, Model model) {
-        if (error != null) {
-            model.addAttribute("error", "Invalid username or password");
-        }
-        return "authentication/login";
-    }
-
-    @PostMapping("/login")
-    public String login(@ModelAttribute LoginRequestDto loginRequest, RedirectAttributes redirectAttributes) {
-        try {
-            UsersLoadingDto user = authService.login(loginRequest);
-
-            switch (user.getUserRole()) {
-                case "ROLE_CUSTOMER" -> {
-                    return "redirect:/home/customer";
-                }
-                case "ROLE_ADMIN" -> {
-                    return "redirect:/home/admin";
-                }
-                case "ROLE_MANAGER" -> {
-                    return "redirect:/home/manager";
-                }
-                case "ROLE_DRIVER" -> {
-                    return "redirect:/home/driver";
-                }
-                default -> {
-                    return "redirect:/home";
-                }
-            }
-        } catch (InvalidUserCredentialsException e) {
-            redirectAttributes.addFlashAttribute("error", "Invalid credentials.");
-            return "redirect:/auth/login";
-        }
-    }
-
-    @GetMapping("/register")
-    public String registerCustomer(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("cities", cities);
-        return "authentication/register";
-    }
-
-    @PostMapping("/register")
-    public String register(@ModelAttribute RegisterRequestDto registerRequest) throws Exception {
-        authService.register(registerRequest);
-        return "redirect:/auth/login";
-    }
-
-    @GetMapping("/changePass")
-    public String changePassword(Model model) {
-        return "authentication/changePass";
-    }
-
-    @GetMapping("/logout")
-    public String logout(HttpServletRequest req) {
-        req.getSession().invalidate();
-        return "redirect:/auth/login";
-    }
-
-    @PostMapping("/logout")
-    public String logout(Model model) {
-        return "redirect:/auth/login";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.auth;
-
-import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
-import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
-import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
-import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-
-public interface AuthService {
-    void register(RegisterRequestDto registerRequest) throws Exception;
-
-    void createManager(CreateManagerDto createUserDto) throws Exception;
-
-    void createDriver(CreateDriverDto createDriverDto) throws Exception;
-
-    UsersLoadingDto login(LoginRequestDto loginRequest);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,173 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.auth;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.customer.CustomerRepository;
-import mk.ukim.finki.db.distributorapp.driver.DriverRepository;
-import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
-import mk.ukim.finki.db.distributorapp.manager.ManagerRepository;
-import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
-import mk.ukim.finki.db.distributorapp.token.TokenRepository;
-import mk.ukim.finki.db.distributorapp.users.Role;
-import mk.ukim.finki.db.distributorapp.token.TokenType;
-import mk.ukim.finki.db.distributorapp._exceptions.InvalidArgumentsException;
-import mk.ukim.finki.db.distributorapp._exceptions.InvalidUserCredentialsException;
-import mk.ukim.finki.db.distributorapp._security.EmailService;
-import mk.ukim.finki.db.distributorapp._security.PassEncryption;
-import mk.ukim.finki.db.distributorapp._security.PassEncryptionPasswordEncoder;
-import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
-import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
-import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
-import mk.ukim.finki.db.distributorapp.users.UserRepository;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalDateTime;
-import java.util.UUID;
-
-@Service
-@RequiredArgsConstructor
-public class AuthServiceImpl implements AuthService {
-
-    private final UserRepository userRepository;
-    private final TokenRepository tokenRepository;
-    private final EmailService emailService;
-    private final PassEncryptionPasswordEncoder passwordEncoder;
-    private final CustomerRepository customerRepository;
-    private final ManagerRepository managerRepository;
-    private final DriverRepository driverRepository;
-
-    @Override
-    @Transactional
-    public void register(RegisterRequestDto registerRequest) throws Exception {
-        String saltValue = PassEncryption.genSaltValue(30);
-        String safePass = passwordEncoder.encodeWithSalt(registerRequest.getPassword(), saltValue);
-
-        Integer res = this.userRepository.create(
-                registerRequest.getName(),
-                registerRequest.getSurname(),
-                safePass,
-                registerRequest.getEmail(),
-                registerRequest.getMobile(),
-                saltValue,
-                false,
-                null,
-                registerRequest.getCity(),
-                Role.ROLE_CUSTOMER.name(),
-                "CUSTOMER");
-        if (res == 0) {
-            throw new Exception("User insertion failed");
-        }
-
-        UserDto user = this.userRepository.findUserDtoByEmail(registerRequest.getEmail());
-        String t_value = UUID.randomUUID().toString();
-        tokenRepository.create(
-                t_value,
-                LocalDateTime.now().plusHours(1),
-                user.getId(),
-                TokenType.TOKEN_VERIFICATION.name()
-        );
-
-        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
-
-        SimpleMailMessage mailMessage = new SimpleMailMessage();
-        mailMessage.setTo(registerRequest.getEmail());
-        mailMessage.setSubject("Complete Registration!");
-        mailMessage.setText(("To confirm your account, please click here: " +
-                "https://localhost:8080/register/confirm-account?token=" + createdToken.getT_value()));
-        System.out.println("Confirmation Token: " + createdToken.getT_value());
-        emailService.sendEmail(mailMessage);
-
-        this.customerRepository.create(
-                user.getId(),
-                registerRequest.getEdb(),
-                registerRequest.getName(),
-                registerRequest.getAddress(),
-                registerRequest.getProfileImage());
-    }
-
-    @Override
-    @Transactional
-    public void createManager(CreateManagerDto createManagerDto) throws Exception {
-        String saltValue = PassEncryption.genSaltValue(30);
-        String safePass = passwordEncoder.encodeWithSalt(createManagerDto.getPassword(), saltValue);
-
-        Integer res = this.userRepository.create(
-                createManagerDto.getName(),
-                createManagerDto.getSurname(),
-                safePass,
-                createManagerDto.getEmail(),
-                createManagerDto.getMobile(),
-                saltValue,
-                false,
-                null,
-                createManagerDto.getCity(),
-                Role.ROLE_MANAGER.name(),
-                "MANAGER");
-
-        if (res == 0) {
-            throw new Exception("User insertion failed");
-        }
-
-        UserDto user = this.userRepository.findUserDtoByEmail(createManagerDto.getEmail());
-        this.managerRepository.create(
-                user.getId(),
-                createManagerDto.getWarehouseId()
-        );
-    }
-
-    @Override
-    @Transactional
-    public void createDriver(CreateDriverDto createDriverDto) throws Exception {
-        String saltValue = PassEncryption.genSaltValue(30);
-        String safePass = passwordEncoder.encodeWithSalt(createDriverDto.getPassword(), saltValue);
-
-        Integer res = this.userRepository.create(
-                createDriverDto.getName(),
-                createDriverDto.getSurname(),
-                safePass,
-                createDriverDto.getEmail(),
-                createDriverDto.getMobile(),
-                saltValue,
-                false,
-                null,
-                createDriverDto.getCity(),
-                Role.ROLE_DRIVER.name(),
-                "DRIVER");
-
-        if (res == 0) {
-            throw new Exception("User insertion failed");
-        }
-
-        UserDto user = this.userRepository.findUserDtoByEmail(createDriverDto.getEmail());
-        this.driverRepository.create(
-                user.getId(),
-                createDriverDto.getVehicle()
-        );
-    }
-
-    @Override
-    @Transactional
-    public UsersLoadingDto login(LoginRequestDto loginRequest) {
-        if (loginRequest.getEmail() == null
-                || loginRequest.getEmail().isEmpty()
-                || loginRequest.getPassword() == null
-                || loginRequest.getPassword().isEmpty()) {
-
-            throw new InvalidArgumentsException();
-        }
-
-        UsersLoadingDto user = this.userRepository.findUsersByUserEmailIgnoreCaseDto(loginRequest.getEmail());
-
-        String secPassword = passwordEncoder
-                .encodeWithSalt(loginRequest.getPassword(), user.getUserSalt());
-
-        if (!secPassword.equals(user.getUserPassword())) {
-            throw new InvalidUserCredentialsException();
-        }
-
-        return user;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,121 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.auth;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import mk.ukim.finki.db.distributorapp.token.TokenType;
-import mk.ukim.finki.db.distributorapp.token.TokenRepository;
-import mk.ukim.finki.db.distributorapp._security.EmailService;
-import mk.ukim.finki.db.distributorapp._security.PassEncryptionPasswordEncoder;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import java.time.LocalDateTime;
-import java.util.UUID;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping("/reset-password")
-public class PasswordResetController {
-    private final UserService userService;
-    private final EmailService emailService;
-    private final PassEncryptionPasswordEncoder passwordEncoder;
-    private final TokenRepository tokenRepository;
-
-
-    @GetMapping("/request")
-    public String resetPasswordRequest() {
-        return "authentication/reset-password-request";
-    }
-
-    @PostMapping("/reset-password-request")
-    public String resetPasswordRequest(@RequestParam("email") String email, Model model) {
-
-        UsersLoadingDto user = this.userService.findFullUserDtoByEmail(email);
-        if (user == null) {
-            model.addAttribute("error", "No user found with this email.");
-            return "authentication/reset-password-request";
-        }
-
-        String t_value = UUID.randomUUID().toString();
-        tokenRepository.create(
-                t_value,
-                LocalDateTime.now().plusHours(1),
-                user.getUserId(),
-                TokenType.TOKEN_RESET.name()
-        );
-        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
-
-        UserDto dto = this.userService.findUserDtoByEmail(email);
-        this.userService.edit(dto);
-
-        String resetLink = "https://localhost:8080/reset-password?token=" + createdToken.getT_value();
-        String emailBody = "Click the link to reset your password: " + resetLink;
-
-        SimpleMailMessage message = new SimpleMailMessage();
-        message.setTo(email);
-        message.setSubject("Password Reset Request");
-        message.setText(emailBody);
-        emailService.sendEmail(message);
-
-        model.addAttribute("success", "A password link has been sent to your email.");
-        return "authentication/reset-password-request";
-    }
-
-    @GetMapping("/reset-password")
-    public String showResetPasswordForm(@RequestParam("token") String tokenValue, Model model) {
-
-        UsersLoadingDto user = userService.findUserByResetToken(tokenValue);
-        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
-        if (user == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
-            model.addAttribute("error", "Invalid or expired token.");
-            return "authentication/reset-password";
-        }
-        model.addAttribute("token", token);
-        return "authentication/reset-password";
-    }
-
-    @PostMapping("/reset-password")
-    public String handleResetPassword(
-            @RequestParam("token") String tokenValue,
-            @RequestParam("newPassword") String newPassword,
-            @RequestParam("confirmPassword") String confirmPassword,
-            Model model) {
-
-        UsersLoadingDto user = userService.findUserByResetToken(tokenValue);
-        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
-        if (user.getUserId() == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
-            model.addAttribute("error", "Invalid or expired token.");
-            return "authentication/reset-password";
-        }
-
-        if (!newPassword.equals(confirmPassword)) {
-            model.addAttribute("error", "Passwords do not match.");
-            return "authentication/reset-password";
-        }
-
-        user.setUserPassword(passwordEncoder.encodeWithSalt(newPassword, user.getUserSalt()));
-        token.setT_validated_at(LocalDateTime.now());
-        tokenRepository.edit(
-                token.getT_id(),
-                token.getT_value(),
-                token.getT_expiry(),
-                token.getUser_id(),
-                token.getT_validated_at(),
-                token.getT_type()
-        );
-
-        UserDto dto = this.userService.findUserDtoByEmail(user.getUserEmail());
-        this.userService.edit(dto);
-
-        model.addAttribute("success", "Your password has been reset successfully.");
-        return "authentication/reset-password";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,60 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.auth;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import lombok.Setter;
-import mk.ukim.finki.db.distributorapp._security.jwt.JwtTokenProvider;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.List;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/api/auth")
-public class RestAuthController {
-    private final AuthService authService;
-    private final JwtTokenProvider jwtTokenProvider;
-    private final AuthenticationManager authenticationManager;
-
-    @PostMapping("/login")
-    public ResponseEntity<?> login(@RequestBody AuthRequest request){
-        try{
-            var authentication = authenticationManager.authenticate(
-                    new UsernamePasswordAuthenticationToken(request.getEmail(), request.getPassword())
-            );
-            String email = authentication.getName();
-            List<String> roles = authentication.getAuthorities()
-                    .stream()
-                    .map(GrantedAuthority::getAuthority)
-                    .toList();
-            String token = jwtTokenProvider.createToken(email,roles);
-            return ResponseEntity.ok(new AuthResponse(token));
-        }catch (AuthenticationException e){
-            return ResponseEntity.status(404).body("Invalid email/password supplied");
-        }
-    }
-}
-
-@Getter
-@Setter
-class AuthRequest {
-    private String email;
-    private String password;
-}
-
-@Getter
-@Setter
-@AllArgsConstructor
-class AuthResponse {
-    private String token;
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ChangePasswordDto {
-    String email;
-    String oldPassword;
-    String newPassword;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class LoginRequestDto {
-    private String email;
-    private String password;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class LoginResponseDto {
-    private String token;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class RegisterRequestDto {
-    private String name;
-    private String surname;
-    private String password;
-    private String repeatedPassword;
-    private String email;
-    private String mobile;
-    private String profileImage;
-    private Integer city;
-    private String edb;
-    private String compName;
-    private String address;
-    private String repImage;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,57 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.jwt;
-
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.util.StringUtils;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@RequiredArgsConstructor
-public class JwtAuthenticationFilter extends OncePerRequestFilter {
-
-    private final JwtTokenProvider jwtTokenProvider;
-
-    @Override
-    protected void doFilterInternal(HttpServletRequest request,
-                                    HttpServletResponse response,
-                                    FilterChain filterChain) throws ServletException, IOException {
-
-        String token = resolveToken(request);
-        if(token!=null && jwtTokenProvider.validateToken(token)){
-            String email = jwtTokenProvider.getEmailFromToken(token);
-
-            List<String> roles = jwtTokenProvider.getRolesFromToken(token);
-
-            List<GrantedAuthority> authorities = roles.stream()
-                    .map(SimpleGrantedAuthority::new)
-                    .collect(Collectors.toList());
-
-            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
-                    email, null, authorities);
-            auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
-
-            SecurityContextHolder.getContext().setAuthentication(auth);
-        }
-
-        filterChain.doFilter(request, response);
-    }
-
-    private String resolveToken(HttpServletRequest request) {
-        String bearerToken = request.getHeader("Authorization");
-        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
-            return bearerToken.substring(7);
-        }
-        return null;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,72 +1,0 @@
-package mk.ukim.finki.db.distributorapp._security.jwt;
-
-import io.jsonwebtoken.*;
-import io.jsonwebtoken.security.Keys;
-import jakarta.annotation.PostConstruct;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.security.Key;
-import java.util.Date;
-import java.util.List;
-
-@Component
-public class JwtTokenProvider {
-
-    @Value("${jwt.secret}")
-    private String secret;
-
-    @Value("${jwt.validity}")
-    private long validityInMilliseconds;
-
-    private Key secretKey;
-
-    @PostConstruct
-    protected void init() {
-        secretKey = Keys.hmacShaKeyFor(secret.getBytes());
-    }
-
-    public String createToken(String email, List<String> roles) {
-        Claims claims = Jwts.claims().setSubject(email);
-        claims.put("roles", roles);
-        Date now = new Date();
-        Date validity = new Date(now.getTime() + validityInMilliseconds);
-
-        return Jwts.builder()
-                .setClaims(claims)
-                .setIssuedAt(now)
-                .setExpiration(validity)
-                .signWith(secretKey, SignatureAlgorithm.HS256)
-                .compact();
-    }
-
-    public boolean validateToken(String token) {
-        try {
-            Jws<Claims> claims = Jwts.parserBuilder()
-                    .setSigningKey(secretKey)
-                    .build()
-                    .parseClaimsJws(token);
-            return !claims.getBody().getExpiration().before(new Date());
-        } catch (JwtException | IllegalArgumentException e) {
-            return false;
-        }
-    }
-
-    public String getEmailFromToken(String token) {
-        return Jwts.parserBuilder()
-                .setSigningKey(secretKey)
-                .build()
-                .parseClaimsJws(token)
-                .getBody()
-                .getSubject();
-    }
-
-    public List<String> getRolesFromToken(String token) {
-        Claims claims = Jwts.parserBuilder()
-                .setSigningKey(secretKey)
-                .build()
-                .parseClaimsJws(token)
-                .getBody();
-        return (List<String>) claims.get("roles");
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,122 +1,0 @@
-package mk.ukim.finki.db.distributorapp._web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
-import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
-import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
-import mk.ukim.finki.db.distributorapp._security.auth.AuthService;
-import mk.ukim.finki.db.distributorapp.city.CityService;
-import mk.ukim.finki.db.distributorapp.driver.DriverService;
-import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping("/admin")
-public class AdminController {
-
-    private final AuthService authService;
-    private final CityService cityService;
-    private final WarehouseService warehouseService;
-    private final DriverService driverService;
-    private final VehicleService vehicleService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String getDashboard(Model model) {
-        return "home/admin";
-    }
-
-    //    MANAGER CONTROLS:
-
-    @GetMapping("/create-manager")
-    public String createManager(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("cities", cities);
-        model.addAttribute("manager", new CreateManagerDto());
-        return "create-manager";
-    }
-
-    @PostMapping("/create-manager")
-    public String createManager(@ModelAttribute("manager") CreateManagerDto createManagerDto) throws Exception {
-        WarehouseDto wh = this.warehouseService.findByCityId(createManagerDto.getCity());
-        createManagerDto.setWarehouseId(wh.getId());
-        this.authService.createManager(createManagerDto);
-        return "redirect:/manager/all";
-    }
-
-    @GetMapping("/edit-manager")
-    public String editManager() {
-        return "edit-manager";
-    }
-
-    @GetMapping("/warehouse-by-city")
-    @ResponseBody
-    public WarehouseDto getWarehouseByCity(@RequestParam("cityId") Integer cityId) {
-        return this.warehouseService.findByCityId(cityId);
-    }
-
-    //    DRIVER CONTROLS:
-    @GetMapping("/create-driver")
-    public String createDriver(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("cities", cities);
-        model.addAttribute("driver", new CreateDriverDto());
-        return "create-driver";
-    }
-
-    @GetMapping("/vehicle-by-city")
-    @ResponseBody
-    public List<VehicleBasicDto> getVehicleByCity(@RequestParam("cityId") Integer cityId) {
-        WarehouseDto wh = this.warehouseService.findByCityId(cityId);
-        return this.vehicleService.getVehiclesByWarehouse(wh.getId());
-    }
-
-    @PostMapping("/create-driver")
-    public String createDriver(@ModelAttribute("driver") CreateDriverDto createDriverDto, @ModelAttribute("vehicle") VehicleDto vehicleDto) throws Exception {
-        this.authService.createDriver(createDriverDto);
-        return "all-drivers";
-    }
-
-    @GetMapping("/edit-driver/{id}")
-    public String editDriver(@PathVariable("id") Long id, Model model) {
-        DriverDto driver = this.driverService.findById(id);
-        model.addAttribute("driver", driver);
-        return "edit-driver";
-    }
-
-    @PostMapping("/edit-driver/{id}")
-    public String editDriver(@PathVariable("id") Long id, @ModelAttribute("driver") DriverDto driverDto, Model model) {
-        Integer res = this.driverService.edit(driverDto);
-        if (res == 1) {
-            model.addAttribute("edit-success", true);
-        } else {
-            model.addAttribute("edit-success", false);
-        }
-        return "all-drivers";
-    }
-
-    //    WAREHOUSE CONTROLS:
-
-    @GetMapping("/create-warehouse")
-    public String createWarehouse(Model model) {
-        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
-        model.addAttribute("warehouse", new WarehouseDto());
-        model.addAttribute("cities", cities);
-        return "create-warehouse";
-    }
-
-    @PostMapping("/create-warehouse")
-    public String createWarehouse(@ModelAttribute("warehouse") WarehouseDto warehouseDto, Model model) {
-        this.warehouseService.create(warehouseDto);
-        return "redirect:/warehouse";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,128 +1,0 @@
-package mk.ukim.finki.db.distributorapp._web;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.article.ArticleService;
-import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnitService;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
-import mk.ukim.finki.db.distributorapp.category.CategoryService;
-import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
-import mk.ukim.finki.db.distributorapp.customer.CustomerService;
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
-import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
-import mk.ukim.finki.db.distributorapp.manufacturer.ManufacturerService;
-import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
-import mk.ukim.finki.db.distributorapp.order.OrdersService;
-import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.WebDataBinder;
-import org.springframework.web.bind.annotation.*;
-
-import java.security.Principal;
-import java.util.List;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping(value = "/customer")
-public class CustomerController {
-    private final CustomerService customerService;
-    private final UserService userService;
-    private final OrdersService ordersService;
-    private final DeliveryService deliveryService;
-    private final CategoryService categoryService;
-    private final WarehouseService warehouseService;
-    private final ArticleService articleService;
-    private final ArticleUnitService articleUnitService;
-    private final ManufacturerService manufacturerService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String dashboard(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        CustomerDto customer = this.customerService.findCustomerById(user.getId());
-        model.addAttribute("customer", customer);
-        // TODO: fix fetching current orders for customer
-        model.addAttribute("currentOrders", ordersService.findCurrentOrdersByCustomer(customer.getId()));
-        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByCustomer(customer.getId()));
-        return "home/customer";
-    }
-
-    @GetMapping("/create-order")
-    public String createOrder(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-        String userEmail = authentication.getName();
-
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        WarehouseDto warehouse = this.warehouseService.findByCityId(user.getCityId());
-
-        List<CategoryDto> categories = this.categoryService.listCategories();
-        List<ArticleDto> articles = this.articleService.getAllArticlesByWarehouse(warehouse.getId());
-        List<ManufacturerDto> manufacturers = this.manufacturerService.getAllManufacturers();
-        List<ArticleUnitDto> articleUnits = this.articleUnitService.getAllArticleUnitsByWarehouse(warehouse.getId());
-
-        model.addAttribute("categories", categories);
-        model.addAttribute("articles", articles);
-        model.addAttribute("manufacturers", manufacturers);
-        model.addAttribute("articleUnits", articleUnits);
-        return "create-order";
-    }
-
-    @InitBinder
-    public void initBinder(WebDataBinder binder) {
-        ObjectMapper objectMapper = new ObjectMapper();
-        binder.registerCustomEditor(List.class, "orderItems", new java.beans.PropertyEditorSupport() {
-            @Override
-            public void setAsText(String text) throws IllegalArgumentException {
-                try {
-                    List<OrderItemDto> items = objectMapper.readValue(
-                            text, new TypeReference<List<OrderItemDto>>() {
-                            }
-                    );
-                    setValue(items);
-                } catch (Exception e) {
-                    throw new IllegalArgumentException("Invalid JSON for order items", e);
-                }
-            }
-        });
-    }
-
-    @PostMapping("/create-order")
-    public String createOrder(@ModelAttribute CreateOrderDto createOrderDto, Principal principal) {
-
-        this.ordersService.create(createOrderDto, principal);
-
-        String userEmail = principal.getName();
-
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        CustomerDto customer = this.customerService.findCustomerById(user.getId());
-
-        List<OrderSimpleDto> simpleCustomerOrders = this.ordersService.findSimpleOrdersByCustomer(customer.getId());
-        OrderSimpleDto createdOrder = simpleCustomerOrders.get(simpleCustomerOrders.size() - 1);
-        WarehouseDto wh = this.warehouseService.findByCityId(user.getCityId());
-
-        List<ArticleUnitSimpleDto> editedUnits = this.articleUnitService.addArticleUnitToOrder(createOrderDto.getOrderItems(), createdOrder.getId(), wh.getId());
-
-        for (ArticleUnitSimpleDto unit : editedUnits) {
-            this.articleUnitService.simpleEdit(unit);
-        }
-
-        return "redirect:/customer/dashboard";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,53 +1,0 @@
-package mk.ukim.finki.db.distributorapp._web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.driver.DriverService;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping(value = "/driver")
-public class DriverController {
-    private final DriverService driverService;
-    private final UserService userService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String dashboard(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        model.addAttribute("user", user);
-        model.addAttribute("startDelivery", new DeliveryStartDto());
-        model.addAttribute("endDelivery", new DeliveryEndDto());
-        model.addAttribute("ongoingDeliveries", this.driverService.getOngoingDeliveries(user.getId()));
-        model.addAttribute("newDeliveries", this.driverService.getNewAssignedDeliveries(user.getId()));
-        model.addAttribute("finishedDeliveries", this.driverService.getFinishedAssignedDeliveries(user.getId()));
-        return "home/driver";
-    }
-
-    @PostMapping("/start-delivery")
-    public String startDelivery(@ModelAttribute("startDelivery") DeliveryStartDto delivery) {
-        this.driverService.startDelivery(delivery);
-        return "redirect:/driver/dashboard";
-    }
-
-    @PostMapping("/end-delivery")
-    public String endDelivery(@ModelAttribute("endDelivery") DeliveryEndDto delivery) {
-        this.driverService.endDelivery(delivery);
-        return "redirect:/driver/dashboard";
-    }
-
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,54 +1,0 @@
-package mk.ukim.finki.db.distributorapp._web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-@Controller
-@RequiredArgsConstructor
-@RequestMapping({"/", "/home"})
-public class HomeController {
-    private final UserService userService;
-
-    @GetMapping
-    public String homePage(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
-        if (authentication == null || !authentication.isAuthenticated() || authentication.getPrincipal().equals("anonymousUser")) {
-            model.addAttribute("userType", "Guest");
-            return "authentication/login";
-        }
-
-        String userEmail = authentication.getName();
-        if (userEmail.equals("superuser@admin.com")) {
-            return "redirect:/admin/dashboard";
-        }
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        switch (user.getRole()) {
-            case "ROLE_CUSTOMER" -> {
-                return "redirect:/customer/dashboard";
-            }
-            case "ROLE_DRIVER" -> {
-                return "redirect:/driver/dashboard";
-            }
-            case "ROLE_MANAGER" -> {
-                return "redirect:/manager/dashboard";
-            }
-        }
-        model.addAttribute("userType", "Guest");
-        return "authentication/login";
-    }
-
-    @GetMapping("/access_denied")
-    public String getAccessDeniedPage(Model model) {
-        model.addAttribute("error", "access_denied");
-        return "authentication/access_denied";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,81 +1,0 @@
-package mk.ukim.finki.db.distributorapp._web;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import mk.ukim.finki.db.distributorapp.order.OrdersService;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import java.util.List;
-
-@Controller
-@RequestMapping(value = "/manager")
-@RequiredArgsConstructor
-public class ManagerController {
-    private final UserService userService;
-    private final VehicleService vehicleService;
-    private final OrdersService ordersService;
-    private final WarehouseService warehouseService;
-    private final DeliveryService deliveryService;
-
-    @GetMapping({"/dashboard", "/"})
-    public String dashboard(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        model.addAttribute("user", user);
-        model.addAttribute("currentInventory", warehouseService.getInventoryByManager(user.getId()));
-        model.addAttribute("vehicleStatus", vehicleService.getVehiclesByManager(user.getId()));
-        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
-        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByManager(user.getId()));
-        return "home/manager";
-    }
-
-    @GetMapping("/all")
-    public String allManagers(Model model) {
-        return "all-managers";
-    }
-
-    @GetMapping("/create-delivery")
-    public String createDelivery(Model model) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        model.addAttribute("user", user);
-        model.addAttribute("newDelivery", new DeliveryCreateDto());
-        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
-        model.addAttribute("vehicles", vehicleService.getVehiclesByManager(user.getId()));
-
-        return "create-delivery";
-    }
-
-    @PostMapping("/create-delivery")
-    public String createDelivery(@ModelAttribute DeliveryCreateDto newDelivery) {
-        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-        String userEmail = authentication.getName();
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-
-        this.deliveryService.create(newDelivery);
-
-        List<DeliverySimpleDto> deliveries = this.deliveryService.getDeliveriesByVehicle(newDelivery.getVehId());
-        DeliverySimpleDto createdDelivery = deliveries.get(0);
-
-        this.ordersService.addOrdersToDelivery(newDelivery.getOrders(), createdDelivery.getDeliveryId());
-
-        return "redirect:/manager/dashboard";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestCustomerController.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestCustomerController.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,38 +1,0 @@
-package mk.ukim.finki.db.distributorapp._web.api;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.customer.CustomerService;
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDashboardDto;
-import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
-import mk.ukim.finki.db.distributorapp.order.OrdersService;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.proForma.ProFormaService;
-import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("api/customer")
-@CrossOrigin(origins = "*")
-public class RestCustomerController {
-    private final CustomerService customerService;
-    private final OrdersService ordersService;
-    private final DeliveryService deliveryService;
-    private final ProFormaService proFormaService;
-
-    @GetMapping("/{customerId}/dashboard")
-    public ResponseEntity<CustomerDashboardDto> getCustomerDashboard(@PathVariable("customerId") Long customerId) {
-        CustomerDashboardDto dashboard = new CustomerDashboardDto();
-        List<OrderSimpleDto> userOrders = this.ordersService.findSimpleOrdersByCustomer(customerId);
-        List<DeliveryDto> userDeliveries = this.deliveryService.getCurrentDeliveriesByCustomer(customerId);
-        List<ProFormaDto> userProFormas = this.proFormaService.getCurentProFormasByCustomer(customerId);
-        dashboard.setOrders(userOrders);
-        dashboard.setDeliveries(userDeliveries);
-        dashboard.setProFormas(userProFormas);
-        return ResponseEntity.ok(dashboard);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,49 +1,0 @@
-package mk.ukim.finki.db.distributorapp.article;
-
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.category.Category;
-import mk.ukim.finki.db.distributorapp.manufacturer.Manufacturer;
-import mk.ukim.finki.db.distributorapp.price.Price;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "article")
-public class Article {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "art_id", nullable = false)
-    private Long articleId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "art_name", nullable = false)
-    private String articleName;
-
-    @NotNull
-    @Column(name = "art_weight", nullable = false)
-    private Integer articleWeight;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "art_image", nullable = false)
-    private String artImage;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "ctg_id", nullable = false)
-    private Category category;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "man_id", nullable = false)
-    private Manufacturer manufacturer;
-
-    @OneToMany(mappedBy = "article")
-    private List<Price> prices;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,109 +1,0 @@
-package mk.ukim.finki.db.distributorapp.article;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface ArticleRepository extends JpaRepository<Article, Long> {
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select a.art_id as id,
-                           a.art_name as name,
-                           m.man_name as manufacturer,
-                           0 as quantity,
-                           a.man_id as manufacturerId,
-                           p.price as price,
-                           c.ctg_name as category,
-                           a.ctg_id as categoryId,
-                           a.art_weight as weight,
-                           a.art_image as image
-                    from article a
-                    join manufacturer m on a.man_id = m.man_id
-                    join price p on p.art_id = a.art_id
-                    join category c on a.ctg_id = c.ctg_id
-                    """
-    )
-    List<ArticleDto> listAll();
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into article(art_name, art_image, art_weight, ctg_id, man_id) " +
-                    "values (?1,?2,?3,?4,?5)"
-    )
-    Integer create(
-            @NonNull @Param("name") String name,
-            @NonNull @Param("image") String image,
-            @NonNull @Param("weight") Integer weight,
-            @NonNull @Param("ctg") Integer ctg_id,
-            @NonNull @Param("man") Long man_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update article " +
-                    "set art_name=?2,art_image=?3,art_weight=?4,ctg_id=?5,man_id=?6 " +
-                    "where art_id=?1"
-    )
-    Integer edit(
-            @NonNull @Param("id") Long id,
-            @NonNull @Param("name") String name,
-            @NonNull @Param("img") String image,
-            @NonNull @Param("weight") Integer weight,
-            @NonNull @Param("ctg") Integer ctg_id,
-            @NonNull @Param("man") Long man_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from article where art_id=?1"
-    )
-    void delete(@Param("id") Long id);
-
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    with stock as (
-                        select a.art_id,
-                               count(au.unit_id) as quantity
-                        from article a
-                        join price p on a.art_id = p.art_id
-                        join unit_price up on p.price_id = up.price_id
-                        join article_unit au on up.unit_id = au.unit_id
-                        group by a.art_id
-                    )
-                    select a.art_id as id,
-                           a.art_name as name,
-                           m.man_name as manufacturer,
-                           st.quantity as quantity,
-                           m.man_id as manufacturerId,
-                           p.price as price,
-                           c.ctg_name as category,
-                           c.ctg_id as categoryId,
-                           a.art_weight as weight,
-                           a.art_image as image
-                    from article a
-                    join stock st on st.art_id=a.art_id
-                    join manufacturer m on a.man_id = m.man_id
-                    join category c on a.ctg_id = c.ctg_id
-                    join price p on a.art_id = p.art_id
-                    join unit_price up on p.price_id = up.price_id
-                    join article_unit au on up.unit_id = au.unit_id
-                    join warehouse w on w.wh_id = au.wh_id
-                    where w.wh_id = ?1
-                    """
-    )
-    List<ArticleDto> findAllByWarehouse(Integer warehouseId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.article;
-
-import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
-
-import java.util.List;
-
-public interface ArticleService {
-    List<ArticleDto> getAllArticles();
-
-    void deleteById(Long id);
-
-    Integer editById(ArticleDto article);
-
-    Integer create(ArticleDto article);
-
-    List<ArticleDto> getAllArticlesByWarehouse(Integer warehouseId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,49 +1,0 @@
-package mk.ukim.finki.db.distributorapp.article;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class ArticleServiceImpl implements ArticleService {
-    private final ArticleRepository articleRepository;
-
-    @Override
-    public List<ArticleDto> getAllArticles() {
-        return this.articleRepository.listAll();
-    }
-
-    @Override
-    public void deleteById(Long id) {
-        this.articleRepository.deleteById(id);
-    }
-
-    @Override
-    public Integer editById(ArticleDto art) {
-        return this.articleRepository.edit(
-                art.getId(),
-                art.getName(),
-                art.getImage(),
-                art.getWeight(),
-                art.getCategoryId(),
-                art.getManufacturerId());
-    }
-
-    @Override
-    public Integer create(ArticleDto art) {
-        return this.articleRepository.create(
-                art.getName(),
-                art.getImage(),
-                art.getWeight(),
-                art.getCategoryId(),
-                art.getManufacturerId());
-    }
-
-    @Override
-    public List<ArticleDto> getAllArticlesByWarehouse(Integer warehouseId) {
-        return this.articleRepository.findAllByWarehouse(warehouseId);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/article/dto/ArticleDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/article/dto/ArticleDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package mk.ukim.finki.db.distributorapp.article.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-@Data
-@AllArgsConstructor
-public class ArticleDto {
-    private Long id;
-    private String name;
-    private String manufacturer;
-    private Long quantity;
-    private Long manufacturerId;
-    private BigDecimal price;
-    private String category;
-    private Integer categoryId;
-    private Integer weight;
-    private String image;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,64 +1,0 @@
-package mk.ukim.finki.db.distributorapp.articleUnit;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.order.Orders;
-import mk.ukim.finki.db.distributorapp.price.Price;
-import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-@Entity
-@Data
-@Table(name = "article_unit")
-public class ArticleUnit {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "unit_id")
-    private Long unitId;
-
-    @NotNull
-    @Column(name = "unit_expiration_date", nullable = false)
-    private Date unitExpirationDate;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "unit_serial_number", nullable = false)
-    private String unitSerialNumber;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "unit_batch_number", nullable = false)
-    private String unitBatchNumber;
-
-    @NotNull
-    @Column(name = "unit_manufacture_date", nullable = false)
-    private Date unitManufactureDate;
-
-    @NotNull
-    @Column(name = "unit_cost_price", nullable = false)
-    private BigDecimal unitCostPrice;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "wh_id", nullable = false)
-    private Warehouse warehouse;
-
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "ord_id")
-    private Orders order;
-
-    @ManyToMany
-    @JoinTable(
-            name = "unit_price",
-            joinColumns = @JoinColumn(name = "unit_id"),
-            inverseJoinColumns = @JoinColumn(name = "price_id")
-    )
-    private Set<Price> prices = new LinkedHashSet<>();
-    // Hm...? Set<Price> or List<Price>
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,119 +1,0 @@
-package mk.ukim.finki.db.distributorapp.articleUnit;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-public interface ArticleUnitRepository extends JpaRepository<ArticleUnit, Long> {
-    @Query(
-            nativeQuery = true,
-            value = "select * from article_unit"
-    )
-    List<ArticleUnitSimpleDto> listAll();
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select au.unit_id as id,
-                            au.unit_expiration_date as expiryDate,
-                            au.unit_serial_number as serialNo,
-                            au.unit_batch_number as batchNo,
-                            au.unit_manufacture_date as manufactureDate,
-                            au.unit_cost_price as costPrice,
-                            a.art_id as artId,
-                            a.art_name as artName,
-                            au.wh_id as whId,
-                            r.region_name as whRegion,
-                            c.city_name as whCity,
-                            au.ord_id as ordId,
-                            u.user_email as customerEmail
-                    from article_unit au
-                    join warehouse wh on au.wh_id = wh.wh_id
-                    join city c on wh.city_id = c.city_id
-                    join region r on c.region_id = r.region_id
-                    join unit_price up on au.unit_id = up.unit_id
-                    join price p on up.price_id = p.price_id
-                    join article a on p.art_id = a.art_id
-                    join orders o on au.ord_id = o.ord_id
-                    join customer cust on o.cust_id = cust.user_id
-                    join users u on cust.user_id = u.user_id
-                    """
-    )
-    List<ArticleUnitDto> findAllByWarehouse(@NonNull @Param("wh") Integer wh_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into article_unit(unit_expiration_date, unit_serial_number, unit_batch_number, unit_manufacture_date, unit_cost_price, wh_id, ord_id) " +
-                    "values (?1,?2,?3,?4,?5,?6,?7)"
-    )
-    Integer create(
-            @NonNull @Param("exp_date") Date unit_exp_date,
-            @NonNull @Param("ser_no") String unit_ser_number,
-            @NonNull @Param("batch_no") String unit_batch_number,
-            @NonNull @Param("man_date") Date unit_manufacture_date,
-            @NonNull @Param("cost_price") BigDecimal unit_cost_price,
-            @NonNull @Param("wh") Integer wh_id,
-            @Param("ord") Long ord_id
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    update article_unit
-                    set unit_expiration_date = ?2, unit_serial_number = ?3, unit_batch_number = ?4,unit_manufacture_date = ?5,unit_cost_price = ?6,wh_id = ?7,ord_id = ?8
-                    where unit_id=?1
-                    """
-    )
-    Integer edit(
-            @NonNull @Param("id") Long id,
-            @NonNull @Param("exp_date") Date unit_exp_date,
-            @NonNull @Param("ser_no") String unit_ser_number,
-            @NonNull @Param("batch_no") String unit_batch_number,
-            @NonNull @Param("man_date") Date unit_manufacture_date,
-            @NonNull @Param("cost_price") BigDecimal unit_cost_price,
-            @NonNull @Param("wh") Integer wh_id,
-            @Param("ord") Long ord_id
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from article_unit where unit_id=?1"
-    )
-    void delete(@NonNull @Param("id") Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select au.unit_id as id,
-                           au.unit_expiration_date as expiryDate,
-                           au.unit_serial_number as serialNo,
-                           au.unit_batch_number as batchNo,
-                           au.unit_manufacture_date as manufactureDate,
-                           au.unit_cost_price as costPrice,
-                           a.art_id as artId,
-                           au.wh_id as whId,
-                           au.ord_id as ordId
-                    from article_unit au
-                    join unit_price up on au.unit_id = up.unit_id
-                    join price p on up.price_id = p.price_id
-                    join article a on p.art_id = a.art_id
-                    where au.wh_id = ?2 and a.art_id = ?1
-                    """
-    )
-    List<ArticleUnitSimpleDto> findAllSimpleByArticleAndWarehouse(Long articleId, Integer warehouseId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package mk.ukim.finki.db.distributorapp.articleUnit;
-
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface ArticleUnitService {
-    List<ArticleUnitSimpleDto> getAllArticleUnits();
-
-    Integer create(ArticleUnitDto articleUnitDto);
-
-    Integer edit(ArticleUnitDto articleUnitDto);
-
-    // TODO: Change edit and simpleEdit method
-    @Transactional
-    Integer simpleEdit(ArticleUnitSimpleDto articleUnitSimpleDto);
-
-    void delete(Long id);
-
-    List<ArticleUnitDto> getAllArticleUnitsByWarehouse(Integer warehouseId);
-
-    List<ArticleUnitSimpleDto> findAllSimpleByArticleAndWarehouse(Long articleId, Integer warehouseId);
-
-    List<ArticleUnitSimpleDto> addArticleUnitToOrder(List<OrderItemDto> orderItems, Long id, Integer whId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,101 +1,0 @@
-package mk.ukim.finki.db.distributorapp.articleUnit;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
-import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
-import mk.ukim.finki.db.distributorapp.unitPrice.UnitPriceRepository;
-import mk.ukim.finki.db.distributorapp.warehouse.WarehouseRepository;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class ArticleUnitServiceImpl implements ArticleUnitService {
-    private final ArticleUnitRepository articleUnitRepository;
-    private final WarehouseRepository warehouseRepository;
-    private final UnitPriceRepository unitPriceRepository;
-
-    @Override
-    public List<ArticleUnitSimpleDto> getAllArticleUnits() {
-        return this.articleUnitRepository.listAll();
-    }
-
-    @Override
-    @Transactional
-    public Integer create(ArticleUnitDto articleUnitDto) {
-        return this.articleUnitRepository.create(
-                articleUnitDto.getExpiryDate(),
-                articleUnitDto.getSerialNo(),
-                articleUnitDto.getBatchNo(),
-                articleUnitDto.getManufactureDate(),
-                articleUnitDto.getCostPrice(),
-                articleUnitDto.getWhId(),
-                articleUnitDto.getOrdId()
-        );
-    }
-
-    @Override
-    @Transactional
-    public Integer edit(ArticleUnitDto articleUnitDto) {
-        return this.articleUnitRepository.edit(
-                articleUnitDto.getId(),
-                articleUnitDto.getExpiryDate(),
-                articleUnitDto.getSerialNo(),
-                articleUnitDto.getBatchNo(),
-                articleUnitDto.getManufactureDate(),
-                articleUnitDto.getCostPrice(),
-                articleUnitDto.getWhId(),
-                articleUnitDto.getOrdId()
-        );
-    }
-
-    @Transactional
-    @Override
-    public Integer simpleEdit(ArticleUnitSimpleDto articleUnitSimpleDto) {
-        return this.articleUnitRepository.edit(
-                articleUnitSimpleDto.getId(),
-                articleUnitSimpleDto.getExpiryDate(),
-                articleUnitSimpleDto.getSerialNo(),
-                articleUnitSimpleDto.getBatchNo(),
-                articleUnitSimpleDto.getManufactureDate(),
-                articleUnitSimpleDto.getCostPrice(),
-                articleUnitSimpleDto.getWhId(),
-                articleUnitSimpleDto.getOrdId()
-        );
-    }
-
-    @Override
-    public void delete(Long id) {
-        this.articleUnitRepository.deleteById(id);
-    }
-
-    @Override
-    public List<ArticleUnitDto> getAllArticleUnitsByWarehouse(Integer warehouseId) {
-        return this.articleUnitRepository.findAllByWarehouse(warehouseId);
-    }
-
-    @Override
-    public List<ArticleUnitSimpleDto> findAllSimpleByArticleAndWarehouse(Long articleId, Integer warehouseId) {
-        return this.articleUnitRepository.findAllSimpleByArticleAndWarehouse(articleId, warehouseId);
-    }
-
-    @Override
-    public List<ArticleUnitSimpleDto> addArticleUnitToOrder(List<OrderItemDto> orderItems, Long id, Integer whId) {
-        List<ArticleUnitSimpleDto> editedUnits = new ArrayList<>();
-        for (OrderItemDto orderItem : orderItems) {
-            Long articleId = orderItem.getArticleId();
-            Integer quantity = orderItem.getQuantity();
-
-            List<ArticleUnitSimpleDto> articleUnitItems = findAllSimpleByArticleAndWarehouse(articleId, whId);
-            for (int j = 0; j < quantity; j++) {
-                articleUnitItems.get(j).setOrdId(id);
-                editedUnits.add(articleUnitItems.get(j));
-            }
-        }
-        return editedUnits;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,25 +1,0 @@
-package mk.ukim.finki.db.distributorapp.articleUnit.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-public class ArticleUnitDto {
-    private Long id;
-    private Date expiryDate;
-    private String serialNo;
-    private String batchNo;
-    private Date manufactureDate;
-    private BigDecimal costPrice;
-    private Long artId;
-    private String artName;
-    private Integer whId;
-    private String whRegion;
-    private String whCity;
-    private Long ordId;
-    private String customerEmail;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitSimpleDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitSimpleDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.articleUnit.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ArticleUnitSimpleDto {
-    Long id;
-    Date expiryDate;
-    String serialNo;
-    String batchNo;
-    Date manufactureDate;
-    BigDecimal costPrice;
-    Long artId;
-    Integer whId;
-    Long ordId;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/category/Category.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/category/Category.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package mk.ukim.finki.db.distributorapp.category;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.article.Article;
-
-import java.util.List;
-
-@Entity(name = "Category")
-@Data
-@Table(name = "category")
-public class Category {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "ctg_id")
-    private Integer categoryId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "ctg_name", nullable = false)
-    private String categoryName;
-
-    @OneToMany(mappedBy = "category")
-    private List<Article> articles;
-
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,54 +1,0 @@
-package mk.ukim.finki.db.distributorapp.category;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface CategoryRepository extends JpaRepository<Category, Long> {
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select ctg_id as id,
-                           ctg_name as name
-                    from category
-                    """
-    )
-    List<CategoryDto> listAll();
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into category(ctg_name)
-                    values (:name)
-                    """
-    )
-    Integer create(@Param("name") @NonNull String name);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update category " +
-                    "set ctg_name=?2 " +
-                    "where ctg_id=?1"
-    )
-    Integer edit(@NonNull Integer id,
-                 @NonNull String name);
-
-    @Modifying
-    @Transactional
-    @Query(
-            value = "delete from category " +
-                    "where ctg_id = ?1",
-            nativeQuery = true)
-    void deleteById(@NonNull Integer id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-package mk.ukim.finki.db.distributorapp.category;
-
-import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
-
-import java.util.List;
-
-public interface CategoryService {
-
-    List<CategoryDto> listCategories();
-
-    Integer create(CategoryDto categoryDto);
-
-    Integer edit(CategoryDto categoryDto);
-
-    void deleteById(Integer id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,34 +1,0 @@
-package mk.ukim.finki.db.distributorapp.category;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class CategoryServiceImpl implements CategoryService {
-    private final CategoryRepository categoryRepository;
-
-    @Override
-    public List<CategoryDto> listCategories() {
-        return this.categoryRepository.listAll();
-    }
-
-    @Override
-    public Integer create(CategoryDto categoryDto) {
-        return this.categoryRepository.create(categoryDto.getName());
-    }
-
-    @Override
-    public Integer edit(CategoryDto categoryDto) {
-        return this.categoryRepository.edit(categoryDto.getId(), categoryDto.getName());
-    }
-
-    @Override
-    public void deleteById(Integer id) {
-        this.categoryRepository.deleteById(id);
-    }
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/category/dto/CategoryDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/category/dto/CategoryDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.db.distributorapp.category.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class CategoryDto {
-    private Integer id;
-    private String name;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/city/City.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/City.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,38 +1,0 @@
-package mk.ukim.finki.db.distributorapp.city;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.region.Region;
-import mk.ukim.finki.db.distributorapp.users.User;
-import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "city")
-public class City {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "city_id")
-    private Integer cityId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "city_name", nullable = false)
-    private String cityName;
-
-    @OneToMany(mappedBy = "city")
-    private List<User> users;
-
-    @OneToOne(mappedBy = "city")
-    private Warehouse warehouse;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "region_id", nullable = false)
-    private Region region;
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/city/CityRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/CityRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package mk.ukim.finki.db.distributorapp.city;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface CityRepository extends JpaRepository<City, Long> {
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select c.city_id as id, c.city_name as name
-                    from city c
-                    """
-    )
-    List<CityDtoRegister> findAllCityDtos();
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into city(city_name, region_id) " +
-                    "values (?1,?2)"
-    )
-    Integer create(
-            @NonNull String name,
-            @NonNull Integer region);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update city " +
-                    "set city_name=?2, region_id=?3 " +
-                    "where city_id=?1"
-    )
-    Integer edit(
-            @NonNull Integer id,
-            @NonNull String name,
-            @NonNull Integer region);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from city c " +
-                    "where c.city_id=?1"
-    )
-    void deleteById(@NonNull Integer id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/city/CityService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/CityService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.city;
-
-import mk.ukim.finki.db.distributorapp.city.dto.CityDto;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-
-import java.util.List;
-
-public interface CityService {
-
-    List<CityDtoRegister> findAllCityDtos();
-
-    Integer create(CityDto cityDto);
-
-    Integer edit(CityDto cityDto);
-
-    void deleteById(Integer id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/city/CityServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/CityServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,34 +1,0 @@
-package mk.ukim.finki.db.distributorapp.city;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDto;
-import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class CityServiceImpl implements CityService {
-    private final CityRepository cityRepository;
-
-    @Override
-    public List<CityDtoRegister> findAllCityDtos() {
-        return this.cityRepository.findAllCityDtos();
-    }
-
-    @Override
-    public Integer create(CityDto dto) {
-        return this.cityRepository.create(dto.getName(), dto.getRegionId());
-    }
-
-    @Override
-    public Integer edit(CityDto dto) {
-        return this.cityRepository.edit(dto.getId(), dto.getName(), dto.getRegionId());
-    }
-
-    @Override
-    public void deleteById(Integer id) {
-        this.cityRepository.deleteById(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package mk.ukim.finki.db.distributorapp.city.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CityDto {
-    private Integer id;
-    private String name;
-    private Integer regionId;
-    private String regionName;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDtoRegister.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDtoRegister.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.db.distributorapp.city.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class CityDtoRegister {
-    private Integer id;
-    private String name;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,46 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customer;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import mk.ukim.finki.db.distributorapp.customerWeekday.CustomerWeekday;
-import mk.ukim.finki.db.distributorapp.order.Orders;
-import mk.ukim.finki.db.distributorapp.users.User;
-
-import java.util.List;
-
-@EqualsAndHashCode(callSuper = true)
-@Entity
-@Data
-@Table(name = "customer")
-@DiscriminatorValue("CUSTOMER")
-@PrimaryKeyJoinColumn(name = "user_id")
-public class Customer extends User {
-    @Size(max = 13)
-    @NotNull
-    @Column(name = "cust_EDB", nullable = false, length = 13)
-    private String customerEDB;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "cust_company_name", nullable = false)
-    private String customerCompanyName;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "cust_adr", nullable = false)
-    private String customerAddress;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "cust_representative_img")
-    private String customerRepresentativeImage;
-
-    @OneToMany(mappedBy = "customer", fetch = FetchType.EAGER)
-    private List<Orders> orders;
-
-    @OneToMany(mappedBy = "customer", fetch = FetchType.EAGER)
-    private List<CustomerWeekday> customerWeekdays;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,68 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customer;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface CustomerRepository extends JpaRepository<Customer, Long> {
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select c.user_id as id,
-                           u.user_name as name,
-                           u.user_email as email,
-                           u.user_mobile as phone,
-                           c.cust_edb as edb,
-                           c.cust_company_name as compName,
-                           c.cust_adr as address,
-                           c.cust_representative_img
-                    from customer c
-                    join users u on c.user_id = u.user_id
-                    """
-    )
-    CustomerDto findCustomerById(@NonNull Long id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into customer(user_id, cust_edb, cust_company_name, cust_adr, cust_representative_img)
-                    values (?1,?2,?3,?4,?5)
-                    """
-    )
-    Integer create(
-            @NonNull Long id,
-            @NonNull String customerEDB,
-            @NonNull String customerName,
-            @NonNull String customerStreet,
-            @NonNull String customerImage);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update customer " +
-                    "set cust_edb=?2,cust_company_name=?3,cust_adr=?4,cust_representative_img=?5 " +
-                    "where user_id=?1"
-    )
-    Integer edit(
-            @NonNull Long id,
-            @NonNull String customerEDB,
-            @NonNull String customerName,
-            @NonNull String customerStreet,
-            @NonNull String customerImage);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from customer " +
-                    "where user_id=?!"
-    )
-    void delete(@NonNull Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customer;
-
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
-
-public interface CustomerService {
-
-    CustomerDto findCustomerById(Long id);
-
-    Integer create(CustomerDto customerDto);
-
-    Integer edit(CustomerDto customerDto);
-
-    void deleteById(Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,42 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customer;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class CustomerServiceImpl implements CustomerService {
-
-    private final CustomerRepository customerRepository;
-
-    @Override
-    public CustomerDto findCustomerById(Long id) {
-        return this.customerRepository.findCustomerById(id);
-    }
-
-    @Override
-    public Integer create(CustomerDto customerDto) {
-        return this.customerRepository.create(
-                customerDto.getId(),
-                customerDto.getEdb(),
-                customerDto.getCompName(),
-                customerDto.getAddress(),
-                customerDto.getRepImage());
-    }
-
-    @Override
-    public Integer edit(CustomerDto customerDto) {
-        return this.customerRepository.edit(
-                customerDto.getId(),
-                customerDto.getEdb(),
-                customerDto.getCompName(),
-                customerDto.getAddress(),
-                customerDto.getRepImage());
-    }
-
-    @Override
-    public void deleteById(Long id) {
-        this.customerRepository.delete(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDashboardDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDashboardDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customer.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
-
-import java.util.List;
-
-@AllArgsConstructor
-@NoArgsConstructor
-@Data
-public class CustomerDashboardDto {
-    List<OrderSimpleDto> orders;
-    List<DeliveryDto> deliveries;
-    List<ProFormaDto> proFormas;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customer.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class CustomerDto {
-    private Long id;
-    private String name;
-    private String email;
-    private String phone;
-    private String edb;
-    private String compName;
-    private String address;
-    private String repImage;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekday.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekday.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,40 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customerWeekday;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Getter;
-import lombok.Setter;
-import mk.ukim.finki.db.distributorapp.customer.Customer;
-import mk.ukim.finki.db.distributorapp.weekday.Weekday;
-
-import java.time.LocalTime;
-
-@Getter
-@Setter
-@Entity
-@Table(name = "customer_weekday")
-public class CustomerWeekday {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "cust_day_id", nullable = false)
-    private Long customerDayId;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "cust_id", nullable = false)
-    private Customer customer;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "day_id", nullable = false)
-    private Weekday day;
-
-    @NotNull
-    @Column(name = "start_time", nullable = false)
-    private LocalTime customerDayStartTime;
-
-    @NotNull
-    @Column(name = "end_time", nullable = false)
-    private LocalTime customerDayEndTime;
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,48 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customerWeekday;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalTime;
-
-public interface CustomerWeekdayRepository extends JpaRepository<CustomerWeekday, Long> {
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into customer_weekday(cust_id, day_id, start_time, end_time) " +
-                    "values (?1,?2,?3,?4)"
-    )
-    Integer create(
-            Long userId,
-            Short weekdayId,
-            LocalTime startTime,
-            LocalTime endTime);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update customer_weekday " +
-                    "set cust_id=?2,day_id=?3,start_time=?4,end_time=?5 " +
-                    "where cust_day_id=?1"
-    )
-    Integer edit(
-            Long custDayId,
-            Long userId,
-            Short weekdayId,
-            LocalTime startTime,
-            LocalTime endTime);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from customer_weekday where cust_day_id=?1"
-    )
-    void deleteById(@NonNull Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customerWeekday;
-
-import mk.ukim.finki.db.distributorapp.customerWeekday.dto.CustomerWeekdayDto;
-
-public interface CustomerWeekdayService {
-
-    Integer create(CustomerWeekdayDto customerWeekdayDto);
-
-    Integer edit(CustomerWeekdayDto customerWeekdayDto);
-
-    void deleteById(Long customerWeekdayId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customerWeekday;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.customerWeekday.dto.CustomerWeekdayDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class CustomerWeekdayServiceImpl implements CustomerWeekdayService {
-    private final CustomerWeekdayRepository customerWeekdayRepository;
-
-    @Override
-    public Integer create(CustomerWeekdayDto customerWeekdayDto) {
-        return this.customerWeekdayRepository.create(
-                customerWeekdayDto.getCustomerId(),
-                customerWeekdayDto.getDayId(),
-                customerWeekdayDto.getDayStartTime(),
-                customerWeekdayDto.getDayEndTime()
-        );
-    }
-
-    @Override
-    public Integer edit(CustomerWeekdayDto customerWeekdayDto) {
-        return this.customerWeekdayRepository.edit(
-                customerWeekdayDto.getCustomerId(),
-                customerWeekdayDto.getCustomerId(),
-                customerWeekdayDto.getDayId(),
-                customerWeekdayDto.getDayStartTime(),
-                customerWeekdayDto.getDayEndTime()
-        );
-    }
-
-    @Override
-    public void deleteById(Long customerWeekdayId) {
-        this.customerWeekdayRepository.deleteById(customerWeekdayId);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/dto/CustomerWeekdayDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/dto/CustomerWeekdayDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package mk.ukim.finki.db.distributorapp.customerWeekday.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.time.LocalTime;
-
-@Data
-@AllArgsConstructor
-public class CustomerWeekdayDto {
-    private Long id;
-    private Long customerId;
-    private String customerName;
-    private Short dayId;
-    private String dayName;
-    private LocalTime dayStartTime;
-    private LocalTime dayEndTime;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/Delivery.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/Delivery.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,55 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.deliveryStatus.DeliveryStatus;
-import mk.ukim.finki.db.distributorapp.order.Orders;
-import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
-
-import java.time.LocalTime;
-import java.util.Date;
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "delivery")
-public class Delivery {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "del_id")
-    private Long deliveryId;
-
-    @NotNull
-    @Column(name = "del_date_created", nullable = false)
-    private Date deliveryDateCreated;
-
-    @NotNull
-    @Column(name = "del_date", nullable = false)
-    private Date deliveryDate;
-
-    @Column(name = "del_start_km")
-    private Integer deliveryStartKm;
-
-    @Column(name = "del_end_km")
-    private Integer deliveryEndKm;
-
-    @Column(name = "del_start_time")
-    private LocalTime deliveryStartTime;
-
-    @Column(name = "del_end_time")
-    private LocalTime deliveryEndTime;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "d_status_id", nullable = false)
-    private DeliveryStatus deliveryStatus;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "veh_id", nullable = false)
-    private Vehicle vehicle;
-
-    @OneToMany(mappedBy = "delivery")
-    private List<Orders> orders;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,164 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalTime;
-import java.util.Date;
-import java.util.List;
-
-public interface DeliveryRepository extends JpaRepository<Delivery, Long> {
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into delivery(del_date_created, del_date, del_start_km, del_end_km, del_start_time, del_end_time, d_status_id, veh_id)
-                    values (?1,?2,?3,?4,?5,?6,?7,?8)
-                    """
-    )
-    Integer create(
-            @NonNull Date del_date_created,
-            @NonNull Date del_date,
-            Integer del_start_km,
-            Integer del_end_km,
-            LocalTime del_start_time,
-            LocalTime del_end_time,
-            @NonNull Short del_status_id,
-            @NonNull Integer veh_id
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    update delivery
-                    set del_date_created = ?2,del_date = ?3,del_start_km = ?4,del_end_km = ?5,del_start_time = ?6,del_end_time = ?7,d_status_id = ?8,veh_id = ?9
-                    where del_id = ?1
-                    """
-    )
-    Integer edit(
-            @NonNull Long id,
-            @NonNull Date del_date_created,
-            @NonNull Date del_date,
-            Integer del_start_km,
-            Integer del_end_km,
-            LocalTime del_start_time,
-            LocalTime del_end_time,
-            @NonNull Short del_status_id,
-            @NonNull Integer veh_id
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from delivery where del_id = ?1"
-    )
-    void delete(@NonNull Long id);
-
-    //------------------------------------------------------------------------------------------------------------------
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select del.del_id as id,
-                           del.del_date_created as dateCreated,
-                           del.del_date as deliveryDate,
-                           del.del_start_km as delStartKm,
-                           del.del_end_km as delEndKm,
-                           to_char(d.del_start_time, 'HH24:MI:22') as delStartTime,
-                           to_char(d.del_end_time, 'HH24:MI:SS') as delEndTime,
-                           del.d_status_id as dStatusId,
-                           ds.d_status_name as delStatus,
-                           v.veh_id as vehId,
-                           dr.user_id as driverId,
-                           u.user_name as driverName,
-                           u.user_image as driverImage
-                    from delivery del
-                        join orders o on o.del_id=del.del_id
-                        join delivery d on o.del_id = d.del_id
-                        join delivery_status ds on d.d_status_id=ds.d_status_id
-                        join vehicle v on v.veh_id=d.veh_id
-                        join driver dr on dr.veh_id=v.veh_id
-                        join users u on u.user_id=dr.user_id
-                    where o.cust_id=:customer and del.d_status_id <> 4;
-                    """
-    )
-    List<DeliveryDto> getCurrentDeliveriesByCustomer(@NonNull @Param("customer") Long customer_id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select d.del_id as id,
-                           d.del_date_created as dateCreated,
-                           d.del_date as deliveryDate,
-                           d.del_start_km as delStartKm,
-                           d.del_end_km as delEndKm,
-                           to_char(d.del_start_time, 'HH24:MI:22') as delStartTime,
-                           to_char(d.del_end_time, 'HH24:MI:SS') as delEndTime,
-                           d.d_status_id as dStatusId,
-                           ds.d_status_name as delStatus,
-                           v.veh_id as vehId,
-                           dr.user_id as driverId,
-                           u.user_name as driverName,
-                           u.user_image as driverImage
-                    from warehouse w
-                        join manager m on w.wh_id = m.wh_id
-                        join article_unit au on w.wh_id = au.wh_id
-                        join orders o on au.ord_id = o.ord_id
-                        join delivery d on o.del_id = d.del_id
-                        join delivery_status ds on d.d_status_id=ds.d_status_id
-                        join vehicle v on v.veh_id=d.veh_id
-                        join driver dr on dr.veh_id=v.veh_id
-                        join users u on u.user_id=dr.user_id
-                    where m.user_id=:manager and d.d_status_id<>4
-                    """
-    )
-    List<DeliveryDto> getCurrentDeliveriesByManager(@NonNull @Param("manager") Long manager_id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select del.del_id as deliveryId,
-                           u.user_name as driverName,
-                           del.del_date as deliveryDate,
-                           del.del_date_created as deliveryCreatedDate,
-                           del.d_status_id as deliveryStatus,
-                           ds.d_status_name as deliveryStatusName
-                    from delivery del
-                    join delivery_status ds on ds.d_status_id=del.d_status_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on d.veh_id = v.veh_id
-                    join users u on u.user_id=d.user_id
-                    where v.veh_id = ?1
-                    """
-    )
-    List<DeliverySimpleDto> getDeliveriesByVehicle(Integer vehicleId);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select d.del_id as delId,
-                           d.del_date_created as delDateCreated,
-                           d.del_date as delDate,
-                           d.del_start_km as delStartKm,
-                           d.del_end_km as delEndKm,
-                           to_char(d.del_start_time, 'HH24:MI:22') as delStartTime,
-                           to_char(d.del_end_time, 'HH24:MI:SS') as delEndTime,
-                           d.d_status_id as delStatusId,
-                           d.veh_id as veh_id
-                    from delivery d
-                    where d.del_id = ?1
-                    """
-    )
-    DeliveryFullDto findDeliveryDtoById(@Param("id") Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,25 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery;
-
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-
-import java.util.List;
-
-public interface DeliveryService {
-
-    DeliveryFullDto findDeliveryById(Long id);
-
-    Integer create(DeliveryCreateDto deliveryDto);
-
-    Integer edit(DeliveryFullDto deliveryDto);
-
-    void deleteById(Long del_id);
-
-    List<DeliveryDto> getCurrentDeliveriesByCustomer(Long customerId);
-
-    List<DeliveryDto> getCurrentDeliveriesByManager(Long managerId);
-
-    List<DeliverySimpleDto> getDeliveriesByVehicle(Integer vehicleId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,72 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import org.springframework.stereotype.Service;
-
-import java.util.Date;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class DeliveryServiceImpl implements DeliveryService {
-    private final DeliveryRepository deliveryRepository;
-
-    @Override
-    public DeliveryFullDto findDeliveryById(Long id) {
-        return this.deliveryRepository.findDeliveryDtoById(id);
-    }
-
-    @Override
-    public Integer create(DeliveryCreateDto deliveryDto) {
-        Date currentDate = new Date();
-        return this.deliveryRepository.create(
-                currentDate,
-                deliveryDto.getDelDate(),
-                null,
-                null,
-                null,
-                null,
-                (short) 1,
-                deliveryDto.getVehId()
-        );
-    }
-
-    @Override
-    public Integer edit(DeliveryFullDto deliveryDto) {
-        return this.deliveryRepository.edit(
-                deliveryDto.getDelId(),
-                deliveryDto.getDelDateCreated(),
-                deliveryDto.getDelDate(),
-                deliveryDto.getDelStartKm(),
-                deliveryDto.getDelEndKm(),
-                deliveryDto.getParsedDelStartTime(),
-                deliveryDto.getParsedDelEndTime(),
-                deliveryDto.getDelStatusId(),
-                deliveryDto.getVeh_id()
-        );
-    }
-
-    @Override
-    public void deleteById(Long del_id) {
-        this.deliveryRepository.delete(del_id);
-    }
-
-    @Override
-    public List<DeliveryDto> getCurrentDeliveriesByCustomer(Long customerId) {
-        return this.deliveryRepository.getCurrentDeliveriesByCustomer(customerId);
-    }
-
-    @Override
-    public List<DeliveryDto> getCurrentDeliveriesByManager(Long managerId) {
-        return this.deliveryRepository.getCurrentDeliveriesByManager(managerId);
-    }
-
-    @Override
-    public List<DeliverySimpleDto> getDeliveriesByVehicle(Integer vehicleId) {
-        return this.deliveryRepository.getDeliveriesByVehicle(vehicleId);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryCreateDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryCreateDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.util.Date;
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class DeliveryCreateDto {
-    private Integer vehId;
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private Date delDate;
-    private List<Long> orders;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,36 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.time.LocalTime;
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-public class DeliveryDto {
-    private Long id;
-    private Date dateCreated;
-    private Date delDate;
-    private Integer delStartKm;
-    private Integer delEndKm;
-
-    private String delStartTime;
-    private String delEndTime;
-
-    private Short dStatusId;
-    private String delStatus;
-    private Integer vehId;
-    private Long driverId;
-    private String driverName;
-    private String driverImg;
-
-
-    public LocalTime getParsedDelStartTime() {
-        return delStartTime != null ? LocalTime.parse(delStartTime) : null;
-    }
-
-    public LocalTime getParsedDelEndTime() {
-        return delEndTime != null ? LocalTime.parse(delEndTime) : null;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryEndDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryEndDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class DeliveryEndDto {
-    private Long id;
-    private Integer delEndKm;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryFullDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryFullDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,33 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalTime;
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class DeliveryFullDto {
-    private Long delId;
-    private Date delDateCreated;
-    private Date delDate;
-    private Integer delStartKm;
-    private Integer delEndKm;
-
-    private String delStartTime;
-    private String delEndTime;
-
-    private Short delStatusId;
-    private Integer veh_id;
-
-    public LocalTime getParsedDelStartTime() {
-        return delStartTime != null ? LocalTime.parse(delStartTime) : null;
-    }
-
-    public LocalTime getParsedDelEndTime() {
-        return delEndTime != null ? LocalTime.parse(delEndTime) : null;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliverySimpleDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliverySimpleDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class DeliverySimpleDto {
-    private Long deliveryId;
-    private String driverName;
-    private Date deliveryDate;
-    private Date deliveryCreatedDate;
-    private Short deliveryStatus;
-    private String deliveryStatusName;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryStartDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryStartDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp.delivery.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class DeliveryStartDto {
-    private Long id;
-    private Integer delStartKm;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatus.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatus.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package mk.ukim.finki.db.distributorapp.deliveryStatus;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.delivery.Delivery;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "delivery_status")
-public class DeliveryStatus {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "d_status_id")
-    private Short deliveryStatusId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "d_status_name", nullable = false)
-    private String deliveryStatusName;
-
-    @NotNull
-    @Column(name = "d_status_desc", nullable = false)
-    private String deliveryStatusDescription;
-
-    @OneToMany(mappedBy = "deliveryStatus")
-    private List<Delivery> deliveries;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package mk.ukim.finki.db.distributorapp.deliveryStatus;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface DeliveryStatusRepository extends JpaRepository<DeliveryStatus, Short> {
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into delivery_status(d_status_name, d_status_desc) " +
-                    "values (?1,?2)"
-    )
-    Integer create(@NonNull String name, @NonNull String description);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update delivery_status " +
-                    "set d_status_name=?2,d_status_desc=?3 " +
-                    "where d_status_id=?1"
-    )
-    Integer edit(@NonNull Short id, @NonNull String name, @NonNull String description);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from delivery_status where d_status_id=?1"
-    )
-    void delete(@NonNull Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.deliveryStatus;
-
-import mk.ukim.finki.db.distributorapp.deliveryStatus.dto.DeliveryStatusDto;
-
-public interface DeliveryStatusService {
-
-    Integer create(DeliveryStatusDto deliveryStatusDto);
-
-    Integer edit(DeliveryStatusDto deliveryStatusDto);
-
-    void deleteById(Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package mk.ukim.finki.db.distributorapp.deliveryStatus;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.deliveryStatus.dto.DeliveryStatusDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class DeliveryStatusServiceImpl implements DeliveryStatusService {
-    private final DeliveryStatusRepository deliveryStatusRepository;
-
-    @Override
-    public Integer create(DeliveryStatusDto deliveryStatusDto) {
-        return this.deliveryStatusRepository.create(
-                deliveryStatusDto.getStatusName(),
-                deliveryStatusDto.getStatusDescription());
-    }
-
-    @Override
-    public Integer edit(DeliveryStatusDto deliveryStatusDto) {
-        return this.deliveryStatusRepository.edit(
-                deliveryStatusDto.getId(),
-                deliveryStatusDto.getStatusName(),
-                deliveryStatusDto.getStatusDescription());
-    }
-
-    @Override
-    public void deleteById(Short id) {
-        this.deliveryStatusRepository.delete(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/dto/DeliveryStatusDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/dto/DeliveryStatusDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.deliveryStatus.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class DeliveryStatusDto {
-    private Short id;
-    private String statusName;
-    private String statusDescription;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package mk.ukim.finki.db.distributorapp.driver;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import mk.ukim.finki.db.distributorapp.users.User;
-import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
-
-@EqualsAndHashCode(callSuper = true)
-@Entity
-@Data
-@Table(name = "driver")
-@DiscriminatorValue("DRIVER")
-@PrimaryKeyJoinColumn(name = "user_id")
-public class Driver extends User {
-    @NotNull
-    @OneToOne
-    @JoinColumn(name = "veh_id", nullable = false)
-    private Vehicle vehicle;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,119 +1,0 @@
-package mk.ukim.finki.db.distributorapp.driver;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface DriverRepository extends JpaRepository<Driver, Long> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into driver(user_id, veh_id) " +
-                    "values (?1,?2)"
-    )
-    Integer create(
-            @NonNull Long usr_id,
-            @NonNull Integer veh_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update driver " +
-                    "set veh_id=?2 " +
-                    "where user_id=?1"
-    )
-    Integer edit(
-            @NonNull Long usr_id,
-            @NonNull Integer veh_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from driver where user_id=?1"
-    )
-    void delete(@NonNull Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select d.user_id as id,
-                           u.user_name as name,
-                           u.user_email as email,
-                           u.user_mobile as phone,
-                           u.user_image as image,
-                           d.veh_id as vehId
-                    from driver d
-                    join users u on d.user_id = u.user_id
-                    where d.user_id = :id
-                    """
-    )
-    DriverDto findDriverById(@NonNull @Param("id") Long id);
-
-    //    ---------------Dashboard queries------------------------------------------
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select del.del_id as deliveryId,
-                           u.user_name as driverName,
-                           del.del_date as deliveryDate,
-                           del.del_date_created as deliveryCreatedDate,
-                           del.d_status_id as deliveryStatus,
-                           ds.d_status_name as deliveryStatusName
-                    from delivery del
-                    join delivery_status ds on del.d_status_id = ds.d_status_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on v.veh_id = d.veh_id
-                    join users u on u.user_id = d.user_id
-                    where d.user_id = ?1 and del.d_status_id = 1
-                    """
-    )
-    List<DeliverySimpleDto> activeAssignedDeliveries(@NonNull Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select del.del_id as deliveryId,
-                           u.user_name as driverName,
-                           del.del_date as deliveryDate,
-                           del.del_date_created as deliveryCreatedDate,
-                           del.d_status_id as deliveryStatus,
-                           ds.d_status_name as deliveryStatusName
-                    from delivery del
-                    join delivery_status ds on del.d_status_id = ds.d_status_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on v.veh_id = d.veh_id
-                    join users u on u.user_id = d.user_id
-                    where d.user_id = ?1 and del.d_status_id not between 1 and 3
-                    """
-    )
-    List<DeliverySimpleDto> finishedAssignedDeliveries(@NonNull Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select del.del_id as deliveryId,
-                           u.user_name as driverName,
-                           del.del_date as deliveryDate,
-                           del.del_date_created as deliveryCreatedDate,
-                           del.d_status_id as deliveryStatus,
-                           ds.d_status_name as deliveryStatusName
-                    from delivery del
-                    join delivery_status ds on del.d_status_id = ds.d_status_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on v.veh_id = d.veh_id
-                    join users u on u.user_id = d.user_id
-                    where d.user_id = ?1 and del.d_status_id = 3
-                    """
-    )
-    List<DeliverySimpleDto> getOngoingDeliveries(@NonNull Long driverId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,29 +1,0 @@
-package mk.ukim.finki.db.distributorapp.driver;
-
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
-import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
-
-import java.util.List;
-
-public interface DriverService {
-
-    DriverDto findById(Long id);
-
-    Integer create(DriverDto driverDto);
-
-    Integer edit(DriverDto driverDto);
-
-    void deleteById(Long id);
-
-    List<DeliverySimpleDto> getNewAssignedDeliveries(Long driverId);
-
-    List<DeliverySimpleDto> getFinishedAssignedDeliveries(Long driverId);
-
-    void startDelivery(DeliveryStartDto delivery);
-
-    List<DeliverySimpleDto> getOngoingDeliveries(Long driverId);
-
-    void endDelivery(DeliveryEndDto delivery);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,86 +1,0 @@
-package mk.ukim.finki.db.distributorapp.driver;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
-import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
-import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
-import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class DriverServiceImpl implements DriverService {
-    private final DriverRepository driverRepository;
-    private final DeliveryService deliveryService;
-
-    @Override
-    public DriverDto findById(Long id) {
-        return this.driverRepository.findDriverById(id);
-    }
-
-    @Override
-    public Integer create(DriverDto driverDto) {
-        return this.driverRepository.create(
-                driverDto.getId(),
-                driverDto.getVehId());
-    }
-
-    @Override
-    public Integer edit(DriverDto driverDto) {
-        return this.driverRepository.edit(
-                driverDto.getId(),
-                driverDto.getVehId()
-        );
-    }
-
-    @Override
-    public void deleteById(Long id) {
-        this.driverRepository.deleteById(id);
-    }
-
-    @Override
-    public List<DeliverySimpleDto> getNewAssignedDeliveries(Long driverId) {
-        return this.driverRepository.activeAssignedDeliveries(driverId);
-    }
-
-    @Override
-    public List<DeliverySimpleDto> getFinishedAssignedDeliveries(Long driverId) {
-        return this.driverRepository.finishedAssignedDeliveries(driverId);
-    }
-
-    @Override
-    public List<DeliverySimpleDto> getOngoingDeliveries(Long driverId) {
-        return this.driverRepository.getOngoingDeliveries(driverId);
-    }
-
-    @Override
-    @Transactional
-    public void startDelivery(DeliveryStartDto delivery) {
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
-
-        DeliveryFullDto deliveryDto = this.deliveryService.findDeliveryById(delivery.getId());
-        deliveryDto.setDelStartKm(delivery.getDelStartKm());
-        deliveryDto.setDelStartTime(LocalTime.now().format(formatter));
-        deliveryDto.setDelStatusId((short) 3);
-        this.deliveryService.edit(deliveryDto);
-    }
-
-    @Override
-    @Transactional
-    public void endDelivery(DeliveryEndDto delivery) {
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
-
-        DeliveryFullDto deliveryDto = this.deliveryService.findDeliveryById(delivery.getId());
-        deliveryDto.setDelEndKm(delivery.getDelEndKm());
-        deliveryDto.setDelEndTime(LocalTime.now().format(formatter));
-        deliveryDto.setDelStatusId((short) 4);
-        this.deliveryService.edit(deliveryDto);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/CreateDriverDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/CreateDriverDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package mk.ukim.finki.db.distributorapp.driver.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CreateDriverDto {
-    private String name;
-    private String surname;
-    private String password;
-    private String repeatedPassword;
-    private String email;
-    private String mobile;
-    private String profileImage;
-    private Integer city;
-    private Integer vehicle;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/DriverDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/DriverDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.driver.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class DriverDto {
-    private Long id;
-    private String name;
-    private String email;
-    private String phone;
-    private String image;
-    private Integer vehId;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,21 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manager;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import mk.ukim.finki.db.distributorapp.users.User;
-import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
-
-@EqualsAndHashCode(callSuper = true)
-@Entity
-@Data
-@Table(name = "manager")
-@DiscriminatorValue("MANAGER")
-@PrimaryKeyJoinColumn(name = "user_id")
-public class Manager extends User {
-    @NotNull
-    @OneToOne
-    @JoinColumn(name = "wh_id", nullable = false, unique = true)
-    private Warehouse warehouse;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,40 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manager;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface ManagerRepository extends JpaRepository<Manager, Integer> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into manager(user_id, wh_id) " +
-                    "values (?1,?2)"
-    )
-    Integer create(
-            @NonNull Long id,
-            @NonNull Integer whId);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update manager " +
-                    "set wh_id=?2 " +
-                    "where user_id=?1"
-    )
-    Integer edit(
-            @NonNull Long id,
-            @NonNull Integer whId);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from manager where user_id=?1"
-    )
-    void delete(@NonNull Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manager;
-
-import mk.ukim.finki.db.distributorapp.manager.dto.ManagerDto;
-
-public interface ManagerService {
-
-    Integer create(ManagerDto managerDto);
-
-    Integer edit(ManagerDto managerDto);
-
-    void deleteById(Long id);
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manager;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.manager.dto.ManagerDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class ManagerServiceImpl implements ManagerService {
-    private final ManagerRepository managerRepository;
-
-    @Override
-    public Integer create(ManagerDto managerDto) {
-        return this.managerRepository.create(
-                managerDto.getId(),
-                managerDto.getWhId()
-        );
-    }
-
-    @Override
-    public Integer edit(ManagerDto managerDto) {
-        return this.managerRepository.edit(
-                managerDto.getId(),
-                managerDto.getWhId()
-        );
-    }
-
-    @Override
-    public void deleteById(Long id) {
-        this.managerRepository.delete(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/CreateManagerDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/CreateManagerDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manager.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CreateManagerDto {
-    private String name;
-    private String surname;
-    private String password;
-    private String repeatedPassword;
-    private String email;
-    private String mobile;
-    private String profileImage;
-    private Integer city;
-    private Integer warehouseId;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/ManagerDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/ManagerDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manager.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ManagerDto {
-    private Long id;
-    private String name;
-    private String email;
-    private String phone;
-    private String image;
-    private Integer whId;
-    private String whRegion;
-    private String whCity;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/Manufacturer.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/Manufacturer.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,42 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manufacturer;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.article.Article;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "manufacturer")
-public class Manufacturer {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "man_id")
-    private Long manufacturerId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "man_name", nullable = false)
-    private String manufacturerName;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "man_adr", nullable = false)
-    private String manufacturerAddress;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "man_mobile", nullable = false)
-    private String manufacturerMobile;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "man_email", nullable = false)
-    private String manufacturerEmail;
-
-    @OneToMany(mappedBy = "manufacturer")
-    private List<Article> articles;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,65 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manufacturer;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface ManufacturerRepository extends JpaRepository<Manufacturer, Long> {
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select m.man_id as id,
-                           m.man_name as name,
-                           m.man_adr as address,
-                           m.man_mobile as phone,
-                           m.man_email as email
-                    from manufacturer m
-                    """
-    )
-    List<ManufacturerDto> listAll();
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into manufacturer(man_name, man_adr, man_mobile, man_email)
-                    values (?1,?2,?3,?4)
-                    """
-    )
-    Integer create(
-            @NonNull String name,
-            @NonNull String address,
-            @NonNull String mobile,
-            @NonNull String email);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    update manufacturer
-                    set man_name=?2,man_adr=?3,man_mobile=?4,man_email=?5
-                    where man_id=?1
-                    """
-    )
-    Integer edit(
-            @NonNull Long id,
-            @NonNull String name,
-            @NonNull String address,
-            @NonNull String mobile,
-            @NonNull String email);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from manufacturer where man_id=?1"
-    )
-    void delete(@NonNull Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manufacturer;
-
-import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
-
-import java.util.List;
-
-public interface ManufacturerService {
-    List<ManufacturerDto> getAllManufacturers();
-
-    Integer create(ManufacturerDto manufacturerDto);
-
-    Integer edit(ManufacturerDto manufacturerDto);
-
-    void deleteById(Long id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,42 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manufacturer;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class ManufacturerServiceImpl implements ManufacturerService {
-    private final ManufacturerRepository manufacturerRepository;
-
-    @Override
-    public List<ManufacturerDto> getAllManufacturers() {
-        return this.manufacturerRepository.listAll();
-    }
-
-    @Override
-    public Integer create(ManufacturerDto manufacturerDto) {
-        return this.manufacturerRepository.create(
-                manufacturerDto.getName(),
-                manufacturerDto.getAddress(),
-                manufacturerDto.getPhone(),
-                manufacturerDto.getEmail());
-    }
-
-    @Override
-    public Integer edit(ManufacturerDto manufacturerDto) {
-        return this.manufacturerRepository.edit(
-                manufacturerDto.getId(),
-                manufacturerDto.getName(),
-                manufacturerDto.getAddress(),
-                manufacturerDto.getPhone(),
-                manufacturerDto.getEmail());
-    }
-
-    @Override
-    public void deleteById(Long id) {
-
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/dto/ManufacturerDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/dto/ManufacturerDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,14 +1,0 @@
-package mk.ukim.finki.db.distributorapp.manufacturer.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class ManufacturerDto {
-    private Long id;
-    private String name;
-    private String address;
-    private String phone;
-    private String email;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/Orders.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/Orders.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,59 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
-import mk.ukim.finki.db.distributorapp.customer.Customer;
-import mk.ukim.finki.db.distributorapp.delivery.Delivery;
-import mk.ukim.finki.db.distributorapp.orderStatus.OrderStatus;
-import mk.ukim.finki.db.distributorapp.proForma.ProForma;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "orders")
-public class Orders {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "ord_id", nullable = false)
-    private Long orderId;
-
-    @NotNull
-    @Column(name = "ord_date", nullable = false)
-    private LocalDate orderDate;
-
-    @NotNull
-    @Column(name = "ord_sum", nullable = false)
-    private Integer orderSum;
-
-    @Column(name = "ord_fulfillment_date")
-    private LocalDateTime orderFulfillmentDate;
-
-    @Column(name = "ord_comment")
-    private String orderComment;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "o_status_id", nullable = false)
-    private OrderStatus orderStatus;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "cust_id", nullable = false)
-    private Customer customer;
-
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "del_id", nullable = false)
-    private Delivery delivery;
-
-    @OneToOne
-    @JoinColumn(name = "pf_id", nullable = false, unique = true)
-    private ProForma proForma;
-
-    @OneToMany(mappedBy = "order")
-    private List<ArticleUnit> articleUnits;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,241 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderManagerDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrdersDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.List;
-
-public interface OrdersRepository extends JpaRepository<Orders, Long> {
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select o.ord_id as id,
-                           o.ord_date as ordDate,
-                           o.ord_sum as ordSum,
-                           o.ord_fulfillment_date as ordFulfillmentDate,
-                           o.ord_comment as ordComment,
-                           o.o_status_id as oStatusId,
-                           os.o_status_name as statusName,
-                           o.cust_id as customerId,
-                           c.cust_company_name as customerName,
-                           u.user_mobile as customerPhone,
-                           u.user_email as customerEmail,
-                           o.del_id as deliveryId,
-                           d.user_id as driverId,
-                           u1.user_name as driverName,
-                           u1.user_mobile as driverPhone,
-                           u1.user_email as driverEmail,
-                           o.pf_id as pfId,
-                           pfs.pf_status_name as pfStatus
-                    from orders o
-                    join order_status os on o.o_status_id = os.o_status_id
-                    join customer c on c.user_id=o.cust_id
-                    join users u on c.user_id=u.user_id
-                    join delivery del on o.del_id = del.del_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on d.veh_id=v.veh_id
-                    join users u1 on d.user_id=u1.user_id
-                    join pro_forma pf on o.pf_id = pf.pf_id
-                    join pro_forma_status pfs on pfs.pf_status_id=pf.pf_status_id
-                    """
-    )
-    List<OrdersDto> listAll();
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select o.ord_id as id,
-                           o.ord_date as ordDate,
-                           o.ord_sum as ordSum,
-                           o.ord_fulfillment_date as ordFulfillmentDate,
-                           o.ord_comment as ordComment,
-                           o.o_status_id as oStatusId,
-                           os.o_status_name as statusName,
-                           o.cust_id as customerId,
-                           c.cust_company_name as customerName,
-                           u.user_mobile as customerPhone,
-                           u.user_email as customerEmail,
-                           del.del_id as deliveryId,
-                           d.user_id as driverId,
-                           u1.user_name as driverName,
-                           u1.user_mobile as driverPhone,
-                           u1.user_email as driverEmail,
-                           pf.pf_id as pfId,
-                           pfs.pf_status_name as pfStatus
-                    from orders o
-                    join order_status os on o.o_status_id = os.o_status_id
-                    join customer c on o.cust_id = c.user_id
-                    join users u on c.user_id = u.user_id
-                    join delivery del on o.del_id = del.del_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on d.veh_id=v.veh_id
-                    join users u1 on d.user_id=u1.user_id
-                    join pro_forma pf on o.pf_id = pf.pf_id
-                    join pro_forma_status pfs on pfs.pf_status_id=pf.pf_status_id
-                    where o.cust_id = ?1
-                    """
-    )
-    List<OrdersDto> findOrdersByCustomer(@NonNull Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select o.ord_id as id,
-                           o.ord_date as ordDate,
-                           o.ord_sum as ordSum,
-                           o.ord_fulfillment_date as ordFulfillmentDate,
-                           o.ord_comment as ordComment,
-                           o.o_status_id as oStatusId,
-                           o.cust_id as customerId,
-                           o.del_id as deliveryId,
-                           o.pf_id as pfId
-                    from orders o
-                    where o.cust_id = ?1
-                    """
-    )
-    List<OrderSimpleDto> findSimpleOrdersByCustomer(@NonNull Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = "select * from orders where ord_id=?1"
-    )
-    OrdersDto findOrderById(@NonNull Long id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into orders (ord_date, ord_sum, ord_fulfillment_date, ord_comment, o_status_id, cust_id, del_id, pf_id)
-                    values (?1,?2,?3,?4,?5,?6,?7,?8)
-                    """
-    )
-    Integer create(
-            @NonNull LocalDate ord_date,
-            @NonNull Integer ord_sum,
-            LocalDateTime ord_fulfillment_date,
-            String ord_comment,
-            @NonNull Short ord_status_id,
-            @NonNull Long cust_id,
-            Long del_id,
-            Long pf_id
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    update orders
-                    set ord_date=?2,ord_sum=?3,ord_fulfillment_date=?4,ord_comment=?5,o_status_id=?6,cust_id=?7,del_id=?8,pf_id=?9
-                    where ord_id=?1
-                    """
-    )
-    Integer edit(
-            @NonNull Long id,
-            @NonNull LocalDate ord_date,
-            @NonNull Integer ord_sum,
-            LocalDateTime ord_fulfillment_date,
-            String ord_comment,
-            @NonNull Short ord_status_id,
-            @NonNull Long cust_id,
-            @NonNull Long del_id,
-            @NonNull Long pf_id
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from orders where ord_id=?1"
-    )
-    void delete(@NonNull Long id);
-    //----------------------------------------------------------------------------------------------------------------------------------
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select o.ord_id as id,
-                           o.ord_date as ordDate,
-                           o.ord_sum as ordSum,
-                           o.ord_fulfillment_date as ordFulfillmentDate,
-                           o.ord_comment as ordComment,
-                           o.o_status_id as oStatusId,
-                           os.o_status_name as statusName,
-                           o.cust_id as customerId,
-                           c.cust_company_name as customerName,
-                           u.user_mobile as customerPhone,
-                           u.user_email as customerEmail,
-                           o.del_id as deliveryId,
-                           d.user_id as driverId,
-                           u1.user_name as driverName,
-                           u1.user_mobile as driverPhone,
-                           u1.user_email as driverEmail,
-                           o.pf_id as pfId,
-                           pfs.pf_status_name as pfStatus
-                    from orders o
-                    join order_status os on o.o_status_id = os.o_status_id
-                    join customer c on c.user_id=o.cust_id
-                    join users u on c.user_id=u.user_id
-                    join delivery del on o.del_id = del.del_id
-                    join vehicle v on del.veh_id = v.veh_id
-                    join driver d on d.veh_id=v.veh_id
-                    join users u1 on d.user_id=u1.user_id
-                    join pro_forma pf on o.pf_id = pf.pf_id
-                    join pro_forma_status pfs on pfs.pf_status_id=pf.pf_status_id
-                    where o.cust_id=:customer and o.o_status_id between 2 and 6
-                    """
-    )
-    List<OrdersDto> getCurrentOrdersByCustomer(@NonNull @Param("customer") Long customer_id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select o.ord_id as id,
-                           o.ord_date as ordDate,
-                           o.ord_sum as ordSum,
-                           o.ord_fulfillment_date as ordFulfillmentDate,
-                           c.cust_company_name as customerName,
-                           o.ord_comment as ordComment,
-                           o.o_status_id as oStatusId,
-                           o.cust_id as customerId,
-                           o.del_id as deliveryId,
-                           o.pf_id as pfId
-                    from warehouse w
-                        join manager m on w.wh_id= m.wh_id
-                        join article_unit au on au.wh_id = w.wh_id
-                        join orders o on au.ord_id = o.ord_id
-                        join customer c on o.cust_id = c.user_id
-                        join order_status os on os.o_status_id = o.o_status_id
-                    where m.user_id = ?1
-                    """
-    )
-    List<OrderManagerDto> getNewOrdersByManager(@NonNull Long manager_id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select o.ord_id as id,
-                           o.ord_date as ordDate,
-                           o.ord_sum as ordSum,
-                           o.ord_fulfillment_date as ordFulfillmentDate,
-                           o.ord_comment as ordComment,
-                           o.o_status_id as oStatusId,
-                           o.cust_id as customerId,
-                           o.del_id as deliveryId,
-                           o.pf_id as pfId
-                    from orders o
-                    where o.ord_id = ?1
-                    """
-    )
-    OrderSimpleDto findSimpleOrdersById(Long orderId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,30 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order;
-
-import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderManagerDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrdersDto;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.security.Principal;
-import java.util.List;
-
-public interface OrdersService {
-
-    List<OrderSimpleDto> findSimpleOrdersByCustomer(Long customerId);
-
-    OrdersDto findById(Long id);
-
-    @Transactional
-    Integer create(CreateOrderDto createOrderDto, Principal principal);
-
-    Integer edit(OrdersDto ordersDto);
-
-    void deleteById(Long id);
-
-    List<OrdersDto> findCurrentOrdersByCustomer(Long customerId);
-
-    List<OrderManagerDto> getNewOrdersByManager(Long managerId);
-
-    void addOrdersToDelivery(List<Long> orderIds, Long deliveryId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,135 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
-import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderManagerDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
-import mk.ukim.finki.db.distributorapp.order.dto.OrdersDto;
-import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
-import mk.ukim.finki.db.distributorapp.customer.CustomerService;
-import mk.ukim.finki.db.distributorapp.proForma.ProFormaService;
-import mk.ukim.finki.db.distributorapp.users.UserService;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.security.Principal;
-import java.time.LocalDate;
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class OrdersServiceImpl implements OrdersService {
-    private final OrdersRepository ordersRepository;
-    private final UserService userService;
-    private final CustomerService customerService;
-    private final ProFormaService proFormaService;
-
-    @Override
-    public List<OrderSimpleDto> findSimpleOrdersByCustomer(Long customerId) {
-        return this.ordersRepository.findSimpleOrdersByCustomer(customerId);
-    }
-
-    @Override
-    public OrdersDto findById(Long id) {
-        return this.ordersRepository.findOrderById(id);
-    }
-
-    @Override
-    @Transactional
-    public Integer create(CreateOrderDto createOrderDto, Principal principal) {
-        String userEmail = principal.getName();
-        UserDto user = this.userService.findUserDtoByEmail(userEmail);
-        CustomerDto customer = this.customerService.findCustomerById(user.getId());
-
-        OrdersDto order = new OrdersDto();
-
-        if (createOrderDto.isProForma()) {
-            ProFormaDto pf = new ProFormaDto();
-            pf.setPfDeadline(LocalDate.now().plusWeeks(1));
-            pf.setPfDateCreated(LocalDate.now());
-            pf.setStatusId((short) 1);
-            this.proFormaService.create(pf);
-            List<ProFormaDto> proFormaList = this.proFormaService.getAllProForma();
-            ProFormaDto createdProForma = proFormaList.get(proFormaList.size() - 1);
-            order.setPfId(createdProForma.getId());
-        }
-
-        order.setCustomerId(customer.getId());
-        order.setOrdDate(LocalDate.now());
-        order.setOrdFulfillmentDate(null);
-        order.setOStatusId((short) 1);
-        order.setDeliveryId(null);
-        order.setPfId(null);
-        order.setOrdComment(null);
-
-        Integer sum = createOrderDto.getOrderItems()
-                .stream()
-                .map(i -> i.getUnitPrice().multiply(BigDecimal.valueOf(i.getQuantity())))
-                .reduce(BigDecimal.ZERO, BigDecimal::add)
-                .intValue();
-        order.setOrdSum(sum);
-
-        return this.ordersRepository.create(
-                order.getOrdDate(),
-                order.getOrdSum(),
-                order.getOrdFulfillmentDate(),
-                order.getOrdComment(),
-                order.getOStatusId(),
-                order.getCustomerId(),
-                order.getDeliveryId(),
-                order.getPfId()
-        );
-    }
-
-    @Override
-    public Integer edit(OrdersDto ordersDto) {
-        return this.ordersRepository.edit(
-                ordersDto.getId(),
-                ordersDto.getOrdDate(),
-                ordersDto.getOrdSum(),
-                ordersDto.getOrdFulfillmentDate(),
-                ordersDto.getOrdComment(),
-                ordersDto.getOStatusId(),
-                ordersDto.getCustomerId(),
-                ordersDto.getDeliveryId(),
-                ordersDto.getPfId()
-        );
-    }
-
-    @Override
-    public void deleteById(Long id) {
-        this.ordersRepository.deleteById(id);
-    }
-
-    @Override
-    public List<OrdersDto> findCurrentOrdersByCustomer(Long customerId) {
-        return this.ordersRepository.getCurrentOrdersByCustomer(customerId);
-    }
-
-    @Override
-    public List<OrderManagerDto> getNewOrdersByManager(Long managerId) {
-        return this.ordersRepository.getNewOrdersByManager(managerId);
-    }
-
-    @Override
-    public void addOrdersToDelivery(List<Long> orderIds, Long deliveryId) {
-        for (Long i : orderIds) {
-            OrderSimpleDto order = this.ordersRepository.findSimpleOrdersById(i);
-            order.setDeliveryId(deliveryId);
-            this.ordersRepository.edit(
-                    order.getId(),
-                    order.getOrdDate().toLocalDate(),
-                    order.getOrdSum(),
-                    order.getOrdFulfillmentDate(),
-                    order.getOrdComment(),
-                    order.getOStatusId(),
-                    order.getCustomerId(),
-                    order.getDeliveryId(),
-                    order.getPfId()
-            );
-        }
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/CreateOrderDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/CreateOrderDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,15 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.util.List;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class CreateOrderDto {
-    private List<OrderItemDto> orderItems;
-    boolean proForma;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderItemDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderItemDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,18 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.math.BigDecimal;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class OrderItemDto {
-    private Long articleId;
-    private String articleName;
-    private String manufacturerName;
-    private BigDecimal unitPrice;
-    private Integer quantity;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderManagerDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderManagerDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class OrderManagerDto {
-    private Long id;
-    private java.sql.Date ordDate;
-    private Integer ordSum;
-    private LocalDateTime ordFulfillmentDate;
-    private String customerName;
-    private String ordComment;
-    private Short oStatusId;
-    private Long customerId;
-    private Long deliveryId;
-    private Long pfId;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderSimpleDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderSimpleDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,22 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class OrderSimpleDto {
-    private Long id;
-    private java.sql.Date ordDate;
-    private Integer ordSum;
-    private LocalDateTime ordFulfillmentDate;
-    private String ordComment;
-    private Short oStatusId;
-    private Long customerId;
-    private Long deliveryId;
-    private Long pfId;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrdersDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrdersDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,32 +1,0 @@
-package mk.ukim.finki.db.distributorapp.order.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class OrdersDto {
-    private Long id;
-    private LocalDate ordDate;
-    private Integer ordSum;
-    private LocalDateTime ordFulfillmentDate;
-    private String ordComment;
-    private Short oStatusId;
-    private String statusName;
-    private Long customerId;
-    private String customerName;
-    private String customerPhone;
-    private String customerEmail;
-    private Long deliveryId;
-    private Long driverId;
-    private String driverName;
-    private String driverPhone;
-    private String driverEmail;
-    private Long pfId;
-    private String pfStatus;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatus.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatus.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package mk.ukim.finki.db.distributorapp.orderStatus;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.order.Orders;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "order_status", schema = "IND0_185022")
-public class OrderStatus {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "o_status_id")
-    private Short orderStatusId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "o_status_name", nullable = false)
-    private String orderStatusName;
-
-    @NotNull
-    @Column(name = "o_status_desc", nullable = false)
-    private String orderStatusDescription;
-
-    @OneToMany(mappedBy = "orderStatus")
-    private List<Orders> orders;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,36 +1,0 @@
-package mk.ukim.finki.db.distributorapp.orderStatus;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface OrderStatusRepository extends JpaRepository<OrderStatus, Short> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into order_status(o_status_name, o_status_desc) " +
-                    "values (?1,?2)"
-    )
-    Integer create(@NonNull String name, @NonNull String description);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update order_status " +
-                    "set o_status_name=?2,o_status_desc=?3 " +
-                    "where o_status_id=?1"
-    )
-    Integer edit(@NonNull Short id, @NonNull String name, @NonNull String description);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from order_status where o_status_id=?1"
-    )
-    void delete(@NonNull Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.orderStatus;
-
-import mk.ukim.finki.db.distributorapp.orderStatus.dto.OrderStatusDto;
-
-public interface OrderStatusService {
-
-    Integer create(OrderStatusDto orderStatusDto);
-
-    Integer edit(OrderStatusDto orderStatusDto);
-
-    void deleteById(Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,33 +1,0 @@
-package mk.ukim.finki.db.distributorapp.orderStatus;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.orderStatus.dto.OrderStatusDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class OrderStatusServiceImpl implements OrderStatusService {
-    private final OrderStatusRepository orderStatusRepository;
-
-    @Override
-    public Integer create(OrderStatusDto orderStatusDto) {
-        return this.orderStatusRepository.create(
-                orderStatusDto.getStatusName(),
-                orderStatusDto.getStatusDescription()
-        );
-    }
-
-    @Override
-    public Integer edit(OrderStatusDto orderStatusDto) {
-        return this.orderStatusRepository.edit(
-                orderStatusDto.getId(),
-                orderStatusDto.getStatusName(),
-                orderStatusDto.getStatusDescription()
-        );
-    }
-
-    @Override
-    public void deleteById(Short id) {
-        this.orderStatusRepository.deleteById(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/dto/OrderStatusDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/dto/OrderStatusDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.orderStatus.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class OrderStatusDto {
-    private Short id;
-    private String statusName;
-    private String statusDescription;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/price/Price.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/price/Price.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,43 +1,0 @@
-package mk.ukim.finki.db.distributorapp.price;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.article.Article;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
-import org.hibernate.annotations.ColumnDefault;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-@Entity
-@Data
-@Table(name = "price")
-public class Price {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "price_id")
-    private Integer priceId;
-
-    @NotNull
-    @Column(name = "price", nullable = false)
-    private BigDecimal price;
-
-    @NotNull
-    @ColumnDefault("CURRENT_TIMESTAMP")
-    @Column(name = "price_eff_date", nullable = false)
-    private LocalDateTime priceEffectiveDate;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "art_id", nullable = false)
-    private Article article;
-
-    @ManyToMany
-    @JoinTable(name = "unit_price",
-            joinColumns = @JoinColumn(name = "price_id"),
-            inverseJoinColumns = @JoinColumn(name = "unit_id"))
-    private Set<ArticleUnit> articleUnits = new LinkedHashSet<>();
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/price/PriceRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/price/PriceRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,46 +1,0 @@
-package mk.ukim.finki.db.distributorapp.price;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
-public interface PriceRepository extends JpaRepository<Price, Integer> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into price(price, price_eff_date, art_id) " +
-                    "values (?1,?2,?3)"
-    )
-    Integer create(
-            @NonNull BigDecimal price,
-            @NonNull LocalDateTime price_eff_date,
-            @NonNull Long art_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update price " +
-                    "set price=?2,price_eff_date=?3,art_id=?4 " +
-                    "where price_id=?1"
-    )
-    Integer edit(
-            @NonNull Integer id,
-            @NonNull BigDecimal price,
-            @NonNull LocalDateTime price_eff_date,
-            @NonNull Long art_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from price where price_id=?1"
-    )
-    void delete(@NonNull Integer id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/price/PriceService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/price/PriceService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-package mk.ukim.finki.db.distributorapp.price;
-
-import mk.ukim.finki.db.distributorapp.price.dto.PriceDto;
-
-public interface PriceService {
-
-    Integer create(PriceDto priceDto);
-
-    Integer edit(PriceDto priceDto);
-
-    void deleteById(Integer id);
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/price/PriceServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/price/PriceServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,35 +1,0 @@
-package mk.ukim.finki.db.distributorapp.price;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.price.dto.PriceDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class PriceServiceImpl implements PriceService {
-    private final PriceRepository priceRepository;
-
-    @Override
-    public Integer create(PriceDto priceDto) {
-        return this.priceRepository.create(
-                priceDto.getPrice(),
-                priceDto.getDateEffective(),
-                priceDto.getArtId()
-        );
-    }
-
-    @Override
-    public Integer edit(PriceDto priceDto) {
-        return this.priceRepository.edit(
-                priceDto.getId(),
-                priceDto.getPrice(),
-                priceDto.getDateEffective(),
-                priceDto.getArtId()
-        );
-    }
-
-    @Override
-    public void deleteById(Integer id) {
-        this.priceRepository.delete(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/price/dto/PriceDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/price/dto/PriceDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.price.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
-@Data
-@AllArgsConstructor
-public class PriceDto {
-    private Integer id;
-    private BigDecimal price;
-    private LocalDateTime dateEffective;
-    private Long artId;
-    private String artName;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProForma.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProForma.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,35 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proForma;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.proFormaStatus.ProFormaStatus;
-import mk.ukim.finki.db.distributorapp.order.Orders;
-
-import java.time.LocalDate;
-
-@Entity
-@Data
-@Table(name = "pro_forma")
-public class ProForma {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "pf_id")
-    private Long proFormaId;
-
-    @NotNull
-    @Column(name = "pf_deadline", nullable = false)
-    private LocalDate proFormaDeadline;
-
-    @NotNull
-    @Column(name = "pf_date_created", nullable = false)
-    private LocalDate proFormaDateCreated;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "pf_status_id", nullable = false)
-    private ProFormaStatus proFormaStatus;
-
-    @OneToOne(mappedBy = "proForma")
-    private Orders order;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,94 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proForma;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalDate;
-import java.util.List;
-
-public interface ProFormaRepository extends JpaRepository<ProForma, Long> {
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select pf.pf_id as id,
-                           pf.pf_deadline as pfDeadline,
-                           pf.pf_date_created as pfDateCreated,
-                           pf.pf_status_id as statusId,
-                           pfs.pf_status_name as statusName,
-                           o.ord_id as ordId,
-                           o.cust_id as customerId,
-                           c.cust_company_name as customerName,
-                           u.user_email as customerEmail,
-                           u.user_mobile as customerPhone
-                    from pro_forma pf
-                    join pro_forma_status pfs on pf.pf_status_id = pfs.pf_status_id
-                    join orders o on pf.pf_id = o.pf_id
-                    join customer c on o.cust_id = c.user_id
-                    join users u on c.user_id = u.user_id
-                    """
-    )
-    List<ProFormaDto> listAll();
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into pro_forma(pf_deadline, pf_date_created, pf_status_id)
-                    values (?1,?2,?3)
-                    """
-    )
-    Integer create(
-            @NonNull LocalDate pf_deadline,
-            @NonNull LocalDate pf_create_date,
-            @NonNull Short pf_status_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update pro_forma " +
-                    "set pf_deadline=?2,pf_date_created=?3,pf_status_id=?4 " +
-                    "where pf_id=?1"
-    )
-    Integer edit(
-            @NonNull Long pf_id,
-            @NonNull LocalDate pf_deadline,
-            @NonNull LocalDate pf_create_date,
-            @NonNull Short pf_status_id);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from pro_forma where pf_id=?1"
-    )
-    void delete(@NonNull Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select pf.pf_id as id,
-                           pf_deadline as pfDeadline,
-                           pf_date_created as pfDateCreated,
-                           pfs.pf_status_id as statusId,
-                           pfs.pf_status_name as statusName,
-                           o.ord_id as ordId,
-                           c.user_id as customerId,
-                           c.cust_company_name as customerName,
-                           u.user_email as customerEmail,
-                           u.user_mobile as customerPhone
-                    from pro_forma pf
-                    join pro_forma_status pfs on pf.pf_status_id=pfs.pf_status_id
-                    join orders o on pf.pf_id = o.pf_id
-                    join customer c on o.cust_id = c.user_id
-                    join users u on c.user_id = u.user_id
-                    where c.user_id = ?1
-                    """
-    )
-    List<ProFormaDto> getCurrentProFormasByCustomer(Long customerId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proForma;
-
-import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface ProFormaService {
-    @Transactional
-    List<ProFormaDto> getAllProForma();
-
-    Integer create(ProFormaDto proFormaDto);
-
-    Integer edit(ProFormaDto proFormaDto);
-
-    void deleteById(Long id);
-
-    List<ProFormaDto> getCurentProFormasByCustomer(Long customerId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,49 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proForma;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class ProFormaServiceImpl implements ProFormaService {
-    private final ProFormaRepository proFormaRepository;
-
-    @Override
-    @Transactional
-    public List<ProFormaDto> getAllProForma() {
-        return this.proFormaRepository.listAll();
-    }
-
-    @Override
-    public Integer create(ProFormaDto proFormaDto) {
-        return this.proFormaRepository.create(
-                proFormaDto.getPfDeadline(),
-                proFormaDto.getPfDateCreated(),
-                proFormaDto.getStatusId()
-        );
-    }
-
-    @Override
-    public Integer edit(ProFormaDto proFormaDto) {
-        return this.proFormaRepository.edit(
-                proFormaDto.getId(),
-                proFormaDto.getPfDeadline(),
-                proFormaDto.getPfDateCreated(),
-                proFormaDto.getStatusId()
-        );
-    }
-
-    @Override
-    public void deleteById(Long id) {
-        this.proFormaRepository.deleteById(id);
-    }
-
-    @Override
-    public List<ProFormaDto> getCurentProFormasByCustomer(Long customerId) {
-        return this.proFormaRepository.getCurrentProFormasByCustomer(customerId);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/dto/ProFormaDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proForma/dto/ProFormaDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proForma.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDate;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class ProFormaDto {
-    private Long id;
-    private LocalDate pfDeadline;
-    private LocalDate pfDateCreated;
-    private Short statusId;
-    private String statusName;
-    private Long ordId;
-    private Long customerId;
-    private String customerName;
-    private String customerEmail;
-    private String customerPhone;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatus.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatus.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proFormaStatus;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.proForma.ProForma;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "pro_forma_status", schema = "IND0_185022")
-public class ProFormaStatus {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "pf_status_id")
-    private Short proFormaStatusId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "pf_status_name", nullable = false)
-    private String proFormaStatusName;
-
-    @NotNull
-    @Column(name = "pf_status_desc", nullable = false)
-    private String proFormaStatusDescription;
-
-    @OneToMany(mappedBy = "proFormaStatus")
-    private List<ProForma> pro_formas;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,36 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proFormaStatus;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface ProFormaStatusRepository extends JpaRepository<ProFormaStatus, Short> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into pro_forma_status(pf_status_name, pf_status_desc) " +
-                    "values (?1,?2)"
-    )
-    Integer create(@NonNull String name, @NonNull String description);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update pro_forma_status " +
-                    "set pf_status_name=?2,pf_status_desc=?3 " +
-                    "where pf_status_id=?1"
-    )
-    Integer edit(@NonNull Short id, @NonNull String name, @NonNull String description);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from pro_forma_status where pf_status_id=?1"
-    )
-    void delete(@NonNull Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proFormaStatus;
-
-import mk.ukim.finki.db.distributorapp.proFormaStatus.dto.ProFormaStatusDto;
-
-public interface ProFormaStatusService {
-
-    Integer create(ProFormaStatusDto proFormaStatusDto);
-
-    Integer edit(ProFormaStatusDto proFormaStatusDto);
-
-    void deleteById(Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,33 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proFormaStatus;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.proFormaStatus.dto.ProFormaStatusDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class ProFormaStatusServiceImpl implements ProFormaStatusService {
-    private final ProFormaStatusRepository proFormaStatusRepository;
-
-    @Override
-    public Integer create(ProFormaStatusDto proFormaStatusDto) {
-        return this.proFormaStatusRepository.create(
-                proFormaStatusDto.getStatusName(),
-                proFormaStatusDto.getStatusDescription()
-        );
-    }
-
-    @Override
-    public Integer edit(ProFormaStatusDto proFormaStatusDto) {
-        return this.proFormaStatusRepository.edit(
-                proFormaStatusDto.getId(),
-                proFormaStatusDto.getStatusName(),
-                proFormaStatusDto.getStatusDescription()
-        );
-    }
-
-    @Override
-    public void deleteById(Short id) {
-        this.proFormaStatusRepository.deleteById(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/dto/ProFormaStatusDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/dto/ProFormaStatusDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.proFormaStatus.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class ProFormaStatusDto {
-    private Short id;
-    private String statusName;
-    private String statusDescription;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/region/Region.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/region/Region.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package mk.ukim.finki.db.distributorapp.region;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.city.City;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "region")
-public class Region {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "region_id", nullable = false)
-    private Integer regionId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "region_name", nullable = false)
-    private String regionName;
-
-    @OneToMany(mappedBy = "region")
-    private List<City> cities;
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/region/RegionRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/region/RegionRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,54 +1,0 @@
-package mk.ukim.finki.db.distributorapp.region;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.region.dto.RegionDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface RegionRepository extends JpaRepository<Region, Integer> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into region(region_name) " +
-                    "values (?1)"
-    )
-    Integer create(
-            @NonNull String name);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update region " +
-                    "set region_name=?2 " +
-                    "where region_id=?1"
-    )
-    Integer edit(
-            @NonNull Integer id,
-            @NonNull String name);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from region " +
-                    "where region_id=?1"
-    )
-    void deleteById(@NonNull Integer id);
-
-//    -------------------------------------------------------------------------
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select r.region_id as id, r.region_name as name
-                    from region r join city c on r.region_id = c.region_id
-                    where c.city_id = :city
-                    """
-    )
-    RegionDto getRegionByCityId(@NonNull @Param("city") Integer cityId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/region/RegionService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/region/RegionService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.region;
-
-import mk.ukim.finki.db.distributorapp.region.dto.RegionDto;
-
-public interface RegionService {
-
-    Integer create(RegionDto regionDto);
-
-    Integer edit(RegionDto regionDto);
-
-    void deleteById(Integer id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/region/RegionServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/region/RegionServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package mk.ukim.finki.db.distributorapp.region;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.region.dto.RegionDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class RegionServiceImpl implements RegionService {
-    private final RegionRepository regionRepository;
-
-    @Override
-    public Integer create(RegionDto regionDto) {
-        return this.regionRepository.create(
-                regionDto.getName()
-        );
-    }
-
-    @Override
-    public Integer edit(RegionDto regionDto) {
-        return this.regionRepository.edit(
-                regionDto.getId(),
-                regionDto.getName()
-        );
-    }
-
-    @Override
-    public void deleteById(Integer id) {
-        this.regionRepository.deleteById(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/region/dto/RegionDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/region/dto/RegionDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.db.distributorapp.region.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class RegionDto {
-    public Integer id;
-    public String name;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,42 +1,0 @@
-package mk.ukim.finki.db.distributorapp.token;
-
-
-import jakarta.persistence.*;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.User;
-
-import java.time.LocalDateTime;
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@Entity
-@Table(name = "token_")
-public class Token {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "t_id")
-    private Long tokenId;
-
-    @Column(name = "t_value", unique = true, nullable = false)
-    private String tokenValue;
-
-    @Column(name = "t_date")
-    private LocalDateTime createdDate;
-
-    @Enumerated(EnumType.STRING)
-    @Column(name = "t_type")
-    private TokenType tokenType;
-
-    @Column(name = "t_expiry")
-    private LocalDateTime tokenExpiryDate;
-
-    @Column(name = "t_validated_at")
-    private LocalDateTime tokenValidatedAt;
-
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "t_user", referencedColumnName = "user_id", nullable = false, unique = true)
-    private User user;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/token/TokenRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/token/TokenRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,58 +1,0 @@
-package mk.ukim.finki.db.distributorapp.token;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.time.LocalDateTime;
-
-public interface TokenRepository extends JpaRepository<Token, Long> {
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select
-                    from token
-                    where t_value = ?1
-                    """
-    )
-    TokenDto findTokenByValue(@NonNull String token);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into token(t_value, t_type, t_expiry, t_user)
-                    values (:value, :type, :expiry, :user)
-                    """
-    )
-    Integer create(
-            @NonNull @Param("value") String t_value,
-            @NonNull @Param("expiry") LocalDateTime t_expiry,
-            @NonNull @Param("user") Long user_id,
-            @NonNull @Param("type") String t_type
-    );
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    update token
-                    set t_expiry = :expiry, t_user = :user, t_value = :value, t_type = :type, t_validated_at = :validated_at
-                    where t_id = :id
-                    """
-    )
-    Integer edit(
-            @NonNull @Param("id") Long t_id,
-            @NonNull @Param("value") String t_value,
-            @NonNull @Param("expiry") LocalDateTime t_expiry,
-            @NonNull @Param("user") Long user_id,
-            @NonNull @Param("validated_at") LocalDateTime validated_at,
-            @NonNull @Param("type") String t_type
-    );
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/token/TokenType.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/token/TokenType.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,5 +1,0 @@
-package mk.ukim.finki.db.distributorapp.token;
-
-public enum TokenType {
-    TOKEN_VERIFICATION, TOKEN_RESET
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/token/dto/TokenDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/token/dto/TokenDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package mk.ukim.finki.db.distributorapp.token.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import java.time.LocalDateTime;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class TokenDto {
-    Long t_id;
-    String t_value;
-    LocalDateTime t_date;
-    String t_type;
-    LocalDateTime t_expiry;
-    LocalDateTime t_validated_at;
-    Long user_id;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPrice.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPrice.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,25 +1,0 @@
-package mk.ukim.finki.db.distributorapp.unitPrice;
-
-import jakarta.persistence.*;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
-import mk.ukim.finki.db.distributorapp.price.Price;
-
-@Data
-@Entity
-@Table(name = "unit_price", schema = "IND0_185022")
-public class UnitPrice {
-    @EmbeddedId
-    private UnitPriceId id;
-
-    @MapsId("unitId")
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "unit_id", nullable = false)
-    private ArticleUnit unit;
-
-    @MapsId("priceId")
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "price_id", nullable = false)
-    private Price price;
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceId.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceId.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.unitPrice;
-
-import jakarta.persistence.Column;
-import jakarta.persistence.Embeddable;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.NoArgsConstructor;
-
-import java.io.Serializable;
-
-@Data
-@Embeddable
-@NoArgsConstructor
-@AllArgsConstructor
-@EqualsAndHashCode
-public class UnitPriceId implements Serializable {
-    @Column(name = "unit_id", nullable = false)
-    private Long unitId;
-    @Column(name = "price_id", nullable = false)
-    private Long priceId;
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,24 +1,0 @@
-package mk.ukim.finki.db.distributorapp.unitPrice;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface UnitPriceRepository extends JpaRepository<UnitPrice, UnitPriceId> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = """
-                    insert into unit_price(unit_id, price_id)
-                    values (:unitId, :priceId)
-                    """
-    )
-    Integer create(
-            @Param("unitId") @NonNull Long unitId,
-            @Param("priceId") @NonNull Long priceId
-    );
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/dto/UnitPriceDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/dto/UnitPriceDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.db.distributorapp.unitPrice.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class UnitPriceDto {
-    private Long unitId;
-    private Long priceId;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/Role.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/Role.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import org.springframework.security.core.GrantedAuthority;
-
-public enum Role implements GrantedAuthority {
-    ROLE_CUSTOMER, ROLE_MANAGER, ROLE_DRIVER, ROLE_ADMIN;
-
-    @Override
-    public String getAuthority() {
-        return "";
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/User.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/User.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,140 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import mk.ukim.finki.db.distributorapp.city.City;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import mk.ukim.finki.db.distributorapp.token.Token;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-@Entity
-@AllArgsConstructor
-@NoArgsConstructor
-@Inheritance(strategy = InheritanceType.JOINED)
-@DiscriminatorColumn(
-        name = "clazz_",
-        discriminatorType = DiscriminatorType.STRING
-)
-@Data
-@Table(name = "users")
-public class User implements UserDetails {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "user_id")
-    private Long userId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_name", nullable = false)
-    private String userName;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_surname", nullable = false)
-    private String userSurname;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_pass", nullable = false)
-    private String userPassword;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_email", nullable = false)
-    private String userEmail;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_mobile", nullable = false)
-    private String userMobile;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "user_salt", nullable = false)
-    private String userSalt;
-
-    @NotNull
-    @Column(name = "user_active", nullable = false)
-    private Boolean userActive;
-
-    @Size(max = 255)
-    @Column(name = "user_image")
-    private String userImage;
-
-    @Enumerated(EnumType.STRING)
-    @Column(name = "user_role")
-    private Role userRole;
-
-    @Column(name = "clazz_", insertable = false, updatable = false)
-    private String clazz_;
-
-    @OneToMany(mappedBy = "user")
-    private List<Token> tokens;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "city_id", nullable = false)
-    private City city;
-
-    public User(UsersLoadingDto dto) {
-        this.userRole = Role.valueOf(dto.getUserRole());
-        this.userId = dto.getUserId();
-        this.userName = dto.getUserName();
-        this.userSurname = dto.getUserSurname();
-        this.userPassword = dto.getUserPassword();
-        this.userEmail = dto.getUserEmail();
-        this.userMobile = dto.getUserMobile();
-        this.userSalt = dto.getUserSalt();
-        this.userActive = dto.getUserActive();
-        this.userImage = dto.getUserImage();
-        this.tokens = null;
-        this.city = null;
-    }
-
-    @Override
-    public String getUsername() {
-        return userEmail;
-    }
-
-    @Override
-    public String getPassword() {
-        return userPassword;
-    }
-
-    @Override
-    public Collection<? extends GrantedAuthority> getAuthorities() {
-        List<GrantedAuthority> authorities = new ArrayList<>();
-        authorities.add(new SimpleGrantedAuthority(this.getUserRole().name()));
-        return authorities;
-    }
-
-    @Override
-    public boolean isAccountNonExpired() {
-        return true;
-    }
-
-    @Override
-    public boolean isAccountNonLocked() {
-        return true;
-    }
-
-    @Override
-    public boolean isCredentialsNonExpired() {
-        return true;
-    }
-
-    @Override
-    public boolean isEnabled() {
-        return userActive;
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,126 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface UserRepository extends JpaRepository<User, Long> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into users(user_name,user_surname,user_pass,user_salt,user_email,user_mobile,user_active,user_image,city_id,user_role,clazz_) " +
-                    "values (:name,:sur,:pass,:salt,:email,:mob,:active,:img,:cty,:role,:clazz_)"
-    )
-    Integer create(
-            @NonNull @Param("name") String name,
-            @NonNull @Param("sur") String surname,
-            @NonNull @Param("pass") String password,
-            @NonNull @Param("email") String email,
-            @NonNull @Param("mob") String mobile,
-            @NonNull @Param("salt") String salt,
-            @NonNull @Param("active") Boolean active,
-            @Param("img") String image,
-            @NonNull @Param("cty") Integer city_id,
-            @NonNull @Param("role") String role,
-            @NonNull @Param("clazz_") String clazz_);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update users " +
-                    "set user_name=:name,user_surname=:sur,user_pass=:pass,user_email=:email,user_mobile=:mob,user_salt=:salt,user_active=:active,user_image=:img,city_id=:cty,user_role=:role,clazz_=:clazz_ " +
-                    "where user_id=:id"
-    )
-    Integer edit(
-            @NonNull @Param("id") Long id,
-            @NonNull @Param("name") String name,
-            @NonNull @Param("sur") String surname,
-            @NonNull @Param("pass") String password,
-            @NonNull @Param("email") String email,
-            @NonNull @Param("mob") String mobile,
-            @NonNull @Param("salt") String salt,
-            @NonNull @Param("active") Boolean active,
-            @NonNull @Param("img") String image,
-            @NonNull @Param("cty") Integer city_id,
-            @NonNull @Param("role") String role,
-            @NonNull @Param("clazz_") String clazz_);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from users where user_id=:id"
-    )
-    void delete(@NonNull @Param("id") Long id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select user_id as userId,
-                           user_name as userName,
-                           user_surname as userSurname,
-                           user_pass as userPassword,
-                           user_email as userEmail,
-                           user_mobile as userMobile,
-                           user_salt as userSalt,
-                           user_active as userActive,
-                           user_image as userImage,
-                           user_role as userRole,
-                           clazz_
-                    from users
-                    where user_email = ?1
-                    """
-    )
-    UsersLoadingDto findUsersByUserEmailIgnoreCaseDto(String email);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select u.user_id as id,
-                           u.user_name as firstName,
-                           u.user_surname as lastName,
-                           u.user_email as email,
-                           u.user_mobile as phone,
-                           u.user_image as image,
-                           u.city_id as cityId,
-                           c.city_name as cityName,
-                           r.region_name as regionName,
-                           u.user_role as role,
-                           clazz_ as clazz_,
-                           u.user_active as userActive
-                    from users u
-                    join city c on u.city_id = c.city_id
-                    join region r on c.region_id = r.region_id
-                    where user_email = ?1
-                    """
-    )
-    UserDto findUserDtoByEmail(String userEmail);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select u.user_id as userId,
-                           u.user_name as userName,
-                           u.user_surname as userSurname,
-                           u.user_pass as userPassword,
-                           u.user_email as userEmail,
-                           u.user_mobile as userMobile,
-                           u.user_salt as userSalt,
-                           u.user_active as userActive,
-                           u.user_image as userImage,
-                           u.user_role as userRole,
-                           u.clazz_ as clazz_
-                    from users u
-                    join token t on u.user_id=t.t_user
-                    where t.t_value = :token
-                    """
-    )
-    UsersLoadingDto findUserByResetToken(@NonNull @Param("token") String token);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-
-public interface UserService {
-    Integer edit(UserDto userDto);
-
-    void deleteUserById(Long id);
-
-    UsersLoadingDto findUserByResetToken(String token);
-
-    UserDto findUserDtoByEmail(String userEmail);
-
-    UsersLoadingDto findFullUserDtoByEmail(String userEmail);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,52 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
-import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class UserServiceImpl implements UserService {
-
-    private final UserRepository userRepository;
-
-    @Override
-    public Integer edit(UserDto userDto) {
-        UsersLoadingDto user = this.userRepository.findUsersByUserEmailIgnoreCaseDto(userDto.getEmail());
-        return this.userRepository.edit(
-                userDto.getId(),
-                userDto.getFirstName(),
-                userDto.getLastName(),
-                user.getUserPassword(),
-                userDto.getEmail(),
-                userDto.getPhone(),
-                user.getUserSalt(),
-                userDto.getUserActive(),
-                userDto.getImage(),
-                userDto.getCityId(),
-                userDto.getRole(),
-                userDto.getClazz_()
-        );
-    }
-
-    @Override
-    public UsersLoadingDto findUserByResetToken(String token) {
-        return this.userRepository.findUserByResetToken(token);
-    }
-
-    @Override
-    public UserDto findUserDtoByEmail(String userEmail) {
-        return this.userRepository.findUserDtoByEmail(userEmail);
-    }
-
-    @Override
-    public UsersLoadingDto findFullUserDtoByEmail(String userEmail) {
-        return this.userRepository.findUsersByUserEmailIgnoreCaseDto(userEmail);
-    }
-
-    @Override
-    public void deleteUserById(Long id) {
-        this.userRepository.delete(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UserDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UserDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class UserDto {
-    private Long id;
-    private String firstName;
-    private String lastName;
-    private String email;
-    private String phone;
-    private String image;
-    private Integer cityId;
-    private String cityName;
-    private String regionName;
-    private String role;
-    private String clazz_;
-    Boolean userActive;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UsersLoadingDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UsersLoadingDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,20 +1,0 @@
-package mk.ukim.finki.db.distributorapp.users.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class UsersLoadingDto {
-    Long userId;
-    String userName;
-    String userSurname;
-    String userPassword;
-    String userEmail;
-    String userMobile;
-    String userSalt;
-    Boolean userActive;
-    String userImage;
-    String userRole;
-    String clazz_;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,65 +1,0 @@
-package mk.ukim.finki.db.distributorapp.vehicle;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.delivery.Delivery;
-import mk.ukim.finki.db.distributorapp.driver.Driver;
-import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
-
-import java.util.Date;
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "vehicle")
-public class Vehicle {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "veh_id")
-    private Integer vehicleId;
-
-    @NotNull
-    @Column(name = "veh_carry_weight", nullable = false)
-    private Integer vehicleCarryWeight;
-
-    @NotNull
-    @Column(name = "veh_service_interval", nullable = false)
-    private Short vehicleServiceInterval;
-
-    @NotNull
-    @Column(name = "veh_kilometers", nullable = false)
-    private Integer vehicleKilometers;
-
-    @Column(name = "veh_last_service")
-    private Date vehicleLastService;
-
-    @Column(name = "veh_last_service_km")
-    private Integer vehicleLastServiceKm;
-
-    @Size(max = 8)
-    @NotNull
-    @Column(name = "veh_plate", nullable = false, length = 8)
-    private String vehiclePlate;
-
-    @Size(max = 17)
-    @NotNull
-    @Column(name = "veh_vin", nullable = false, length = 17)
-    private String vehicleVin;
-
-    @NotNull
-    @Column(name = "veh_reg_date", nullable = false)
-    private Date vehicleRegDate;
-
-    @NotNull
-    @ManyToOne(fetch = FetchType.LAZY, optional = false)
-    @JoinColumn(name = "wh_id", nullable = false)
-    private Warehouse warehouse;
-
-    @OneToOne(mappedBy = "vehicle")
-    private Driver driver;
-
-    @OneToMany(mappedBy = "vehicle")
-    private List<Delivery> deliveries;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,110 +1,0 @@
-package mk.ukim.finki.db.distributorapp.vehicle;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Date;
-import java.util.List;
-
-public interface VehicleRepository extends JpaRepository<Vehicle, Integer> {
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select veh_id as id,
-                           wh_id as warehouseId,
-                           veh_plate as plateNumber
-                    from vehicle
-                    where wh_id = ?1
-                    """
-    )
-    List<VehicleBasicDto> findAllByWarehouseDto(@NonNull Integer warehouseId);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into vehicle(veh_carry_weight, veh_service_interval, veh_kilometers, veh_last_service, veh_last_service_km, veh_plate, veh_vin, veh_reg_date, wh_id) " +
-                    "values (?1,?2,?3,?4,?5,?6,?7,?8,?9)"
-    )
-    Integer create(
-            @NonNull Integer vehicleCarryWeight,
-            @NonNull Short vehicleServiceInterval,
-            @NonNull Integer vehicleKilometers,
-            @NonNull Date vehicleLastService,
-            @NonNull Integer vehicleLastServiceKm,
-            @NonNull String vehiclePlate,
-            @NonNull String vehicleVIN,
-            @NonNull Date vehicleRegDate,
-            @NonNull Integer whId);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update vehicle " +
-                    "set veh_carry_weight=?2,veh_service_interval=?3,veh_kilometers=?4," +
-                    "veh_last_service=?5,veh_last_service_km=?6,veh_plate=?7,veh_vin=?8,veh_reg_date=?9,wh_id=?10 " +
-                    "where veh_id=?1"
-    )
-    Integer edit(
-            @NonNull Integer id,
-            @NonNull Integer vehicleCarryWeight,
-            @NonNull Short vehicleServiceInterval,
-            @NonNull Integer vehicleKilometers,
-            @NonNull Date vehicleLastService,
-            @NonNull Integer vehicleLastServiceKm,
-            @NonNull String vehiclePlate,
-            @NonNull String vehicleVIN,
-            @NonNull Date vehicleRegDate,
-            @NonNull Integer whId);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from vehicle where veh_id=?1"
-    )
-    void delete(@NonNull Integer id);
-
-    //----------------------------------------------------------------------------------------------------------------------
-    @Query(
-            nativeQuery = true,
-            value = """
-                     select v.veh_id as id,
-                            v.veh_carry_weight as carryWeight,
-                            v.veh_service_interval as serviceInterval,
-                            v.veh_kilometers as kilometers,
-                            v.veh_last_service as lastServiceDate,
-                            v.veh_last_service_km as lastServiceKm,
-                            v.veh_plate as plate,
-                            v.veh_vin as vin,
-                            v.veh_reg_date as registrationDate,
-                            w.wh_id as whId,
-                            c.city_name as city,
-                            r.region_name as region,
-                            d.user_id as driverId,
-                            u1.user_name as driverName,
-                            u1.user_email as driverEmail,
-                            u1.user_mobile as driverPhone,
-                            u1.user_image as driverImg
-                     from warehouse w
-                     join city c on w.city_id = c.city_id
-                     join region r on c.region_id = r.region_id
-                     join manager m on w.wh_id = m.wh_id
-                     join users u on m.user_id = u.user_id
-                     join vehicle v on w.wh_id=v.wh_id
-                     join driver d on d.veh_id=v.veh_id
-                     join users u1 on d.user_id=u1.user_id
-                     where m.user_id = :manager
-                     group by v.veh_id, v.veh_carry_weight, v.veh_service_interval, v.veh_kilometers, v.veh_last_service, v.veh_last_service_km, v.veh_plate, v.veh_vin, v.veh_reg_date, w.wh_id, c.city_name, r.region_name, d.user_id, u1.user_name, u1.user_email, u1.user_mobile, u1.user_image
-                     order by v.veh_reg_date
-                    """
-    )
-    List<VehicleDto> getVehiclesByManager(@NonNull @Param("manager") Long managerId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-package mk.ukim.finki.db.distributorapp.vehicle;
-
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
-
-import java.util.List;
-
-public interface VehicleService {
-
-    List<VehicleBasicDto> getVehiclesByWarehouse(Integer warehouseId);
-
-    Integer create(VehicleDto vehicleDto);
-
-    Integer edit(VehicleDto vehicleDto);
-
-    void deleteById(Integer id);
-
-    List<VehicleDto> getVehiclesByManager(Long managerId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,62 +1,0 @@
-package mk.ukim.finki.db.distributorapp.vehicle;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
-import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class VehicleServiceImpl implements VehicleService {
-
-    private final VehicleRepository vehicleRepository;
-
-    @Override
-    public List<VehicleBasicDto> getVehiclesByWarehouse(Integer warehouseId) {
-        return this.vehicleRepository.findAllByWarehouseDto(warehouseId);
-    }
-
-    @Override
-    public Integer create(VehicleDto vehicleDto) {
-        return this.vehicleRepository.create(
-                vehicleDto.getCarryWeight(),
-                vehicleDto.getServiceInterval(),
-                vehicleDto.getKilometers(),
-                vehicleDto.getLastServiceDate(),
-                vehicleDto.getLastServiceKm(),
-                vehicleDto.getPlate(),
-                vehicleDto.getVin(),
-                vehicleDto.getRegistrationDate(),
-                vehicleDto.getWhId());
-    }
-
-    @Override
-    public Integer edit(VehicleDto vehicleDto) {
-
-        return this.vehicleRepository.edit(
-                vehicleDto.getId(),
-                vehicleDto.getCarryWeight(),
-                vehicleDto.getServiceInterval(),
-                vehicleDto.getKilometers(),
-                vehicleDto.getLastServiceDate(),
-                vehicleDto.getLastServiceKm(),
-                vehicleDto.getPlate(),
-                vehicleDto.getVin(),
-                vehicleDto.getRegistrationDate(),
-                vehicleDto.getWhId()
-        );
-    }
-
-    @Override
-    public void deleteById(Integer id) {
-        this.vehicleRepository.delete(id);
-    }
-    //------------------------------------------------------------------------------------------------------------------
-
-    @Override
-    public List<VehicleDto> getVehiclesByManager(Long managerId) {
-        return this.vehicleRepository.getVehiclesByManager(managerId);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleBasicDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleBasicDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.vehicle.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class VehicleBasicDto {
-    private Integer id;
-    private Integer warehouseId;
-    private String plateNumber;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package mk.ukim.finki.db.distributorapp.vehicle.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-import java.util.Date;
-
-@Data
-@AllArgsConstructor
-public class VehicleDto {
-    private Integer id;
-    private Integer carryWeight;
-    private Short serviceInterval;
-    private Integer kilometers;
-    private Date lastServiceDate;
-    private Integer lastServiceKm;
-    private String plate;
-    private String vin;
-    private Date registrationDate;
-    private Integer whId;
-    private String city;
-    private String region;
-    private Long driverId;
-    private String driverName;
-    private String driverEmail;
-    private String driverPhone;
-    private String driverImg;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/Warehouse.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/Warehouse.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,40 +1,0 @@
-package mk.ukim.finki.db.distributorapp.warehouse;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
-import mk.ukim.finki.db.distributorapp.city.City;
-import mk.ukim.finki.db.distributorapp.manager.Manager;
-import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
-
-import java.util.List;
-
-@Entity
-@Data
-@Table(name = "warehouse")
-public class Warehouse {
-    @Id
-    @GeneratedValue(strategy = GenerationType.IDENTITY)
-    @Column(name = "wh_id")
-    private Integer warehouseId;
-
-    @Size(max = 255)
-    @NotNull
-    @Column(name = "wh_adr", nullable = false)
-    private String warehouseAddress;
-
-    @OneToOne
-    @JoinColumn(name = "city_id", unique = true, nullable = false)
-    private City city;
-
-    @OneToOne(mappedBy = "warehouse")
-    private Manager manager;
-
-    @OneToMany(mappedBy = "warehouse")
-    private List<Vehicle> vehicles;
-
-    @OneToMany(mappedBy = "warehouse")
-    private List<ArticleUnit> articleUnits;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,89 +1,0 @@
-package mk.ukim.finki.db.distributorapp.warehouse;
-
-import lombok.NonNull;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseInventoryDto;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.data.repository.query.Param;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.List;
-
-public interface WarehouseRepository extends JpaRepository<Warehouse, Integer> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into warehouse(wh_adr, city_id) " +
-                    "values (?1,?2)"
-    )
-    Integer create(
-            @NonNull String whAddress,
-            @NonNull Integer city);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update warehouse " +
-                    "set wh_adr = ?2,city_id = ?3 " +
-                    "where wh_id = ?1"
-    )
-    Integer edit(
-            @NonNull Integer id,
-            @NonNull String whAddress,
-            @NonNull Integer city);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from warehouse where wh_id = ?1"
-    )
-    void delete(@NonNull Integer id);
-    //-------------------------------------------------------------------------------------------------------------------
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                    select a.art_name as articleName,
-                           man.man_name as manufacturerName,
-                           count(au.unit_id) as totalUnits
-                    from warehouse w
-                        join manager m on m.wh_id = w.wh_id
-                        join article_unit au on au.wh_id = w.wh_id
-                        join unit_price up on au.unit_id = up.unit_id
-                        join price p on p.price_id=up.price_id
-                        join article a on p.art_id=a.art_id
-                        join manufacturer man on a.man_id = man.man_id
-                    where m.user_id = :manager
-                    group by a.art_name, man.man_name
-                    order by totalUnits
-                    """
-    )
-    List<WarehouseInventoryDto> getInventoryByManager(@NonNull @Param("manager") Long manager_id);
-
-    @Query(
-            nativeQuery = true,
-            value = """
-                     with reg as (
-                         select r.*
-                         from city c1 join region r on c1.region_id = r.region_id
-                         where c1.city_id = :city
-                     )
-                     select w.wh_id as id,
-                            w.wh_adr as address,
-                            c.city_id as cityId,
-                            c.city_name as cityName,
-                            r1.region_id as regionId,
-                            r1.region_name as regionName
-                     from warehouse w
-                     join city c on c.city_id = w.city_id
-                     join reg r1 on r1.region_id = c.region_id
-                     where c.region_id = r1.region_id
-                    """
-    )
-    WarehouseDto findWarehouseDtoByCityId(@NonNull @Param("city") Integer cityId);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-package mk.ukim.finki.db.distributorapp.warehouse;
-
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseInventoryDto;
-
-import java.util.List;
-
-public interface WarehouseService {
-
-    WarehouseDto findById(Integer id);
-
-    WarehouseDto findByCityId(Integer id);
-
-    Integer create(WarehouseDto warehouseDto);
-
-    Integer edit(WarehouseDto warehouseDto);
-
-    void deleteById(Integer id);
-
-    List<WarehouseInventoryDto> getInventoryByManager(Long managerId);
-
-
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,59 +1,0 @@
-package mk.ukim.finki.db.distributorapp.warehouse;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
-import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseInventoryDto;
-import org.springframework.stereotype.Service;
-
-import java.util.List;
-
-@Service
-@RequiredArgsConstructor
-public class WarehouseServiceImpl implements WarehouseService {
-    private final WarehouseRepository warehouseRepository;
-
-    @Override
-    public WarehouseDto findById(Integer id) {
-        Warehouse wh = this.warehouseRepository.findById(id).get();
-        return new WarehouseDto(
-                wh.getWarehouseId(),
-                wh.getWarehouseAddress(),
-                wh.getCity().getCityId(),
-                wh.getCity().getCityName(),
-                wh.getCity().getRegion().getRegionId(),
-                wh.getCity().getRegion().getRegionName()
-        );
-    }
-
-    @Override
-    public WarehouseDto findByCityId(Integer id) {
-        return this.warehouseRepository.findWarehouseDtoByCityId(id);
-    }
-
-    @Override
-    public Integer create(WarehouseDto warehouseDto) {
-        return this.warehouseRepository.create(
-                warehouseDto.getAddress(),
-                warehouseDto.getCityId()
-        );
-    }
-
-    @Override
-    public Integer edit(WarehouseDto warehouseDto) {
-        return this.warehouseRepository.edit(
-                warehouseDto.getId(),
-                warehouseDto.getAddress(),
-                warehouseDto.getCityId()
-        );
-    }
-
-    @Override
-    public void deleteById(Integer id) {
-        this.warehouseRepository.findById(id);
-    }
-
-    @Override
-    public List<WarehouseInventoryDto> getInventoryByManager(Long managerId) {
-        return this.warehouseRepository.getInventoryByManager(managerId);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-package mk.ukim.finki.db.distributorapp.warehouse.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@AllArgsConstructor
-@NoArgsConstructor
-public class WarehouseDto {
-    private Integer id;
-    private String address;
-    private Integer cityId;
-    private String cityName;
-    private Integer regionId;
-    private String regionName;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseInventoryDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseInventoryDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.warehouse.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class WarehouseInventoryDto {
-    String articleName;
-    String manufacturerName;
-    Long totalUnits;
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,28 +1,0 @@
-package mk.ukim.finki.db.distributorapp.weekday;
-
-import jakarta.persistence.*;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import mk.ukim.finki.db.distributorapp.customerWeekday.CustomerWeekday;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-@Data
-@Entity
-@Table(name = "weekday")
-public class Weekday {
-    @Id
-    @Column(name = "day_id", nullable = false)
-    private Short weekdayId;
-
-    @Size(max = 20)
-    @NotNull
-    @Column(name = "day_name", nullable = false, length = 20)
-    private String dayName;
-
-    @OneToMany(mappedBy = "day")
-    private Set<CustomerWeekday> customerWeekdays = new LinkedHashSet<>();
-    // ? Set<CustomerWeekday> or List<CustomerWeekday>
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayRepository.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayRepository.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,37 +1,0 @@
-package mk.ukim.finki.db.distributorapp.weekday;
-
-import lombok.NonNull;
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-import org.springframework.transaction.annotation.Transactional;
-
-public interface WeekdayRepository extends JpaRepository<Weekday, Short> {
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "insert into weekday(day_id,day_name) " +
-                    "values (?1,?2)"
-    )
-    Integer create(@NonNull String dayName);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "update weekday " +
-                    "set day_name=?2 " +
-                    "where day_id=?1"
-    )
-    Integer edit(@NonNull Short id, @NonNull String dayName);
-
-    @Modifying
-    @Transactional
-    @Query(
-            nativeQuery = true,
-            value = "delete from weekday " +
-                    "where day_id=?1"
-    )
-    void deleteById(@NonNull Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayService.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayService.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-package mk.ukim.finki.db.distributorapp.weekday;
-
-import mk.ukim.finki.db.distributorapp.weekday.dto.WeekdayDto;
-
-public interface WeekdayService {
-
-    Integer create(WeekdayDto weekdayDto);
-
-    Integer edit(WeekdayDto weekdayDto);
-
-    void deleteById(Short id);
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayServiceImpl.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayServiceImpl.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-package mk.ukim.finki.db.distributorapp.weekday;
-
-import lombok.RequiredArgsConstructor;
-import mk.ukim.finki.db.distributorapp.weekday.dto.WeekdayDto;
-import org.springframework.stereotype.Service;
-
-@Service
-@RequiredArgsConstructor
-public class WeekdayServiceImpl implements WeekdayService {
-    private final WeekdayRepository weekdayRepository;
-
-    @Override
-    public Integer create(WeekdayDto weekdayDto) {
-        return this.weekdayRepository.create(
-                weekdayDto.getDayName()
-        );
-    }
-
-    @Override
-    public Integer edit(WeekdayDto weekdayDto) {
-        return this.weekdayRepository.edit(
-                weekdayDto.getId(),
-                weekdayDto.getDayName()
-        );
-    }
-
-    @Override
-    public void deleteById(Short id) {
-        this.weekdayRepository.deleteById(id);
-    }
-}
Index: ckend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/dto/WeekdayDto.java
===================================================================
--- backend/src/main/java/mk/ukim/finki/db/distributorapp/weekday/dto/WeekdayDto.java	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-package mk.ukim.finki.db.distributorapp.weekday.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-
-@Data
-@AllArgsConstructor
-public class WeekdayDto {
-    private Short id;
-    private String dayName;
-}
Index: ckend/src/main/resources/application-prod.properties
===================================================================
--- backend/src/main/resources/application-prod.properties	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,43 +1,0 @@
-server.port=8443
-
-## -------------------POSTGRESQL & JPA-------------------
-spring.datasource.url=${DB_URL}
-spring.datasource.username=${DB_USERNAME}
-spring.datasource.password=${DB_PASSWORD}
-
-spring.datasource.hikari.connectionTimeout=20000
-spring.datasource.hikari.maximumPoolSize=5
-
-spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
-
-spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
-spring.jpa.show-sql=true
-
-spring.datasource.hikari.schema=IND0_185022
-
-spring.jpa.properties.hibernate.format_sql=true
-spring.jpa.properties.hibernate.use_sql_comments=true
-spring.datasource.driver-class-name=org.postgresql.Driver
-
-## -------------------HTTPS Configuration-------------------
-server.ssl.key-store=classpath:keystore.p12
-server.ssl.key-store-password=${KS_PASSWORD}
-server.ssl.key-store-type=PKCS12
-server.ssl.key-alias=${KEY_ALIAS}
-server.ssl.enabled=true
-
-## -------------------JWT Configuration-------------------
-jwt.secret=${JWT_SECRET}
-jwt.validity=3600000
-
-## -------------------Email properties-------------------
-spring.mail.host=smtp.gmail.com
-spring.mail.port=587
-spring.mail.username=${SMTP_USERNAME}
-spring.mail.password=${SMTP_PASSWORD}
-spring.mail.properties.mail.smtp.auth=true
-spring.mail.properties.mail.smtp.starttls.enable=true
-
-## Logging/Debugging:
-logging.level.org.springframework.jdbc=DEBUG
-logging.level.org.hibernate.SQL=DEBUG
Index: ckend/src/main/resources/application.properties
===================================================================
--- backend/src/main/resources/application.properties	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,3 +1,0 @@
-spring.application.name=DistributorApp
-
-spring.profiles.active=prod
Index: ckend/src/main/resources/templates/all-drivers.html
===================================================================
--- backend/src/main/resources/templates/all-drivers.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
Index: ckend/src/main/resources/templates/all-managers.html
===================================================================
--- backend/src/main/resources/templates/all-managers.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
Index: ckend/src/main/resources/templates/authentication/access_denied.html
===================================================================
--- backend/src/main/resources/templates/authentication/access_denied.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-Error
-</body>
-</html>
Index: ckend/src/main/resources/templates/authentication/changePass.html
===================================================================
--- backend/src/main/resources/templates/authentication/changePass.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,36 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Change Password</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div class="change-password-container">
-    <h1 class="text-center mb-4">Change Password</h1>
-    <form method="POST" th:action="@{/rest/auth/changePass}">
-        <div class="form-group">
-            <label for="oldPassword" class="form-label">Old Password</label>
-            <input type="password" class="form-control" id="oldPassword" name="oldPassword" required>
-        </div>
-
-        <div class="form-group">
-            <label for="newPassword" class="form-label">New Password</label>
-            <input type="password" class="form-control" id="newPassword" name="newPassword" required>
-        </div>
-
-        <div class="form-group">
-            <label for="confirmPassword" class="form-label">Confirm Password</label>
-            <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" required>
-        </div>
-
-        <button type="submit" class="btn btn-primary">Change Password</button>
-    </form>
-
-    <div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div>
-
-    <div th:if="${success}" class="alert alert-success mt-3" th:text="${success}"></div>
-</div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/authentication/login.html
===================================================================
--- backend/src/main/resources/templates/authentication/login.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,53 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Login</title>
-    <link rel="stylesheet" th:href="@{/css/style.css}">
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/header :: header}"></div>
-<main>
-    <div class="container">
-        <form class="form-signin mt-xl-5" method="post" th:action="@{/auth/login}">
-            <h2 class="form-signin-heading">Sign in</h2>
-            <p>
-                <!--                <label for="username" class="sr-only">Email</label>-->
-                <label>
-                    <input type="email" name="email" placeholder="Email" required>
-                </label>
-            </p>
-            <p>
-                <!--                <label for="password" class="sr-only">Password</label>-->
-                <label>
-                    <input type="password" name="password" placeholder="Password" required>
-                </label>
-            </p>
-
-            <div th:if="${param.error}" th:text="${param.error}" class="text-danger">
-                <p style="color: red;">Invalid username or password</p>
-            </div>
-
-            <div class="row">
-                <div class="col-md-3">
-                    <button id="submit" class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-3">
-                    <a href="/reset-password/request" class="btn btn-lg btn-block btn-light">Change your password</a>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-3">
-                    <a href="/auth/register" class="btn btn-lg btn-block btn-light">Register here</a>
-                </div>
-            </div>
-        </form>
-    </div>
-</main>
-<div th:replace="~{fragments/footer :: footer}"></div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/authentication/register.html
===================================================================
--- backend/src/main/resources/templates/authentication/register.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,134 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Register</title>
-    <link rel="stylesheet" th:href="@{/css/style.css}">
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/header :: header}"></div>
-<main>
-    <div class="container mb-4">
-        <form class="form-signin mt-xl-5" th:action="@{/auth/register}" method="post">
-            <h2 class="form-signin-heading">Register as a Customer</h2>
-            <div class="container">
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="email" class="sr-only">Email: </label>
-                            <input type="email" id="email" name="email" class="form-control"
-                                   placeholder="Email" required="" autofocus="">
-                        </div>
-                    </div>
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="compName" class="sr-only">Company Name:</label>
-                            <input type="text" id="compName" name="compName" class="form-control"
-                            placeholder="Company Name" required="" autofocus="">
-                        </div>
-                    </div>
-
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="password" class="sr-only">Password: </label>
-                            <input type="password" id="password" name="password" class="form-control"
-                                   placeholder="Password" required="" autofocus="">
-                        </div>
-                    </div>
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="edb" class="sr-only">EDB: </label>
-                            <input type="text" id="edb" name="edb" class="form-control"
-                                   placeholder="Email" required="" autofocus="">
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
-                            <input type="password" id="repeatedPassword" name="repeatedPassword" class="form-control"
-                                   placeholder="Repeat Password" required="" autofocus="">
-                        </div>
-                    </div>
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="address" class="sr-only">Address: </label>
-                            <input type="text" id="address" name="address" class="form-control"
-                                   placeholder="Address" required="" autofocus="">
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="name" class="sr-only">First Name: </label>
-                            <input type="text" id="name" name="name" class="form-control"
-                                   placeholder="First Name" required="" autofocus="">
-                        </div>
-                    </div>
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="repImage" class="sr-only">Representative Image: </label>
-                            <input type="file" id="repImage" name="repImage" class="form-control" accept="image/*">
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="surname" class="sr-only">Last Name: </label>
-                            <input type="text" id="surname" name="surname" class="form-control"
-                                   placeholder="Last Name" required="" autofocus="">
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="mobile" class="sr-only">Mobile: </label>
-                            <input type="tel" id="mobile" name="mobile" class="form-control"
-                                   placeholder="Mobile" required="" autofocus="">
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="profileImage" class="sr-only">Profile Picture: </label>
-                            <input type="file" id="profileImage" name="profileImage" class="form-control" accept="image/*">
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <label for="city" class="sr-only">City the company is located in: </label>
-                            <select id="city" name="city" required class="form-control">
-                                <option value="" disabled selected>Select your city</option>
-                                <option th:each="city : ${cities}"
-                                        th:value="${city.getId()}"
-                                        th:text="${city.getName()}">
-                                </option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-6">
-                        <div class="form-group">
-                            <button type="submit" class="btn btn-primary mt-3">Register</button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </form>
-    </div>
-</main>
-<div th:replace="~{fragments/footer :: footer}"></div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/authentication/reset-password-request.html
===================================================================
--- backend/src/main/resources/templates/authentication/reset-password-request.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,43 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Reset Password</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <style>
-        body {
-            background-color: #f8f9fa;
-        }
-        .reset-password-container {
-            max-width: 500px;
-            margin: 50px auto;
-            padding: 20px;
-            background: #fff;
-            border-radius: 8px;
-            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-        }
-        .btn-primary {
-            width: 100%;
-            padding: 10px;
-        }
-    </style>
-</head>
-<body>
-<div class="reset-password-container">
-    <h1 class="text-center mb-4">Reset Password</h1>
-    <form th:action="@{/rest/auth/reset-password-request}" method="post">
-        <div class="form-group">
-            <label for="email" class="form-label">Email</label>
-            <input type="email" class="form-control" id="email" name="email" required>
-        </div>
-
-        <div class="form-group">
-            <button type="submit" class="btn btn-primary">Submit</button>
-            <a href="/static" class="btn btn-secondary mt-2 w-100">Cancel</a>
-        </div>
-    </form>
-    <div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div>
-</div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/authentication/reset-password.html
===================================================================
--- backend/src/main/resources/templates/authentication/reset-password.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,51 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Reset Password</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <style>
-        body {
-            background-color: #f8f9fa;
-        }
-        .reset-password-container {
-            max-width: 500px;
-            margin: 50px auto;
-            padding: 20px;
-            background: #fff;
-            border-radius: 8px;
-            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-        }
-        .btn-primary {
-            width: 100%;
-            padding: 10px;
-        }
-    </style>
-</head>
-<body>
-<div class="reset-password-container">
-    <h1 class="text-center mb-4">Reset Password</h1>
-    <form th:action="@{/reset-password}" method="post">
-        <input type="hidden" name="token" th:value="${token}">
-
-        <div class="form-group">
-            <label for="newPassword" class="form-label">New Password</label>
-            <input type="password" class="form-control" id="newPassword"
-                   name="newPassword" placeholder="New Password" required>
-        </div>
-
-        <div class="form-group">
-            <label for="confirmPassword" class="form-label">Confirm Password</label>
-            <input type="password" class="form-control" id="confirmPassword"
-                   name="confirmPassword" placeholder="Confirm Password" required>
-        </div>
-
-        <button type="submit" class="btn btn-primary">Reset Password</button>
-    </form>
-
-    <div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div>
-
-    <div th:if="${success}" class="alert alert-success mt-3" th:text="${success}"></div>
-</div>
-</body>
-</html>
Index: ckend/src/main/resources/templates/create-delivery.html
===================================================================
--- backend/src/main/resources/templates/create-delivery.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,87 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Create Delivery</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <style>
-        .scrollable-table {
-            height: 300px;
-            overflow-y: auto;
-        }
-    </style>
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-<div class="container mt-4">
-    <h1>Create Delivery from Undelivered Orders</h1>
-
-    <form th:action="@{/manager/create-delivery}" method="post" th:object="${newDelivery}">
-        <div class="row">
-            <div class="col-md-8">
-                <h2>Undelivered Orders</h2>
-                <div class="scrollable-table">
-                    <table class="table table-striped">
-                        <thead>
-                        <tr>
-                            <th>Select</th>
-                            <th>Order ID</th>
-                            <th>Order Date</th>
-                            <th>Order Sum</th>
-                            <th>Customer Name</th>
-                        </tr>
-                        </thead>
-                        <tbody>
-                        <tr th:each="order : ${newOrders}">
-                            <td>
-                                <input type="checkbox" name="orderIds" th:field="*{orders}" th:value="${order.id}"/>
-                            </td>
-                            <td th:text="${order.id}"></td>
-                            <td th:text="${order.ordDate}"></td>
-                            <td th:text="${order.ordSum}"></td>
-                            <td th:text="${order.customerName}"></td>
-                        </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-            <div class="col-md-4">
-                <div class="mb-3">
-                    <label for="deliveryDate" class="form-label">Delivery Date:</label>
-                    <input type="date" id="deliveryDate" name="deliveryDate" class="form-control" th:field="*{delDate}" required>
-                </div>
-                <h2>Select Vehicle</h2>
-                <div class="scrollable-table">
-                    <table class="table table-striped">
-                        <thead>
-                        <tr>
-                            <th>Select</th>
-                            <th>Plate</th>
-                            <th>Load Capacity</th>
-                            <th>Driver name</th>
-                        </tr>
-                        </thead>
-                        <tbody>
-                        <tr th:each="vehicle : ${vehicles}">
-                            <td>
-                                <input type="radio" name="vehicleId" th:value="${vehicle.id}" th:field="*{vehId}"/>
-                            </td>
-                            <td th:text="${vehicle.getPlate()}"></td>
-                            <td th:text="${vehicle.getCarryWeight()}"></td>
-                            <td th:text="${vehicle.getDriverName()}"></td>
-                        </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </div>
-        </div>
-
-        <!-- Submit Button -->
-        <div class="mt-3">
-            <button type="submit" class="btn btn-primary">Create Delivery</button>
-        </div>
-    </form>
-</div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/create-driver.html
===================================================================
--- backend/src/main/resources/templates/create-driver.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,153 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Create a Driver</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-<div class="container mb-4">
-    <form class="form-signin mt-xl-5" th:action="@{/admin/create-driver}" method="post" th:object="${driver}">
-        <h2 class="form-signin-heading">Create a Driver</h2>
-        <div class="container">
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="email" class="sr-only">Email: </label>
-                        <input type="email" id="email" name="email" class="form-control"
-                               placeholder="Email address" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="password" class="sr-only">Password:</label>
-                        <input type="password" id="password" name="password" class="form-control"
-                               placeholder="Password" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
-                        <input type="password" id="repeatedPassword" name="repeatedPassword" class="form-control"
-                               placeholder="Repeat Password" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="name" class="sr-only">First Name: </label>
-                        <input type="text" id="name" name="name" class="form-control"
-                               placeholder="First Name" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="surname" class="sr-only">Last Name: </label>
-                        <input type="text" id="surname" name="surname" class="form-control"
-                               placeholder="Last Name" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="mobile" class="sr-only">Mobile: </label>
-                        <input type="tel" id="mobile" name="mobile" class="form-control"
-                               placeholder="Mobile" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="profileImage" class="sr-only">Profile Picture: </label>
-                        <input type="file" id="profileImage" name="profileImage" class="form-control" accept="image/*">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="city" class="sr-only">City the company is located in: </label>
-                        <select id="city" name="city" required class="form-control">
-                            <option value="" disabled selected>Select your city</option>
-                            <option th:each="city : ${cities}"
-                                    th:value="${city.getId()}"
-                                    th:text="${city.getName()}">
-                            </option>
-                        </select>
-                    </div>
-                </div>
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="vehicle" class="sr-only">Assign a vehicle to the driver: </label>
-                        <select id="vehicle" name="vehicle" required class="form-control">
-                            <option value="" disabled selected>Choose a vehicle</option>
-                        </select>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <button type="submit" class="btn btn-primary mt-3">Submit</button>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-<script>
-    document.addEventListener("DOMContentLoaded", function () {
-        var citySelect = document.getElementById("city");
-        var vehicleSelect = document.getElementById("vehicle");
-
-        if (citySelect) {
-            citySelect.addEventListener("change", function () {
-                let selectedCityId = this.value;
-                console.log("City changed, value:", selectedCityId);
-
-                // Clear current vehicle options
-                vehicleSelect.innerHTML = '<option value="">Select a vehicle</option>';
-
-                // Only fetch if a valid city is selected
-                if (selectedCityId) {
-                    fetch("/admin/vehicle-by-city?cityId=" + selectedCityId)
-                        .then(response => {
-                            if (!response.ok) {
-                                throw new Error("Network response was not ok " + response.statusText);
-                            }
-                            return response.json();
-                        })
-                        .then(data => {
-                            console.log("Fetched vehicles:", data);
-                            // Populate the vehicles dropdown
-                            data.forEach(function (vehicle) {
-                                // Adjust property names as needed – here we assume:
-                                // - vehicle.id: the vehicle's unique id
-                                // - vehicle.name: the vehicle's display name (or plate)
-                                var option = document.createElement("option");
-                                option.value = vehicle.id;
-                                option.text = vehicle.plateNumber;  // or use another property like vehicle.plate if available
-                                vehicleSelect.appendChild(option);
-                            });
-                        })
-                        .catch(error => {
-                            console.error("Fetch error:", error);
-                        });
-                }
-            });
-        }
-    });
-</script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/create-manager.html
===================================================================
--- backend/src/main/resources/templates/create-manager.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,136 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Create a Manager</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-<div class="container mb-4">
-    <form class="form-signin mt-xl-5" th:action="@{/admin/create-manager}" method="post" th:object="${manager}">
-        <h2 class="form-signin-heading">Create a Manager</h2>
-        <div class="container">
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="email" class="sr-only">Email: </label>
-                        <input type="email" id="email" name="email" class="form-control"
-                               placeholder="Email address" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="password" class="sr-only">Password:</label>
-                        <input type="password" id="password" name="password" class="form-control"
-                               placeholder="Password" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
-                        <input type="password" id="repeatedPassword" name="repeatedPassword" class="form-control"
-                               placeholder="Repeat Password" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="name" class="sr-only">First Name: </label>
-                        <input type="text" id="name" name="name" class="form-control"
-                               placeholder="First Name" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="surname" class="sr-only">Last Name: </label>
-                        <input type="text" id="surname" name="surname" class="form-control"
-                               placeholder="Last Name" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="mobile" class="sr-only">Mobile: </label>
-                        <input type="tel" id="mobile" name="mobile" class="form-control"
-                               placeholder="Mobile" required="" autofocus="">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="profileImage" class="sr-only">Profile Picture: </label>
-                        <input type="file" id="profileImage" name="profileImage" class="form-control" accept="image/*">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <label for="city" class="sr-only">City the company is located in: </label>
-                        <select id="city" name="city" required class="form-control">
-                            <option value="" disabled selected>Select your city</option>
-                            <option th:each="city:${cities}"
-                                    th:value="${city.getId()}"
-                                    th:text="${city.getName()}">
-                            </option>
-                        </select>
-                        <label for="warehouse"> Warehouse:</label>
-                        <input id="warehouse" type="text" name="warehouse" class="form-control" readonly/>
-                        <input type="hidden" id="warehouseId" name="warehouse">
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-md-6">
-                    <div class="form-group">
-                        <button type="submit" class="btn btn-primary mt-3">Submit</button>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-<script>
-    document.addEventListener("DOMContentLoaded", function () {
-        var citySelect = document.getElementById("city");
-        var warehouseField = document.getElementById("warehouse");
-        var warehouseId = document.getElementById("warehouseId");
-
-        if (citySelect) {
-            citySelect.addEventListener("change", function () {
-                let selectedCityId = this.value;
-                console.log("City changed, value:", selectedCityId);
-
-                fetch("/admin/warehouse-by-city?cityId=" + selectedCityId)
-                    .then(response => {
-                        if (!response.ok) {
-                            throw new Error("Network response was not ok " + response.statusText);
-                        }
-                        return response.json();
-                    })
-                    .then(data => {
-                        console.log("Fetched warehouse:", data);
-                        warehouseField.value = data.address || "";
-                        warehouseId.value = data.id;
-                    })
-                    .catch(error => {
-                        console.error("Fetch error:", error);
-                    });
-            });
-        }
-    });
-</script>
-
-</body>
-</html>
Index: ckend/src/main/resources/templates/create-order.html
===================================================================
--- backend/src/main/resources/templates/create-order.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,195 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Place an Order</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <style>
-        .scrollable-cards {
-            max-height: 400px;
-            overflow-y: auto;
-        }
-    </style>
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-<div class="container mt-4">
-    <h1>Place Your Order</h1>
-
-    <div class="row mb-3">
-        <div class="col-md-4">
-            <label for="filterCategory" class="form-label">Category</label>
-            <select id="filterCategory" class="form-select">
-                <option value="">All</option>
-                <option th:each="cat : ${categories}"
-                        th:value="${cat.id}"
-                        th:text="${cat.name}">Category</option>
-            </select>
-        </div>
-        <div class="col-md-4">
-            <label for="filterManufacturer" class="form-label">Manufacturer</label>
-            <select id="filterManufacturer" class="form-select">
-                <option value="">All</option>
-                <option th:each="manu : ${manufacturers}"
-                        th:value="${manu.id}"
-                        th:text="${manu.name}">Manufacturer</option>
-            </select>
-        </div>
-        <div class="col-md-4">
-            <label for="filterSearch" class="form-label">Article Name</label>
-            <input type="text" id="filterSearch" class="form-control" placeholder="Search article">
-        </div>
-    </div>
-
-    <div class="scrollable-cards row row-cols-1 row-cols-md-2 row-cols-lg-3 g-3" id="articleContainer">
-        <div class="col" th:each="art : ${articles}"
-             th:attr="data-category=${art.categoryId}, data-manufacturer=${art.manufacturerId}, data-article-name=${art.name}, data-manufacturer-name=${art.manufacturer}">
-            <div class="card h-100">
-                <img th:src="@{${art.image}}" class="card-img-top" alt="Article Image" onerror="this.style.display='none'">
-                <div class="card-body">
-                    <h5 class="card-title" th:text="${art.name}">Article Name</h5>
-                    <p class="card-text">
-                        Manufacturer: <span th:text="${art.manufacturer}">Manufacturer</span><br>
-                        Price: $<span th:text="${art.price}">0.00</span><br>
-                        In Stock: <span th:text="${art.quantity}">0</span>
-                    </p>
-                </div>
-                <div class="card-footer">
-                    <button type="button" class="btn btn-primary btn-sm add-article"
-                            th:data-article-id="${art.id}"
-                            th:data-article-name="${art.name}"
-                            th:data-unit-price="${art.price}"
-                            th:data-available="${art.quantity}">
-                        Add to Order
-                    </button>
-                </div>
-            </div>
-        </div>
-    </div>
-
-    <h3 class="mt-4">Order Summary</h3>
-    <table class="table table-bordered" id="orderSummaryTable">
-        <thead>
-        <tr>
-            <th>Article</th>
-            <th>Unit Price</th>
-            <th>Manufacturer</th>
-            <th>Quantity</th>
-            <th>Line Total</th>
-            <th>Action</th>
-        </tr>
-        </thead>
-        <tbody>
-        </tbody>
-    </table>
-    <div class="mb-3">
-        <label for="totalSum" class="form-label">Total Sum:</label>
-        <span id="totalSum">0.00</span>
-    </div>
-    <div class="mb-3 form-check">
-        <input type="checkbox" class="form-check-input" id="proForma" name="proForma">
-        <label class="form-check-label" for="proForma">Request Pro Forma</label>
-    </div>
-
-    <form id="orderForm" th:action="@{/customer/create-order}" method="post">
-        <input type="hidden" id="orderItems" name="orderItems">
-        <button type="submit" class="btn btn-success">Place Order</button>
-    </form>
-</div>
-
-<div th:replace="~{fragments/footer :: footer}"></div>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-<script>
-    const orderItems = [];
-
-    function updateOrderSummary() {
-        const tbody = document.querySelector('#orderSummaryTable tbody');
-        tbody.innerHTML = '';
-
-        let totalSum = 0;
-        orderItems.forEach((item, index) => {
-            const row = document.createElement('tr');
-            row.innerHTML = `
-        <td>${item.articleName}</td>
-        <td>${item.unitPrice.toFixed(2)}</td>
-        <td>${item.manufacturerName}</td>
-        <td>${item.quantity}</td>
-        <td>${(item.unitPrice * item.quantity).toFixed(2)}</td>
-        <td><button type="button" class="btn btn-danger btn-sm" data-index="${index}">Remove</button></td>
-      `;
-            tbody.appendChild(row);
-            totalSum += item.unitPrice * item.quantity;
-        });
-        document.getElementById('totalSum').textContent = totalSum.toFixed(2);
-        document.getElementById('orderItems').value = JSON.stringify(orderItems);
-    }
-
-    document.querySelectorAll('.add-article').forEach(function(button) {
-        button.addEventListener('click', function() {
-            const articleId = this.getAttribute('data-article-id');
-            const articleName = this.getAttribute('data-article-name');
-            const manufacturerName = this.getAttribute('data-manufacturer-name');
-            const unitPrice = parseFloat(this.getAttribute('data-unit-price'));
-            const available = parseInt(this.getAttribute('data-available'), 10);
-
-            let quantity = prompt("Enter quantity for " + articleName, "1");
-            quantity = parseInt(quantity, 10);
-            if (isNaN(quantity) || quantity <= 0) {
-                alert("Invalid quantity. Item not added.");
-                return;
-            }
-            if (quantity > available) {
-                alert("Quantity exceeds available stock.");
-                return;
-            }
-
-            const orderItem = {
-                articleId: articleId,
-                articleName: articleName,
-                manufacturerName: manufacturerName,
-                unitPrice: unitPrice,
-                quantity: quantity
-            };
-            orderItems.push(orderItem);
-            updateOrderSummary();
-        });
-    });
-
-    document.getElementById('orderSummaryTable').addEventListener('click', function(event) {
-        if (event.target.matches('button')) {
-            const index = event.target.getAttribute('data-index');
-            orderItems.splice(index, 1);
-            updateOrderSummary();
-        }
-    });
-
-    function filterArticles() {
-        const categoryFilter = document.getElementById('filterCategory').value;
-        const manufacturerFilter = document.getElementById('filterManufacturer').value;
-        const searchFilter = document.getElementById('filterSearch').value.toLowerCase();
-
-        document.querySelectorAll('#articleContainer > .col').forEach(function(card) {
-            const cardCategory = card.getAttribute('data-category');
-            const cardManufacturer = card.getAttribute('data-manufacturer');
-            const cardArticleName = card.getAttribute('data-article-name').toLowerCase();
-
-            let matches = true;
-            if (categoryFilter && cardCategory !== categoryFilter) {
-                matches = false;
-            }
-            if (manufacturerFilter && cardManufacturer !== manufacturerFilter) {
-                matches = false;
-            }
-            if (searchFilter && !cardArticleName.includes(searchFilter)) {
-                matches = false;
-            }
-            card.style.display = matches ? 'block' : 'none';
-        });
-    }
-
-    document.getElementById('filterCategory').addEventListener('change', filterArticles);
-    document.getElementById('filterManufacturer').addEventListener('change', filterArticles);
-    document.getElementById('filterSearch').addEventListener('keyup', filterArticles);
-</script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/create-warehouse.html
===================================================================
--- backend/src/main/resources/templates/create-warehouse.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Create Warehouse</title>
-  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/edit-driver.html
===================================================================
--- backend/src/main/resources/templates/edit-driver.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/edit-manager.html
===================================================================
--- backend/src/main/resources/templates/edit-manager.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-</body>
-</html>
Index: ckend/src/main/resources/templates/edit-warehouse.html
===================================================================
--- backend/src/main/resources/templates/edit-warehouse.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Edit Warehouse</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/fragments/footer.html
===================================================================
--- backend/src/main/resources/templates/fragments/footer.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,3 +1,0 @@
-<footer>
-    <p>&copy; 2024 Distributor App</p>
-</footer>
Index: ckend/src/main/resources/templates/fragments/header.html
===================================================================
--- backend/src/main/resources/templates/fragments/header.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,41 +1,0 @@
-<header>
-    <nav>
-        <ul>
-            <li><a th:href="@{/}">Home</a></li>
-
-            <!--Customer-Specific Navigation-->
-            <li th:if="${userType == 'Customer'}">
-                <a th:href="@{/customer/orders}">My Orders</a>
-            </li>
-            <li th:if="${userType == 'Customer'}">
-                <a>Account details</a>
-            </li>
-
-            <!--Manager-Specific Navigation-->
-            <li th:if="${userType == 'Manager'}">
-                <a>Assign Deliveries</a>
-            </li>
-            <li th:if="${userType == 'Manager'}">
-                <a>Monitor Progress</a>
-            </li>
-
-            <!--Driver-Specific Navigation-->
-            <li th:if="${userType == 'Driver'}">
-                <a>Assigned Deliveries</a>
-            </li>
-            <li th:if="${userType == 'Driver'}">
-                <a>My Schedule</a>
-            </li>
-
-            <li th:if="${#authorization.expression('isAuthenticated()')}">
-                <a th:href="@{/logout}">Logout</a>
-            </li>
-            <li th:if="${#authorization.expression('!isAuthenticated()')}">
-                <a th:href="@{/login}">Login</a>
-            </li>
-            <li th:if="${#authorization.expression('!isAuthenticated()')}">
-                <a th:href="@{/register}">Register</a>
-            </li>
-        </ul>
-    </nav>
-</header>
Index: ckend/src/main/resources/templates/fragments/messages.html
===================================================================
--- backend/src/main/resources/templates/fragments/messages.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,6 +1,0 @@
-<div th:if="${message}" class="alert alert-info">
-  <p th:text="${message}"></p>
-</div>
-<div th:if="${error}" class="alert alert-danger">
-  <p th:text="${error}"></p>
-</div>
Index: ckend/src/main/resources/templates/fragments/navbar.html
===================================================================
--- backend/src/main/resources/templates/fragments/navbar.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,73 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org"
-      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<nav th:fragment="navbar" class="navbar navbar-expand-lg navbar-light bg-light">
-    <div class="container-fluid">
-        <a class="navbar-brand" th:href="@{/}">Distributor App</a>
-        <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
-                data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false"
-                aria-label="Toggle navigation">
-            <span class="navbar-toggler-icon"></span>
-        </button>
-        <div class="collapse navbar-collapse" id="navbarNav">
-            <ul class="navbar-nav me-auto">
-                <!--    Links for authenticated users:    -->
-                <li class="nav-item" sec:authorize="isAuthenticated()">
-                    <a class="nav-link" href="/">Profile</a>
-                </li>
-
-                <!--    Links for specific roles:    -->
-                <!--    CUSTOMER    -->
-                <li class="nav-item" sec:authorize="hasRole('CUSTOMER')">
-                    <a class="nav-link" href="/customer/dashboard">Home</a>
-                </li>
-                <li class="nav-item" sec:authorize="hasRole('CUSTOMER')">
-                    <a class="nav-link" href="/customer/create-order">Create an order</a>
-                </li>
-                <!--    MANAGER    -->
-                <li class="nav-item" sec:authorize="hasRole('MANAGER')">
-                    <a class="nav-link" href="/manager/dashboard">Home</a>
-                </li>
-                <li class="nav-item" sec:authorize="hasRole('MANAGER')">
-                    <a class="nav-link" href="/manager/create-delivery">Create a delivery</a>
-                </li>
-                <!--    DRIVER    -->
-                <li class="nav-item" sec:authorize="hasRole('DRIVER')">
-                    <a class="nav-link" href="/driver/dashboard">Home</a>
-                </li>
-                <!--                <li class="nav-item" sec:authorize="hasRole('ADMIN')">-->
-                <!--                    <a class="nav-link" href="/home/admin">Admin Dashboard</a>-->
-                <!--                </li>-->
-                <li class="nav-item" sec:authorize="hasRole('ADMIN')">
-                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
-                       data-bs-toggle="dropdown" aria-expanded="false">Create</a>
-                    <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
-                        <li><a class="dropdown-item" href="/admin/create-driver">Create a Driver</a></li>
-                        <li><a class="dropdown-item" href="/admin/create-manager">Create a Manager</a></li>
-                    </ul>
-                </li>
-            </ul>
-
-            <!--    Login/Logout Links:    -->
-            <ul class="navbar-nav ms-auto">
-                <li class="nav-item" sec:authorize="!isAuthenticated()">
-                    <a class="nav-link" href="/auth/login">Login</a>
-                </li>
-                <li class="nav-item" sec:authorize="isAuthenticated()">
-                    <form th:action="@{/auth/logout}" method="post">
-                        <button type="submit" class="nav-link btn btn-primary">Logout</button>
-                    </form>
-                </li>
-            </ul>
-        </div>
-    </div>
-</nav>
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/home/admin.html
===================================================================
--- backend/src/main/resources/templates/home/admin.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-<div class="container mt-4">
-    <h1>Welcome to the Home Page</h1>
-    <p th:text="'Welcome Admin!'"></p>
-</div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/home/customer.html
===================================================================
--- backend/src/main/resources/templates/home/customer.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,58 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Customer Home</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-<div class="container mt-4">
-    <h1 th:text="'Here is your dashboard '+${customer.getCompName()}" class="mb-4"></h1>
-    <div class="row">
-        <div class="col-md-6">
-            <h2>Your Current Orders</h2>
-            <table class="table table-striped">
-                <thead>
-                <tr>
-                    <th>Order Date</th>
-                    <th>Order Sum</th>
-                    <th>Order Status</th>
-                </tr>
-                </thead>
-                <tbody>
-                <tr th:each="order : ${currentOrders}">
-                    <td th:text="${order.getOrdDate()}"></td>
-                    <td th:text="${order.getOrdSum()}"></td>
-                    <td th:text="${order.getStatusName()}"></td>
-                </tr>
-                </tbody>
-            </table>
-        </div>
-
-        <div class="col-md-6">
-            <h2>Your Current Deliveries</h2>
-            <table class="table table-striped">
-                <thead>
-                <tr>
-                    <th>Delivery Date</th>
-                    <th>Driver Name</th>
-                    <th>Delivery Status</th>
-                </tr>
-                </thead>
-                <tbody>
-                <tr th:each="delivery : ${currentDeliveries}">
-                    <td th:text="${delivery.getDelDate()}"></td>
-                    <td th:text="${delivery.getDriverName()}"></td>
-                    <td th:text="${delivery.getDelStatus()}"></td>
-                </tr>
-                </tbody>
-            </table>
-        </div>
-    </div>
-</div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/home/driver.html
===================================================================
--- backend/src/main/resources/templates/home/driver.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,166 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Driver Home</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <style>
-        .scrollable-table {
-            max-height: 300px;
-            overflow-y: auto;
-        }
-    </style>
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-<div class="container mt-4">
-    <h1 th:text="'Here is your dashboard '+${user.getFirstName()}" class="mb-4"></h1>
-
-    <div class="row">
-        <div class="col-md-6">
-            <h2>New Deliveries</h2>
-            <div class="scrollable-table">
-                <table class="table table-striped">
-                    <thead>
-                    <tr>
-                        <th>Delivery ID</th>
-                        <th>Driver Name</th>
-                        <th>Delivery Date</th>
-                        <th>Action</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr th:each="delivery : ${newDeliveries}">
-                        <td th:text="${delivery.deliveryId}">1</td>
-                        <td th:text="${delivery.driverName}">Driver Name</td>
-                        <td th:text="${delivery.deliveryDate}">2025-02-14</td>
-                        <td>
-                            <button type="button"
-                                    class="btn btn-primary btn-sm start-delivery-btn"
-                                    data-bs-toggle="modal"
-                                    data-bs-target="#startDeliveryModal"
-                                    th:attr="data-delivery-id=${delivery.deliveryId},
-                                    data-driver-name=${delivery.driverName},
-                                    data-delivery-date=${delivery.deliveryDate}">
-                                Start Delivery
-                            </button>
-
-                        </td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-
-        <div class="col-md-6">
-            <h2>Ongoing Deliveries</h2>
-            <div class="scrollable-table">
-                <table class="table table-striped">
-                    <thead>
-                    <tr>
-                        <th>Delivery ID</th>
-                        <th>Driver Name</th>
-                        <th>Delivery Date</th>
-                        <th>Action</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr th:each="delivery : ${ongoingDeliveries}">
-                        <td th:text="${delivery.deliveryId}">1</td>
-                        <td th:text="${delivery.driverName}">Driver Name</td>
-                        <td th:text="${delivery.deliveryDate}">2025-02-14</td>
-                        <td>
-                            <button type="button"
-                                    class="btn btn-danger btn-sm end-delivery-btn"
-                                    data-bs-toggle="modal"
-                                    data-bs-target="#endDeliveryModal"
-                                    th:attr="data-delivery-id=${delivery.deliveryId}">
-                                End Delivery
-                            </button>
-                        </td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-    </div>
-</div>
-
-<div class="modal fade" id="startDeliveryModal" tabindex="-1" aria-labelledby="startDeliveryModalLabel"
-     aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <form th:action="@{/driver/start-delivery}" method="post" th:object="${startDelivery}">
-                <div class="modal-header">
-                    <h5 class="modal-title" id="startDeliveryModalLabel">Enter Delivery Details</h5>
-                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-                </div>
-                <div class="modal-body">
-                    <!-- Hidden input for the delivery ID -->
-                    <input type="hidden" name="deliveryId" th:field="*{id}" id="modalDeliveryId"/>
-
-                    <!-- Odometer Reading at Start (maps to delStartKm) -->
-                    <div class="mb-3">
-                        <label for="delStartKm" class="form-label">Odometer Start (Km)</label>
-                        <input type="number" name="delStartKm" id="delStartKm" class="form-control" required>
-                    </div>
-
-                    <div class="mb-3">
-                        <p id="modalDeliveryInfo"></p>
-                    </div>
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
-                    <button type="submit" class="btn btn-primary">Start Delivery</button>
-                </div>
-            </form>
-        </div>
-    </div>
-</div>
-
-<div class="modal fade" id="endDeliveryModal" tabindex="-1" aria-labelledby="endDeliveryModalLabel" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <form th:action="@{/driver/end-delivery}" method="post" th:object="${endDelivery}">
-                <div class="modal-header">
-                    <h5 class="modal-title" id="endDeliveryModalLabel">Finish Delivery</h5>
-                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
-                </div>
-                <div class="modal-body">
-                    <input type="hidden" th:field="*{id}" id="endDeliveryId" />
-
-                    <div class="mb-3">
-                        <label for="delEndKm" class="form-label">Odometer End (Km)</label>
-                        <input type="number" th:field="*{delEndKm}" id="delEndKm" class="form-control" required>
-                    </div>
-
-                </div>
-                <div class="modal-footer">
-                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
-                    <button type="submit" class="btn btn-primary">Finish Delivery</button>
-                </div>
-            </form>
-        </div>
-    </div>
-</div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-<script>
-    document.querySelectorAll('.start-delivery-btn').forEach(function (button) {
-        button.addEventListener('click', function () {
-            const deliveryId = this.getAttribute('data-delivery-id');
-            const driverName = this.getAttribute('data-driver-name');
-            const deliveryDate = this.getAttribute('data-delivery-date');
-            document.getElementById('modalDeliveryId').value = deliveryId;
-            document.getElementById('modalDeliveryInfo').textContent =
-                "Delivery Date: " + deliveryDate + " | Driver: " + driverName;
-        });
-    });
-    document.querySelectorAll('.end-delivery-btn').forEach(function(button) {
-        button.addEventListener('click', function() {
-            document.getElementById('endDeliveryId').value = this.getAttribute('data-delivery-id');
-        });
-    });
-</script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/home/manager.html
===================================================================
--- backend/src/main/resources/templates/home/manager.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,113 +1,0 @@
-<!DOCTYPE html>
-<html lang="en" xmlns:th="http://www.thymeleaf.org">
-<head>
-    <meta charset="UTF-8">
-    <title>Manager Home</title>
-    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
-    <style>
-        .scrollable-table {
-            max-height: 300px;
-            overflow-y: auto;
-        }
-    </style>
-</head>
-<body>
-<div th:replace="~{fragments/navbar :: navbar}"></div>
-
-<div class="container mt-4">
-    <h1 th:text="'Here is your dashboard '+${user.getFirstName()}"></h1>
-    <div class="row">
-        <div class="col-md-6">
-            <h2> Current inventory</h2>
-            <div class="scrollable-table">
-                <table class="table table-striped">
-                    <thead>
-                    <tr>
-                        <th>Article</th>
-                        <th>Manufacturer</th>
-                        <th>Quantity</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr th:each="inventory : ${currentInventory}">
-                        <td th:text="${inventory.getArticleName()}"></td>
-                        <td th:text="${inventory.getManufacturerName()}"></td>
-                        <td th:text="${inventory.getTotalUnits()}"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-        <div class="col-md-6">
-            <h2>Vehicle Status</h2>
-            <div class="scrollable-table">
-                <table class="table table-striped">
-                    <thead>
-                    <tr>
-                        <th>Vehicle plate</th>
-                        <th>Registration Date</th>
-                        <th>Driver Name</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr th:each="vehicle : ${vehicleStatus}">
-                        <td th:text="${vehicle.getPlate()}"></td>
-                        <td th:text="${vehicle.getRegistrationDate()}"></td>
-                        <td th:text="${vehicle.getDriverName()}"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-    </div>
-
-    <div class="row mt-4">
-        <div class="col-md-6">
-            <h2>New Orders</h2>
-            <div class="scrollable-table">
-                <table class="table table-striped">
-                    <thead>
-                    <tr>
-                        <th>Customer</th>
-                        <th>Order Date</th>
-                        <th>Order Sum</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr th:each="order : ${newOrders}">
-                        <td th:text="${order.getCustomerName()}"></td>
-                        <td th:text="${order.getOrdDate()}"></td>
-                        <td th:text="${order.getOrdSum()}"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-
-        <div class="col-md-6">
-            <h2>Current Deliveries</h2>
-            <div class="scrollable-table">
-                <table class="table table-striped">
-                    <thead>
-                    <tr>
-                        <th>Delivery Driver</th>
-                        <th>Delivery Start Time</th>
-                        <th>Delivery Status</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr th:each="delivery : ${currentDeliveries}">
-                        <td th:text="${delivery.getDriverName()}"></td>
-                        <td th:text="${delivery.getDelStartTime()}"></td>
-                        <td th:text="${delivery.getDelStatus()}"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-    </div>
-</div>
-
-<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
-</body>
-</html>
Index: ckend/src/main/resources/templates/start-delivery-1.html
===================================================================
--- backend/src/main/resources/templates/start-delivery-1.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>Title</title>
-</head>
-<body>
-
-</body>
-</html>
Index: stributor-app-frontend/.editorconfig
===================================================================
--- distributor-app-frontend/.editorconfig	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,17 +1,0 @@
-# Editor configuration, see https://editorconfig.org
-root = true
-
-[*]
-charset = utf-8
-indent_style = space
-indent_size = 2
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.ts]
-quote_type = single
-ij_typescript_use_double_quotes = false
-
-[*.md]
-max_line_length = off
-trim_trailing_whitespace = false
Index: stributor-app-frontend/.gitignore
===================================================================
--- distributor-app-frontend/.gitignore	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,42 +1,0 @@
-# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
-
-# Compiled output
-/dist
-/tmp
-/out-tsc
-/bazel-out
-
-# Node
-/node_modules
-npm-debug.log
-yarn-error.log
-
-# IDEs and editors
-.idea/
-.project
-.classpath
-.c9/
-*.launch
-.settings/
-*.sublime-workspace
-
-# Visual Studio Code
-.vscode/*
-!.vscode/settings.json
-!.vscode/tasks.json
-!.vscode/launch.json
-!.vscode/extensions.json
-.history/*
-
-# Miscellaneous
-/.angular/cache
-.sass-cache/
-/connect.lock
-/coverage
-/libpeerconnection.log
-testem.log
-/typings
-
-# System files
-.DS_Store
-Thumbs.db
Index: stributor-app-frontend/README.md
===================================================================
--- distributor-app-frontend/README.md	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,59 +1,0 @@
-# DistributorAppFrontend
-
-This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.0.5.
-
-## Development server
-
-To start a local development server, run:
-
-```bash
-ng serve
-```
-
-Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
-
-## Code scaffolding
-
-Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
-
-```bash
-ng generate component component-name
-```
-
-For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
-
-```bash
-ng generate --help
-```
-
-## Building
-
-To build the project run:
-
-```bash
-ng build
-```
-
-This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
-
-## Running unit tests
-
-To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
-
-```bash
-ng test
-```
-
-## Running end-to-end tests
-
-For end-to-end (e2e) testing, run:
-
-```bash
-ng e2e
-```
-
-Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
-
-## Additional Resources
-
-For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
Index: stributor-app-frontend/angular.json
===================================================================
--- distributor-app-frontend/angular.json	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,107 +1,0 @@
-{
-  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
-  "version": 1,
-  "newProjectRoot": "projects",
-  "projects": {
-    "distributor-app-frontend": {
-      "projectType": "application",
-      "schematics": {},
-      "root": "",
-      "sourceRoot": "src",
-      "prefix": "app",
-      "architect": {
-        "build": {
-          "builder": "@angular-devkit/build-angular:application",
-          "options": {
-            "outputPath": "dist/distributor-app-frontend",
-            "index": "src/index.html",
-            "browser": "src/main.ts",
-            "polyfills": [
-              "zone.js"
-            ],
-            "tsConfig": "tsconfig.app.json",
-            "assets": [
-              {
-                "glob": "**/*",
-                "input": "public"
-              }
-            ],
-            "styles": [
-              "src/styles.css"
-            ],
-            "scripts": [],
-            "server": "src/main.server.ts",
-            "outputMode": "server",
-            "ssr": {
-              "entry": "src/server.ts"
-            }
-          },
-          "configurations": {
-            "production": {
-              "budgets": [
-                {
-                  "type": "initial",
-                  "maximumWarning": "500kB",
-                  "maximumError": "1MB"
-                },
-                {
-                  "type": "anyComponentStyle",
-                  "maximumWarning": "4kB",
-                  "maximumError": "8kB"
-                }
-              ],
-              "outputHashing": "all"
-            },
-            "development": {
-              "optimization": false,
-              "extractLicenses": false,
-              "sourceMap": true,
-              "fileReplacements": [
-                {
-                  "replace": "src/environments/environment.ts",
-                  "with": "src/environments/environment.development.ts"
-                }
-              ]
-            }
-          },
-          "defaultConfiguration": "production"
-        },
-        "serve": {
-          "builder": "@angular-devkit/build-angular:dev-server",
-          "configurations": {
-            "production": {
-              "buildTarget": "distributor-app-frontend:build:production"
-            },
-            "development": {
-              "buildTarget": "distributor-app-frontend:build:development"
-            }
-          },
-          "defaultConfiguration": "development"
-        },
-        "extract-i18n": {
-          "builder": "@angular-devkit/build-angular:extract-i18n"
-        },
-        "test": {
-          "builder": "@angular-devkit/build-angular:karma",
-          "options": {
-            "polyfills": [
-              "zone.js",
-              "zone.js/testing"
-            ],
-            "tsConfig": "tsconfig.spec.json",
-            "assets": [
-              {
-                "glob": "**/*",
-                "input": "public"
-              }
-            ],
-            "styles": [
-              "src/styles.css"
-            ],
-            "scripts": []
-          }
-        }
-      }
-    }
-  }
-}
Index: stributor-app-frontend/package-lock.json
===================================================================
--- distributor-app-frontend/package-lock.json	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,14612 +1,0 @@
-{
-  "name": "distributor-app-frontend",
-  "version": "0.0.0",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "distributor-app-frontend",
-      "version": "0.0.0",
-      "dependencies": {
-        "@angular/animations": "^19.0.0",
-        "@angular/common": "^19.0.0",
-        "@angular/compiler": "^19.0.0",
-        "@angular/core": "^19.0.0",
-        "@angular/forms": "^19.0.0",
-        "@angular/platform-browser": "^19.0.0",
-        "@angular/platform-browser-dynamic": "^19.0.0",
-        "@angular/platform-server": "^19.0.0",
-        "@angular/router": "^19.0.0",
-        "@angular/ssr": "^19.0.5",
-        "express": "^4.18.2",
-        "rxjs": "~7.8.0",
-        "tslib": "^2.3.0",
-        "zone.js": "~0.15.0"
-      },
-      "devDependencies": {
-        "@angular-devkit/build-angular": "^19.0.5",
-        "@angular/cli": "^19.0.5",
-        "@angular/compiler-cli": "^19.0.0",
-        "@types/express": "^4.17.17",
-        "@types/jasmine": "~5.1.0",
-        "@types/node": "^18.18.0",
-        "jasmine-core": "~5.4.0",
-        "karma": "~6.4.0",
-        "karma-chrome-launcher": "~3.2.0",
-        "karma-coverage": "~2.2.0",
-        "karma-jasmine": "~5.1.0",
-        "karma-jasmine-html-reporter": "~2.1.0",
-        "typescript": "~5.6.2"
-      }
-    },
-    "node_modules/@ampproject/remapping": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
-      "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@angular-devkit/architect": {
-      "version": "0.1900.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1900.6.tgz",
-      "integrity": "sha512-w11bAXQnNWBawTJfQPjvaTRrzrqsOUm9tK9WNvaia/xjiRFpmO0CfmKtn3axNSEJM8jb/czaNQrgTwG+TGc/8g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@angular-devkit/core": "19.0.6",
-        "rxjs": "7.8.1"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      }
-    },
-    "node_modules/@angular-devkit/build-angular": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-19.0.6.tgz",
-      "integrity": "sha512-dWTAsE6BSI8z0xglQdYBdqTBwg1Q+RWE3OrmlGs+520Dcoq/F0Z41Y1F3MiuHuQPdDAIQr88iB0APkIRW4clMg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@ampproject/remapping": "2.3.0",
-        "@angular-devkit/architect": "0.1900.6",
-        "@angular-devkit/build-webpack": "0.1900.6",
-        "@angular-devkit/core": "19.0.6",
-        "@angular/build": "19.0.6",
-        "@babel/core": "7.26.0",
-        "@babel/generator": "7.26.2",
-        "@babel/helper-annotate-as-pure": "7.25.9",
-        "@babel/helper-split-export-declaration": "7.24.7",
-        "@babel/plugin-transform-async-generator-functions": "7.25.9",
-        "@babel/plugin-transform-async-to-generator": "7.25.9",
-        "@babel/plugin-transform-runtime": "7.25.9",
-        "@babel/preset-env": "7.26.0",
-        "@babel/runtime": "7.26.0",
-        "@discoveryjs/json-ext": "0.6.3",
-        "@ngtools/webpack": "19.0.6",
-        "@vitejs/plugin-basic-ssl": "1.1.0",
-        "ansi-colors": "4.1.3",
-        "autoprefixer": "10.4.20",
-        "babel-loader": "9.2.1",
-        "browserslist": "^4.21.5",
-        "copy-webpack-plugin": "12.0.2",
-        "css-loader": "7.1.2",
-        "esbuild-wasm": "0.24.0",
-        "fast-glob": "3.3.2",
-        "http-proxy-middleware": "3.0.3",
-        "istanbul-lib-instrument": "6.0.3",
-        "jsonc-parser": "3.3.1",
-        "karma-source-map-support": "1.4.0",
-        "less": "4.2.0",
-        "less-loader": "12.2.0",
-        "license-webpack-plugin": "4.0.2",
-        "loader-utils": "3.3.1",
-        "mini-css-extract-plugin": "2.9.2",
-        "open": "10.1.0",
-        "ora": "5.4.1",
-        "picomatch": "4.0.2",
-        "piscina": "4.7.0",
-        "postcss": "8.4.49",
-        "postcss-loader": "8.1.1",
-        "resolve-url-loader": "5.0.0",
-        "rxjs": "7.8.1",
-        "sass": "1.80.7",
-        "sass-loader": "16.0.3",
-        "semver": "7.6.3",
-        "source-map-loader": "5.0.0",
-        "source-map-support": "0.5.21",
-        "terser": "5.36.0",
-        "tree-kill": "1.2.2",
-        "tslib": "2.8.1",
-        "webpack": "5.96.1",
-        "webpack-dev-middleware": "7.4.2",
-        "webpack-dev-server": "5.1.0",
-        "webpack-merge": "6.0.1",
-        "webpack-subresource-integrity": "5.1.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      },
-      "optionalDependencies": {
-        "esbuild": "0.24.0"
-      },
-      "peerDependencies": {
-        "@angular/compiler-cli": "^19.0.0",
-        "@angular/localize": "^19.0.0",
-        "@angular/platform-server": "^19.0.0",
-        "@angular/service-worker": "^19.0.0",
-        "@angular/ssr": "^19.0.6",
-        "@web/test-runner": "^0.19.0",
-        "browser-sync": "^3.0.2",
-        "jest": "^29.5.0",
-        "jest-environment-jsdom": "^29.5.0",
-        "karma": "^6.3.0",
-        "ng-packagr": "^19.0.0",
-        "protractor": "^7.0.0",
-        "tailwindcss": "^2.0.0 || ^3.0.0",
-        "typescript": ">=5.5 <5.7"
-      },
-      "peerDependenciesMeta": {
-        "@angular/localize": {
-          "optional": true
-        },
-        "@angular/platform-server": {
-          "optional": true
-        },
-        "@angular/service-worker": {
-          "optional": true
-        },
-        "@angular/ssr": {
-          "optional": true
-        },
-        "@web/test-runner": {
-          "optional": true
-        },
-        "browser-sync": {
-          "optional": true
-        },
-        "jest": {
-          "optional": true
-        },
-        "jest-environment-jsdom": {
-          "optional": true
-        },
-        "karma": {
-          "optional": true
-        },
-        "ng-packagr": {
-          "optional": true
-        },
-        "protractor": {
-          "optional": true
-        },
-        "tailwindcss": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@angular-devkit/build-webpack": {
-      "version": "0.1900.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1900.6.tgz",
-      "integrity": "sha512-WehtVrbBow4fc7hsaUKb+BZ6MDE5lO98/tgv7GR5PkRdGKnyLA0pW1AfPLJJQDgcaKjneramMhDFNc1eGSX0mQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@angular-devkit/architect": "0.1900.6",
-        "rxjs": "7.8.1"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      },
-      "peerDependencies": {
-        "webpack": "^5.30.0",
-        "webpack-dev-server": "^5.0.2"
-      }
-    },
-    "node_modules/@angular-devkit/core": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.0.6.tgz",
-      "integrity": "sha512-WUWJhzQDsovfMY6jtb9Ktz/5sJszsaErj+XV2aXab85f1OweI/Iv2urPZnJwUSilvVN5Ok/fy3IJ6SuihK4Ceg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "8.17.1",
-        "ajv-formats": "3.0.1",
-        "jsonc-parser": "3.3.1",
-        "picomatch": "4.0.2",
-        "rxjs": "7.8.1",
-        "source-map": "0.7.4"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      },
-      "peerDependencies": {
-        "chokidar": "^4.0.0"
-      },
-      "peerDependenciesMeta": {
-        "chokidar": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@angular-devkit/schematics": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.0.6.tgz",
-      "integrity": "sha512-R9hlHfAh1HKoIWgnYJlOEKhUezhTNl0fpUmHxG2252JSY5FLRxmYArTtJYYmbNdBbsBLNg3UHyM/GBPvJSA3NQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@angular-devkit/core": "19.0.6",
-        "jsonc-parser": "3.3.1",
-        "magic-string": "0.30.12",
-        "ora": "5.4.1",
-        "rxjs": "7.8.1"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      }
-    },
-    "node_modules/@angular/animations": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.0.5.tgz",
-      "integrity": "sha512-HCOF2CrhUvjoZWusd4nh32VOxpUrg6bV+3Z8Q36Ix3aZdni8v0qoP2rl5wGbotaPtYg5RtyDH60Z2AOPKqlrZg==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/core": "19.0.5"
-      }
-    },
-    "node_modules/@angular/build": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@angular/build/-/build-19.0.6.tgz",
-      "integrity": "sha512-KEVNLgTZUF2dfpOYQn+yR2HONHUTxq/2rFVhiK9qAvrm/m+uKJNEXx7hGtbRyoqenZff4ScJq+7feITUldfX8g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@ampproject/remapping": "2.3.0",
-        "@angular-devkit/architect": "0.1900.6",
-        "@babel/core": "7.26.0",
-        "@babel/helper-annotate-as-pure": "7.25.9",
-        "@babel/helper-split-export-declaration": "7.24.7",
-        "@babel/plugin-syntax-import-attributes": "7.26.0",
-        "@inquirer/confirm": "5.0.2",
-        "@vitejs/plugin-basic-ssl": "1.1.0",
-        "beasties": "0.1.0",
-        "browserslist": "^4.23.0",
-        "esbuild": "0.24.0",
-        "fast-glob": "3.3.2",
-        "https-proxy-agent": "7.0.5",
-        "istanbul-lib-instrument": "6.0.3",
-        "listr2": "8.2.5",
-        "magic-string": "0.30.12",
-        "mrmime": "2.0.0",
-        "parse5-html-rewriting-stream": "7.0.0",
-        "picomatch": "4.0.2",
-        "piscina": "4.7.0",
-        "rollup": "4.26.0",
-        "sass": "1.80.7",
-        "semver": "7.6.3",
-        "vite": "5.4.11",
-        "watchpack": "2.4.2"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      },
-      "optionalDependencies": {
-        "lmdb": "3.1.5"
-      },
-      "peerDependencies": {
-        "@angular/compiler": "^19.0.0",
-        "@angular/compiler-cli": "^19.0.0",
-        "@angular/localize": "^19.0.0",
-        "@angular/platform-server": "^19.0.0",
-        "@angular/service-worker": "^19.0.0",
-        "@angular/ssr": "^19.0.6",
-        "less": "^4.2.0",
-        "postcss": "^8.4.0",
-        "tailwindcss": "^2.0.0 || ^3.0.0",
-        "typescript": ">=5.5 <5.7"
-      },
-      "peerDependenciesMeta": {
-        "@angular/localize": {
-          "optional": true
-        },
-        "@angular/platform-server": {
-          "optional": true
-        },
-        "@angular/service-worker": {
-          "optional": true
-        },
-        "@angular/ssr": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "postcss": {
-          "optional": true
-        },
-        "tailwindcss": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@angular/cli": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-19.0.6.tgz",
-      "integrity": "sha512-ZEHhgRRVIdn10dbsAjB8TE9Co32hfuL9/im5Jcfa1yrn6KJefmigz6KN8Xu7FXMH5FkdqfQ11QpLBxJSPb9aww==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@angular-devkit/architect": "0.1900.6",
-        "@angular-devkit/core": "19.0.6",
-        "@angular-devkit/schematics": "19.0.6",
-        "@inquirer/prompts": "7.1.0",
-        "@listr2/prompt-adapter-inquirer": "2.0.18",
-        "@schematics/angular": "19.0.6",
-        "@yarnpkg/lockfile": "1.1.0",
-        "ini": "5.0.0",
-        "jsonc-parser": "3.3.1",
-        "listr2": "8.2.5",
-        "npm-package-arg": "12.0.0",
-        "npm-pick-manifest": "10.0.0",
-        "pacote": "20.0.0",
-        "resolve": "1.22.8",
-        "semver": "7.6.3",
-        "symbol-observable": "4.0.0",
-        "yargs": "17.7.2"
-      },
-      "bin": {
-        "ng": "bin/ng.js"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      }
-    },
-    "node_modules/@angular/common": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.0.5.tgz",
-      "integrity": "sha512-fFK+euCj1AjBHBCpj9VnduMSeqoMRhZZHbhPYiND7tucRRJ8vwGU0sYK2KI/Ko+fsrNIXL/0O4F36jVPl09Smg==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/core": "19.0.5",
-        "rxjs": "^6.5.3 || ^7.4.0"
-      }
-    },
-    "node_modules/@angular/compiler": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.0.5.tgz",
-      "integrity": "sha512-S8ku5Ljp0kqX3shfmE9DVo09629jeYJSlBRGbj2Glb92dd+VQZPOz7KxqKRTwmAl7lQIV/+4Lr6G/GVTsoC4vg==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/core": "19.0.5"
-      },
-      "peerDependenciesMeta": {
-        "@angular/core": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@angular/compiler-cli": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-19.0.5.tgz",
-      "integrity": "sha512-KSzuWCTZlvJsoAenxM9cjTOzNM8mrFxDBInj0KVPz7QU83amGS4rcv1pWO/QGYQcErfskcN84TAdMegaRWWCmA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/core": "7.26.0",
-        "@jridgewell/sourcemap-codec": "^1.4.14",
-        "chokidar": "^4.0.0",
-        "convert-source-map": "^1.5.1",
-        "reflect-metadata": "^0.2.0",
-        "semver": "^7.0.0",
-        "tslib": "^2.3.0",
-        "yargs": "^17.2.1"
-      },
-      "bin": {
-        "ng-xi18n": "bundles/src/bin/ng_xi18n.js",
-        "ngc": "bundles/src/bin/ngc.js",
-        "ngcc": "bundles/ngcc/index.js"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/compiler": "19.0.5",
-        "typescript": ">=5.5 <5.7"
-      }
-    },
-    "node_modules/@angular/core": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.0.5.tgz",
-      "integrity": "sha512-Ywc6sPO6G/Y1stfk3y/MallV/h0yzQ0vdOHRWueLrk5kD1DTdbolV4X03Cs3PuVvravgcSVE3nnuuHFuH32emQ==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "rxjs": "^6.5.3 || ^7.4.0",
-        "zone.js": "~0.15.0"
-      }
-    },
-    "node_modules/@angular/forms": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.0.5.tgz",
-      "integrity": "sha512-OhNFkfOoguqCDq07vNBV28FFrmTM8S11Z3Cd6PQZJJF9TgAtpV5KtF7A3eXBCN92W4pmqluomPjfK7YyImzIYQ==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/common": "19.0.5",
-        "@angular/core": "19.0.5",
-        "@angular/platform-browser": "19.0.5",
-        "rxjs": "^6.5.3 || ^7.4.0"
-      }
-    },
-    "node_modules/@angular/platform-browser": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.0.5.tgz",
-      "integrity": "sha512-41+Jo5DEil4Ifvv+UE/p1l9YJtYN+xfhx+/C9cahVgvV5D2q+givyK73d0Mnb6XOfe1q+hoV5lZ+XhQYp21//g==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/animations": "19.0.5",
-        "@angular/common": "19.0.5",
-        "@angular/core": "19.0.5"
-      },
-      "peerDependenciesMeta": {
-        "@angular/animations": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@angular/platform-browser-dynamic": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.0.5.tgz",
-      "integrity": "sha512-KKFdue/uJVxkWdrntRAXkz+ycp4nD3SuGOH5pPf2svCBxieuHuFlWDi+DYVuFSEpC/ICCmlhrtzIAm44A4qzzQ==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/common": "19.0.5",
-        "@angular/compiler": "19.0.5",
-        "@angular/core": "19.0.5",
-        "@angular/platform-browser": "19.0.5"
-      }
-    },
-    "node_modules/@angular/platform-server": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-19.0.5.tgz",
-      "integrity": "sha512-fcJ4L9sLYW/5LBL/mCxjWMyLhOX3EJVY9ldzVNbRlzD4DRhPfUgVJwgYYlCVvWZclnCH4CdUo+VrshWMZF5NJQ==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0",
-        "xhr2": "^0.2.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/animations": "19.0.5",
-        "@angular/common": "19.0.5",
-        "@angular/compiler": "19.0.5",
-        "@angular/core": "19.0.5",
-        "@angular/platform-browser": "19.0.5"
-      }
-    },
-    "node_modules/@angular/router": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.0.5.tgz",
-      "integrity": "sha512-6tNubVVj/rRyTg+OXjQxACfufvCLHAwDQtv9wqt6q/3OYSnysHTik3ho3FaFPwu7fXJ+6p9Rjzkh2VY9QMk4bw==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0"
-      },
-      "peerDependencies": {
-        "@angular/common": "19.0.5",
-        "@angular/core": "19.0.5",
-        "@angular/platform-browser": "19.0.5",
-        "rxjs": "^6.5.3 || ^7.4.0"
-      }
-    },
-    "node_modules/@angular/ssr": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@angular/ssr/-/ssr-19.0.6.tgz",
-      "integrity": "sha512-T9UfqqaWw9OKzJI+2RELMqPDD3uFtJt4CLBWDQIeG1GR51RFM4K7oeP+oQ14ohe9w/Ysyh1s1KyXAY+Vaaggbw==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.3.0"
-      },
-      "peerDependencies": {
-        "@angular/common": "^19.0.0",
-        "@angular/core": "^19.0.0",
-        "@angular/platform-server": "^19.0.0",
-        "@angular/router": "^19.0.0"
-      }
-    },
-    "node_modules/@babel/code-frame": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
-      "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.25.9",
-        "js-tokens": "^4.0.0",
-        "picocolors": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz",
-      "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
-      "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
-      "dev": true,
-      "license": "MIT",
-      "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.3",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/babel"
-      }
-    },
-    "node_modules/@babel/core/node_modules/convert-source-map": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@babel/core/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/generator": {
-      "version": "7.26.2",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
-      "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
-      "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
-      "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
-      "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz",
-      "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.25.9",
-        "regexpu-core": "^6.2.0",
-        "semver": "^6.3.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
-      "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@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"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
-      }
-    },
-    "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
-      "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
-      "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
-      "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.25.9",
-        "@babel/helper-validator-identifier": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
-      "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
-      "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
-      "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.25.9",
-        "@babel/helper-wrap-function": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-replace-supers": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
-      "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-member-expression-to-functions": "^7.25.9",
-        "@babel/helper-optimise-call-expression": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
-      "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.24.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
-      "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.24.7"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-string-parser": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
-      "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
-      "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-option": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
-      "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-wrap-function": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
-      "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/template": "^7.25.9",
-        "@babel/traverse": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
-      "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz",
-      "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/types": "^7.26.3"
-      },
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
-      "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
-      "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
-      "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
-      "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
-        "@babel/plugin-transform-optional-chaining": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.13.0"
-      }
-    },
-    "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
-      "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-proposal-private-property-in-object": {
-      "version": "7.21.0-placeholder-for-preset-env.2",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
-      "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-import-assertions": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
-      "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
-      "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
-      "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.18.6",
-        "@babel/helper-plugin-utils": "^7.18.6"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
-      "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-async-generator-functions": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
-      "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-remap-async-to-generator": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
-      "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-imports": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-remap-async-to-generator": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
-      "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
-      "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-class-properties": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
-      "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-class-static-block": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
-      "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.12.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
-      "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
-      "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/template": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
-      "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
-      "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
-      "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
-      "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-dynamic-import": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
-      "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz",
-      "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-export-namespace-from": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
-      "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
-      "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
-      "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-compilation-targets": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/traverse": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-json-strings": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
-      "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
-      "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
-      "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
-      "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
-      "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz",
-      "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.26.0",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
-      "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
-      "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-module-transforms": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
-      "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
-      "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
-      "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-numeric-separator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
-      "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-object-rest-spread": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
-      "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-compilation-targets": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/plugin-transform-parameters": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
-      "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-replace-supers": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
-      "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-optional-chaining": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
-      "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
-      "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-private-methods": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
-      "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-private-property-in-object": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
-      "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
-      "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
-      "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "regenerator-transform": "^0.15.2"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-regexp-modifiers": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz",
-      "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
-      "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-runtime": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz",
-      "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
-      "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
-      "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
-      "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
-      "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
-      "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
-      "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
-      "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
-      "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
-      "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.25.9",
-        "@babel/helper-plugin-utils": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/preset-env": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz",
-      "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/preset-env/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/preset-modules": {
-      "version": "0.1.6-no-external-plugins",
-      "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
-      "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.0.0",
-        "@babel/types": "^7.4.4",
-        "esutils": "^2.0.2"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
-      }
-    },
-    "node_modules/@babel/runtime": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
-      "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "regenerator-runtime": "^0.14.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/template": {
-      "version": "7.25.9",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
-      "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.25.9",
-        "@babel/parser": "^7.25.9",
-        "@babel/types": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.26.4",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz",
-      "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.26.2",
-        "@babel/generator": "^7.26.3",
-        "@babel/parser": "^7.26.3",
-        "@babel/template": "^7.25.9",
-        "@babel/types": "^7.26.3",
-        "debug": "^4.3.1",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse/node_modules/@babel/generator": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz",
-      "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/parser": "^7.26.3",
-        "@babel/types": "^7.26.3",
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25",
-        "jsesc": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.26.3",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz",
-      "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-string-parser": "^7.25.9",
-        "@babel/helper-validator-identifier": "^7.25.9"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@colors/colors": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
-      "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.1.90"
-      }
-    },
-    "node_modules/@discoveryjs/json-ext": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz",
-      "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.17.0"
-      }
-    },
-    "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz",
-      "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz",
-      "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-arm64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz",
-      "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/android-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz",
-      "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz",
-      "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/darwin-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz",
-      "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz",
-      "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz",
-      "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz",
-      "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-arm64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz",
-      "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ia32": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz",
-      "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz",
-      "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz",
-      "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz",
-      "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz",
-      "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-s390x": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz",
-      "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/linux-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz",
-      "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz",
-      "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-arm64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz",
-      "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz",
-      "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/sunos-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz",
-      "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-arm64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz",
-      "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-ia32": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz",
-      "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@esbuild/win32-x64": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz",
-      "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/checkbox": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.4.tgz",
-      "integrity": "sha512-fYAKCAcGNMdfjL6hZTRUwkIByQ8EIZCXKrIQZH7XjADnN/xvRUhj8UdBbpC4zoUzvChhkSC/zRKaP/tDs3dZpg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/figures": "^1.0.9",
-        "@inquirer/type": "^3.0.2",
-        "ansi-escapes": "^4.3.2",
-        "yoctocolors-cjs": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/confirm": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.0.2.tgz",
-      "integrity": "sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.0",
-        "@inquirer/type": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/core": {
-      "version": "10.1.2",
-      "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.2.tgz",
-      "integrity": "sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/figures": "^1.0.9",
-        "@inquirer/type": "^3.0.2",
-        "ansi-escapes": "^4.3.2",
-        "cli-width": "^4.1.0",
-        "mute-stream": "^2.0.0",
-        "signal-exit": "^4.1.0",
-        "strip-ansi": "^6.0.1",
-        "wrap-ansi": "^6.2.0",
-        "yoctocolors-cjs": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/editor": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.1.tgz",
-      "integrity": "sha512-xn9aDaiP6nFa432i68JCaL302FyL6y/6EG97nAtfIPnWZ+mWPgCMLGc4XZ2QQMsZtu9q3Jd5AzBPjXh10aX9kA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/type": "^3.0.2",
-        "external-editor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/expand": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.4.tgz",
-      "integrity": "sha512-GYocr+BPyxKPxQ4UZyNMqZFSGKScSUc0Vk17II3J+0bDcgGsQm0KYQNooN1Q5iBfXsy3x/VWmHGh20QnzsaHwg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/type": "^3.0.2",
-        "yoctocolors-cjs": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/figures": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.9.tgz",
-      "integrity": "sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/input": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.1.tgz",
-      "integrity": "sha512-nAXAHQndZcXB+7CyjIW3XuQZZHbQQ0q8LX6miY6bqAWwDzNa9JUioDBYrFmOUNIsuF08o1WT/m2gbBXvBhYVxg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/type": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/number": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.4.tgz",
-      "integrity": "sha512-DX7a6IXRPU0j8kr2ovf+QaaDiIf+zEKaZVzCWdLOTk7XigqSXvoh4cul7x68xp54WTQrgSnW7P1WBJDbyY3GhA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/type": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/password": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.4.tgz",
-      "integrity": "sha512-wiliQOWdjM8FnBmdIHtQV2Ca3S1+tMBUerhyjkRCv1g+4jSvEweGu9GCcvVEgKDhTBT15nrxvk5/bVrGUqSs1w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/type": "^3.0.2",
-        "ansi-escapes": "^4.3.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/prompts": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.1.0.tgz",
-      "integrity": "sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/checkbox": "^4.0.2",
-        "@inquirer/confirm": "^5.0.2",
-        "@inquirer/editor": "^4.1.0",
-        "@inquirer/expand": "^4.0.2",
-        "@inquirer/input": "^4.0.2",
-        "@inquirer/number": "^3.0.2",
-        "@inquirer/password": "^4.0.2",
-        "@inquirer/rawlist": "^4.0.2",
-        "@inquirer/search": "^3.0.2",
-        "@inquirer/select": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/rawlist": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.4.tgz",
-      "integrity": "sha512-IsVN2EZdNHsmFdKWx9HaXb8T/s3FlR/U1QPt9dwbSyPtjFbMTlW9CRFvnn0bm/QIsrMRD2oMZqrQpSWPQVbXXg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/type": "^3.0.2",
-        "yoctocolors-cjs": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/search": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.4.tgz",
-      "integrity": "sha512-tSkJk2SDmC2MEdTIjknXWmCnmPr5owTs9/xjfa14ol1Oh95n6xW7SYn5fiPk4/vrJPys0ggSWiISdPze4LTa7A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/figures": "^1.0.9",
-        "@inquirer/type": "^3.0.2",
-        "yoctocolors-cjs": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/select": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.0.4.tgz",
-      "integrity": "sha512-ZzYLuLoUzTIW9EJm++jBpRiTshGqS3Q1o5qOEQqgzaBlmdsjQr6pA4TUNkwu6OBYgM2mIRbCz6mUhFDfl/GF+w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/core": "^10.1.2",
-        "@inquirer/figures": "^1.0.9",
-        "@inquirer/type": "^3.0.2",
-        "ansi-escapes": "^4.3.2",
-        "yoctocolors-cjs": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@inquirer/type": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.2.tgz",
-      "integrity": "sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "peerDependencies": {
-        "@types/node": ">=18"
-      }
-    },
-    "node_modules/@isaacs/cliui": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
-      "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
-      "dev": true,
-      "license": "ISC",
-      "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"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
-      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
-      "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@isaacs/cliui/node_modules/string-width": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
-      "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
-      "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/@isaacs/fs-minipass": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
-      "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^7.0.4"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/@istanbuljs/schema": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
-      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
-      "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/set-array": "^1.2.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
-      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/set-array": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
-      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/source-map": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
-      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25"
-      }
-    },
-    "node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/resolve-uri": "^3.1.0",
-        "@jridgewell/sourcemap-codec": "^1.4.14"
-      }
-    },
-    "node_modules/@jsonjoy.com/base64": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
-      "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/streamich"
-      },
-      "peerDependencies": {
-        "tslib": "2"
-      }
-    },
-    "node_modules/@jsonjoy.com/json-pack": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.1.1.tgz",
-      "integrity": "sha512-osjeBqMJ2lb/j/M8NCPjs1ylqWIcTRTycIhVB5pt6LgzgeRSb0YRZ7j9RfA8wIUrsr/medIuhVyonXRZWLyfdw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@jsonjoy.com/base64": "^1.1.1",
-        "@jsonjoy.com/util": "^1.1.2",
-        "hyperdyperid": "^1.2.0",
-        "thingies": "^1.20.0"
-      },
-      "engines": {
-        "node": ">=10.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/streamich"
-      },
-      "peerDependencies": {
-        "tslib": "2"
-      }
-    },
-    "node_modules/@jsonjoy.com/util": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.5.0.tgz",
-      "integrity": "sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/streamich"
-      },
-      "peerDependencies": {
-        "tslib": "2"
-      }
-    },
-    "node_modules/@leichtgewicht/ip-codec": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
-      "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@listr2/prompt-adapter-inquirer": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.18.tgz",
-      "integrity": "sha512-0hz44rAcrphyXcA8IS7EJ2SCoaBZD2u5goE8S/e+q/DL+dOGpqpcLidVOFeLG3VgML62SXmfRLAhWt0zL1oW4Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@inquirer/type": "^1.5.5"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      },
-      "peerDependencies": {
-        "@inquirer/prompts": ">= 3 < 8"
-      }
-    },
-    "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
-      "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mute-stream": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/@listr2/prompt-adapter-inquirer/node_modules/mute-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
-      "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/@lmdb/lmdb-darwin-arm64": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.1.5.tgz",
-      "integrity": "sha512-ue5PSOzHMCIYrfvPP/MRS6hsKKLzqqhcdAvJCO8uFlDdj598EhgnacuOTuqA6uBK5rgiZXfDWyb7DVZSiBKxBA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@lmdb/lmdb-darwin-x64": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.1.5.tgz",
-      "integrity": "sha512-CGhsb0R5vE6mMNCoSfxHFD8QTvBHM51gs4DBeigTYHWnYv2V5YpJkC4rMo5qAAFifuUcc0+a8a3SIU0c9NrfNw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@lmdb/lmdb-linux-arm": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.1.5.tgz",
-      "integrity": "sha512-3WeW328DN+xB5PZdhSWmqE+t3+44xWXEbqQ+caWJEZfOFdLp9yklBZEbVqVdqzznkoaXJYxTCp996KD6HmANeg==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@lmdb/lmdb-linux-arm64": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.1.5.tgz",
-      "integrity": "sha512-LAjaoOcBHGj6fiYB8ureiqPoph4eygbXu4vcOF+hsxiY74n8ilA7rJMmGUT0K0JOB5lmRQHSmor3mytRjS4qeQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@lmdb/lmdb-linux-x64": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.1.5.tgz",
-      "integrity": "sha512-k/IklElP70qdCXOQixclSl2GPLFiopynGoKX1FqDd1/H0E3Fo1oPwjY2rEVu+0nS3AOw1sryStdXk8CW3cVIsw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@lmdb/lmdb-win32-x64": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.1.5.tgz",
-      "integrity": "sha512-KYar6W8nraZfSJspcK7Kp7hdj238X/FNauYbZyrqPBrtsXI1hvI4/KcRcRGP50aQoV7fkKDyJERlrQGMGTZUsA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
-      "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz",
-      "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz",
-      "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz",
-      "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz",
-      "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz",
-      "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@napi-rs/nice": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.0.1.tgz",
-      "integrity": "sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">= 10"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/Brooooooklyn"
-      },
-      "optionalDependencies": {
-        "@napi-rs/nice-android-arm-eabi": "1.0.1",
-        "@napi-rs/nice-android-arm64": "1.0.1",
-        "@napi-rs/nice-darwin-arm64": "1.0.1",
-        "@napi-rs/nice-darwin-x64": "1.0.1",
-        "@napi-rs/nice-freebsd-x64": "1.0.1",
-        "@napi-rs/nice-linux-arm-gnueabihf": "1.0.1",
-        "@napi-rs/nice-linux-arm64-gnu": "1.0.1",
-        "@napi-rs/nice-linux-arm64-musl": "1.0.1",
-        "@napi-rs/nice-linux-ppc64-gnu": "1.0.1",
-        "@napi-rs/nice-linux-riscv64-gnu": "1.0.1",
-        "@napi-rs/nice-linux-s390x-gnu": "1.0.1",
-        "@napi-rs/nice-linux-x64-gnu": "1.0.1",
-        "@napi-rs/nice-linux-x64-musl": "1.0.1",
-        "@napi-rs/nice-win32-arm64-msvc": "1.0.1",
-        "@napi-rs/nice-win32-ia32-msvc": "1.0.1",
-        "@napi-rs/nice-win32-x64-msvc": "1.0.1"
-      }
-    },
-    "node_modules/@napi-rs/nice-android-arm-eabi": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz",
-      "integrity": "sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-android-arm64": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz",
-      "integrity": "sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-darwin-arm64": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz",
-      "integrity": "sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-darwin-x64": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz",
-      "integrity": "sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-freebsd-x64": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz",
-      "integrity": "sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-arm-gnueabihf": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz",
-      "integrity": "sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-arm64-gnu": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz",
-      "integrity": "sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-arm64-musl": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz",
-      "integrity": "sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-ppc64-gnu": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz",
-      "integrity": "sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-riscv64-gnu": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz",
-      "integrity": "sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-s390x-gnu": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz",
-      "integrity": "sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-x64-gnu": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz",
-      "integrity": "sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-linux-x64-musl": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz",
-      "integrity": "sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-win32-arm64-msvc": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz",
-      "integrity": "sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-win32-ia32-msvc": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz",
-      "integrity": "sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@napi-rs/nice-win32-x64-msvc": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz",
-      "integrity": "sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@ngtools/webpack": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-19.0.6.tgz",
-      "integrity": "sha512-eWrIb0tS1CK6+JvFS4GgTD4fN9TtmApKrlaj3pPQXKXKKd42361ec85fuQQXdb4G8eEEq0vyd/bn4NJllh/3vw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      },
-      "peerDependencies": {
-        "@angular/compiler-cli": "^19.0.0",
-        "typescript": ">=5.5 <5.7",
-        "webpack": "^5.54.0"
-      }
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@npmcli/agent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz",
-      "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "agent-base": "^7.1.0",
-        "http-proxy-agent": "^7.0.0",
-        "https-proxy-agent": "^7.0.1",
-        "lru-cache": "^10.0.1",
-        "socks-proxy-agent": "^8.0.3"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/agent/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/@npmcli/fs": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz",
-      "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/git": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.1.tgz",
-      "integrity": "sha512-BBWMMxeQzalmKadyimwb2/VVQyJB01PH0HhVSNLHNBDZN/M/h/02P6f8fxedIiFhpMj11SO9Ep5tKTBE7zL2nw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/promise-spawn": "^8.0.0",
-        "ini": "^5.0.0",
-        "lru-cache": "^10.0.1",
-        "npm-pick-manifest": "^10.0.0",
-        "proc-log": "^5.0.0",
-        "promise-inflight": "^1.0.1",
-        "promise-retry": "^2.0.1",
-        "semver": "^7.3.5",
-        "which": "^5.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/git/node_modules/isexe": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
-      "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@npmcli/git/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/@npmcli/git/node_modules/which": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
-      "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^3.1.1"
-      },
-      "bin": {
-        "node-which": "bin/which.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/installed-package-contents": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz",
-      "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-bundled": "^4.0.0",
-        "npm-normalize-package-bin": "^4.0.0"
-      },
-      "bin": {
-        "installed-package-contents": "bin/index.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/node-gyp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz",
-      "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/package-json": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.1.0.tgz",
-      "integrity": "sha512-t6G+6ZInT4X+tqj2i+wlLIeCKnKOTuz9/VFYDtj+TGTur5q7sp/OYrQA19LdBbWfXDOi0Y4jtedV6xtB8zQ9ug==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/git": "^6.0.0",
-        "glob": "^10.2.2",
-        "hosted-git-info": "^8.0.0",
-        "json-parse-even-better-errors": "^4.0.0",
-        "normalize-package-data": "^7.0.0",
-        "proc-log": "^5.0.0",
-        "semver": "^7.5.3"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/package-json/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/@npmcli/package-json/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dev": true,
-      "license": "ISC",
-      "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"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/@npmcli/package-json/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/@npmcli/promise-spawn": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz",
-      "integrity": "sha512-/bNJhjc+o6qL+Dwz/bqfTQClkEO5nTQ1ZEcdCkAQjhkZMHIh22LPG7fNh1enJP1NKWDqYiiABnjFCY7E0zHYtQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "which": "^5.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/promise-spawn/node_modules/isexe": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
-      "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@npmcli/promise-spawn/node_modules/which": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
-      "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^3.1.1"
-      },
-      "bin": {
-        "node-which": "bin/which.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/redact": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.0.0.tgz",
-      "integrity": "sha512-/1uFzjVcfzqrgCeGW7+SZ4hv0qLWmKXVzFahZGJ6QuJBj6Myt9s17+JL86i76NV9YSnJRcGXJYQbAU0rn1YTCQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/run-script": {
-      "version": "9.0.2",
-      "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.0.2.tgz",
-      "integrity": "sha512-cJXiUlycdizQwvqE1iaAb4VRUM3RX09/8q46zjvy+ct9GhfZRWd7jXYVc1tn/CfRlGPVkX/u4sstRlepsm7hfw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/node-gyp": "^4.0.0",
-        "@npmcli/package-json": "^6.0.0",
-        "@npmcli/promise-spawn": "^8.0.0",
-        "node-gyp": "^11.0.0",
-        "proc-log": "^5.0.0",
-        "which": "^5.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@npmcli/run-script/node_modules/isexe": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
-      "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/@npmcli/run-script/node_modules/which": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
-      "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^3.1.1"
-      },
-      "bin": {
-        "node-which": "bin/which.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@parcel/watcher": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
-      "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "detect-libc": "^1.0.3",
-        "is-glob": "^4.0.3",
-        "micromatch": "^4.0.5",
-        "node-addon-api": "^7.0.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      },
-      "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"
-      }
-    },
-    "node_modules/@parcel/watcher-android-arm64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
-      "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-darwin-arm64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
-      "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-darwin-x64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
-      "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-freebsd-x64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
-      "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm-glibc": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
-      "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm-musl": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
-      "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm64-glibc": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
-      "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-arm64-musl": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
-      "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-x64-glibc": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
-      "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-linux-x64-musl": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
-      "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-win32-arm64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
-      "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-win32-ia32": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
-      "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher-win32-x64": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
-      "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/parcel"
-      }
-    },
-    "node_modules/@parcel/watcher/node_modules/detect-libc": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
-      "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "optional": true,
-      "bin": {
-        "detect-libc": "bin/detect-libc.js"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/@parcel/watcher/node_modules/node-addon-api": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
-      "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/@pkgjs/parseargs": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
-      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=14"
-      }
-    },
-    "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz",
-      "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz",
-      "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz",
-      "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz",
-      "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-arm64": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz",
-      "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-freebsd-x64": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz",
-      "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz",
-      "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz",
-      "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz",
-      "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz",
-      "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz",
-      "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz",
-      "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz",
-      "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz",
-      "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz",
-      "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz",
-      "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz",
-      "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz",
-      "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@schematics/angular": {
-      "version": "19.0.6",
-      "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-19.0.6.tgz",
-      "integrity": "sha512-HicclmbW/+mlljU7a4PzbyIWG+7tognoL5LsgMFJQUDzJXHNjRt1riL0vk57o8Pcprnz9FheeWZXO1KRhXkQuw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@angular-devkit/core": "19.0.6",
-        "@angular-devkit/schematics": "19.0.6",
-        "jsonc-parser": "3.3.1"
-      },
-      "engines": {
-        "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
-        "npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
-        "yarn": ">= 1.13.0"
-      }
-    },
-    "node_modules/@sigstore/bundle": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.0.0.tgz",
-      "integrity": "sha512-XDUYX56iMPAn/cdgh/DTJxz5RWmqKV4pwvUAEKEWJl+HzKdCd/24wUa9JYNMlDSCb7SUHAdtksxYX779Nne/Zg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@sigstore/protobuf-specs": "^0.3.2"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@sigstore/core": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz",
-      "integrity": "sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@sigstore/protobuf-specs": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz",
-      "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": "^16.14.0 || >=18.0.0"
-      }
-    },
-    "node_modules/@sigstore/sign": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-3.0.0.tgz",
-      "integrity": "sha512-UjhDMQOkyDoktpXoc5YPJpJK6IooF2gayAr5LvXI4EL7O0vd58okgfRcxuaH+YTdhvb5aa1Q9f+WJ0c2sVuYIw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@sigstore/bundle": "^3.0.0",
-        "@sigstore/core": "^2.0.0",
-        "@sigstore/protobuf-specs": "^0.3.2",
-        "make-fetch-happen": "^14.0.1",
-        "proc-log": "^5.0.0",
-        "promise-retry": "^2.0.1"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@sigstore/tuf": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.0.0.tgz",
-      "integrity": "sha512-9Xxy/8U5OFJu7s+OsHzI96IX/OzjF/zj0BSSaWhgJgTqtlBhQIV2xdrQI5qxLD7+CWWDepadnXAxzaZ3u9cvRw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@sigstore/protobuf-specs": "^0.3.2",
-        "tuf-js": "^3.0.1"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@sigstore/verify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-2.0.0.tgz",
-      "integrity": "sha512-Ggtq2GsJuxFNUvQzLoXqRwS4ceRfLAJnrIHUDrzAD0GgnOhwujJkKkxM/s5Bako07c3WtAs/sZo5PJq7VHjeDg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@sigstore/bundle": "^3.0.0",
-        "@sigstore/core": "^2.0.0",
-        "@sigstore/protobuf-specs": "^0.3.2"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@sindresorhus/merge-streams": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz",
-      "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/@socket.io/component-emitter": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
-      "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@tufjs/canonical-json": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz",
-      "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^16.14.0 || >=18.0.0"
-      }
-    },
-    "node_modules/@tufjs/models": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz",
-      "integrity": "sha512-UUYHISyhCU3ZgN8yaear3cGATHb3SMuKHsQ/nVbHXcmnBf+LzQ/cQfhNG+rfaSHgqGKNEm2cOCLVLELStUQ1JA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@tufjs/canonical-json": "2.0.0",
-        "minimatch": "^9.0.5"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/@tufjs/models/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/@tufjs/models/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/@types/body-parser": {
-      "version": "1.19.5",
-      "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
-      "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/connect": "*",
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/bonjour": {
-      "version": "3.5.13",
-      "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
-      "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/connect": {
-      "version": "3.4.38",
-      "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
-      "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/connect-history-api-fallback": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
-      "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/express-serve-static-core": "*",
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/cookie": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
-      "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/cors": {
-      "version": "2.8.17",
-      "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
-      "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/eslint": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
-      "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.7",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
-      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/express": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
-      "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/body-parser": "*",
-        "@types/express-serve-static-core": "^4.17.33",
-        "@types/qs": "*",
-        "@types/serve-static": "*"
-      }
-    },
-    "node_modules/@types/express-serve-static-core": {
-      "version": "4.19.6",
-      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
-      "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*",
-        "@types/qs": "*",
-        "@types/range-parser": "*",
-        "@types/send": "*"
-      }
-    },
-    "node_modules/@types/http-errors": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
-      "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/http-proxy": {
-      "version": "1.17.15",
-      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
-      "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/jasmine": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.5.tgz",
-      "integrity": "sha512-SaCZ3kM5NjOiJqMRYwHpLbTfUC2Dyk1KS3QanNFsUYPGTk70CWVK/J9ueun6zNhw/UkgV7xl8V4ZLQZNRbfnNw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.15",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/mime": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
-      "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/node": {
-      "version": "18.19.68",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.68.tgz",
-      "integrity": "sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "undici-types": "~5.26.4"
-      }
-    },
-    "node_modules/@types/node-forge": {
-      "version": "1.3.11",
-      "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
-      "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/qs": {
-      "version": "6.9.17",
-      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz",
-      "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/range-parser": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
-      "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/retry": {
-      "version": "0.12.2",
-      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz",
-      "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@types/send": {
-      "version": "0.17.4",
-      "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
-      "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/mime": "^1",
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/serve-index": {
-      "version": "1.9.4",
-      "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
-      "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/express": "*"
-      }
-    },
-    "node_modules/@types/serve-static": {
-      "version": "1.15.7",
-      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
-      "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/http-errors": "*",
-        "@types/node": "*",
-        "@types/send": "*"
-      }
-    },
-    "node_modules/@types/sockjs": {
-      "version": "0.3.36",
-      "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
-      "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/ws": {
-      "version": "8.5.13",
-      "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
-      "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@vitejs/plugin-basic-ssl": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz",
-      "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.6.0"
-      },
-      "peerDependencies": {
-        "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
-      }
-    },
-    "node_modules/@webassemblyjs/ast": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
-      "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.13.2",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
-      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
-      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
-      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
-      "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.13.2",
-        "@webassemblyjs/helper-api-error": "1.13.2",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
-      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
-      "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/wasm-gen": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
-      "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/@webassemblyjs/leb128": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
-      "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/utf8": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
-      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
-      "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/helper-wasm-section": "1.14.1",
-        "@webassemblyjs/wasm-gen": "1.14.1",
-        "@webassemblyjs/wasm-opt": "1.14.1",
-        "@webassemblyjs/wasm-parser": "1.14.1",
-        "@webassemblyjs/wast-printer": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
-      "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/ieee754": "1.13.2",
-        "@webassemblyjs/leb128": "1.13.2",
-        "@webassemblyjs/utf8": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
-      "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/wasm-gen": "1.14.1",
-        "@webassemblyjs/wasm-parser": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
-      "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-api-error": "1.13.2",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/ieee754": "1.13.2",
-        "@webassemblyjs/leb128": "1.13.2",
-        "@webassemblyjs/utf8": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
-      "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "dev": true,
-      "license": "Apache-2.0"
-    },
-    "node_modules/@yarnpkg/lockfile": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
-      "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==",
-      "dev": true,
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/abbrev": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz",
-      "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/accepts": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
-      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
-      "license": "MIT",
-      "dependencies": {
-        "mime-types": "~2.1.34",
-        "negotiator": "0.6.3"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/adjust-sourcemap-loader": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz",
-      "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "loader-utils": "^2.0.0",
-        "regex-parser": "^2.2.11"
-      },
-      "engines": {
-        "node": ">=8.9"
-      }
-    },
-    "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/agent-base": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
-      "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "8.17.1",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
-      "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3",
-        "fast-uri": "^3.0.1",
-        "json-schema-traverse": "^1.0.0",
-        "require-from-string": "^2.0.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/ajv-formats": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
-      "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "^8.0.0"
-      },
-      "peerDependencies": {
-        "ajv": "^8.0.0"
-      },
-      "peerDependenciesMeta": {
-        "ajv": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/ajv-keywords": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
-      "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3"
-      },
-      "peerDependencies": {
-        "ajv": "^8.8.2"
-      }
-    },
-    "node_modules/ansi-colors": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
-      "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "type-fest": "^0.21.3"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ansi-html-community": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
-      "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
-      "dev": true,
-      "engines": [
-        "node >= 0.8.0"
-      ],
-      "license": "Apache-2.0",
-      "bin": {
-        "ansi-html": "bin/ansi-html"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
-      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/anymatch/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true,
-      "license": "Python-2.0"
-    },
-    "node_modules/array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
-      "license": "MIT"
-    },
-    "node_modules/autoprefixer": {
-      "version": "10.4.20",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
-      "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/autoprefixer"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-lite": "^1.0.30001646",
-        "fraction.js": "^4.3.7",
-        "normalize-range": "^0.1.2",
-        "picocolors": "^1.0.1",
-        "postcss-value-parser": "^4.2.0"
-      },
-      "bin": {
-        "autoprefixer": "bin/autoprefixer"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/babel-loader": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz",
-      "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-cache-dir": "^4.0.0",
-        "schema-utils": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 14.15.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.12.0",
-        "webpack": ">=5"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.4.12",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
-      "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/compat-data": "^7.22.6",
-        "@babel/helper-define-polyfill-provider": "^0.6.3",
-        "semver": "^6.3.1"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-corejs3": {
-      "version": "0.10.6",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
-      "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.6.2",
-        "core-js-compat": "^3.38.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
-      }
-    },
-    "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
-      "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.6.3"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/base64id": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
-      "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^4.5.0 || >= 5.9"
-      }
-    },
-    "node_modules/batch": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
-      "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/beasties": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.1.0.tgz",
-      "integrity": "sha512-+Ssscd2gVG24qRNC+E2g88D+xsQW4xwakWtKAiGEQ3Pw54/FGdyo9RrfxhGhEv6ilFVbB7r3Lgx+QnAxnSpECw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "css-select": "^5.1.0",
-        "css-what": "^6.1.0",
-        "dom-serializer": "^2.0.0",
-        "domhandler": "^5.0.3",
-        "htmlparser2": "^9.0.0",
-        "picocolors": "^1.1.1",
-        "postcss": "^8.4.47",
-        "postcss-media-query-parser": "^0.2.3"
-      }
-    },
-    "node_modules/big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
-      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/bl": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
-      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "buffer": "^5.5.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.4.0"
-      }
-    },
-    "node_modules/body-parser": {
-      "version": "1.20.3",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
-      "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
-      "license": "MIT",
-      "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.13.0",
-        "raw-body": "2.5.2",
-        "type-is": "~1.6.18",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8",
-        "npm": "1.2.8000 || >= 1.4.16"
-      }
-    },
-    "node_modules/body-parser/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/body-parser/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "license": "MIT"
-    },
-    "node_modules/bonjour-service": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz",
-      "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3",
-        "multicast-dns": "^7.2.5"
-      }
-    },
-    "node_modules/boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/browserslist": {
-      "version": "4.24.3",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz",
-      "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001688",
-        "electron-to-chromium": "^1.5.73",
-        "node-releases": "^2.0.19",
-        "update-browserslist-db": "^1.1.1"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/bundle-name": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
-      "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "run-applescript": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/bytes": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/cacache": {
-      "version": "19.0.1",
-      "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz",
-      "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/fs": "^4.0.0",
-        "fs-minipass": "^3.0.0",
-        "glob": "^10.2.2",
-        "lru-cache": "^10.0.1",
-        "minipass": "^7.0.3",
-        "minipass-collect": "^2.0.1",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "p-map": "^7.0.2",
-        "ssri": "^12.0.0",
-        "tar": "^7.4.3",
-        "unique-filename": "^4.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/cacache/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/cacache/node_modules/chownr": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
-      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/cacache/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dev": true,
-      "license": "ISC",
-      "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"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/cacache/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/cacache/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/cacache/node_modules/mkdirp": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
-      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "mkdirp": "dist/cjs/src/bin.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/cacache/node_modules/tar": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
-      "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@isaacs/fs-minipass": "^4.0.0",
-        "chownr": "^3.0.0",
-        "minipass": "^7.1.2",
-        "minizlib": "^3.0.1",
-        "mkdirp": "^3.0.1",
-        "yallist": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/cacache/node_modules/yallist": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
-      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
-      "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/call-bound": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
-      "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "get-intrinsic": "^1.2.6"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001690",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz",
-      "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "CC-BY-4.0"
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chardet": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
-      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/chokidar": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
-      "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "readdirp": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 14.16.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
-    "node_modules/chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/chrome-trace-event": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
-      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/cli-cursor": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
-      "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "restore-cursor": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cli-spinners": {
-      "version": "2.9.2",
-      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
-      "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cli-truncate": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz",
-      "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "slice-ansi": "^5.0.0",
-        "string-width": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/cli-width": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
-      "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
-      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.1",
-        "wrap-ansi": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/cliui/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cliui/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/cliui/node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/clone": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
-      "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/clone-deep": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
-      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-plain-object": "^2.0.4",
-        "kind-of": "^6.0.2",
-        "shallow-clone": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/clone-deep/node_modules/is-plain-object": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
-      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "isobject": "^3.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/colorette": {
-      "version": "2.0.20",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
-      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/common-path-prefix": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
-      "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/compressible": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
-      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mime-db": ">= 1.43.0 < 2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/compression": {
-      "version": "1.7.5",
-      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
-      "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.2",
-        "compressible": "~2.0.18",
-        "debug": "2.6.9",
-        "negotiator": "~0.6.4",
-        "on-headers": "~1.0.2",
-        "safe-buffer": "5.2.1",
-        "vary": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/compression/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/compression/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/compression/node_modules/negotiator": {
-      "version": "0.6.4",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
-      "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/connect": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
-      "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "finalhandler": "1.1.2",
-        "parseurl": "~1.3.3",
-        "utils-merge": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/connect-history-api-fallback": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
-      "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/connect/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/connect/node_modules/encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/connect/node_modules/finalhandler": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
-      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "~2.3.0",
-        "parseurl": "~1.3.3",
-        "statuses": "~1.5.0",
-        "unpipe": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/connect/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/connect/node_modules/on-finished": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
-      "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/connect/node_modules/statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/content-disposition": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
-      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "5.2.1"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/content-type": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
-      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/convert-source-map": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cookie": {
-      "version": "0.7.1",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
-      "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
-      "license": "MIT"
-    },
-    "node_modules/copy-anything": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
-      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-what": "^3.14.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mesqueeb"
-      }
-    },
-    "node_modules/copy-webpack-plugin": {
-      "version": "12.0.2",
-      "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz",
-      "integrity": "sha512-SNwdBeHyII+rWvee/bTnAYyO8vfVdcSTud4EIb6jcZ8inLeWucJE0DnxXQBjlQ5zlteuuvooGQy3LIyGxhvlOA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-glob": "^3.3.2",
-        "glob-parent": "^6.0.1",
-        "globby": "^14.0.0",
-        "normalize-path": "^3.0.0",
-        "schema-utils": "^4.2.0",
-        "serialize-javascript": "^6.0.2"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      }
-    },
-    "node_modules/core-js-compat": {
-      "version": "3.39.0",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
-      "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "browserslist": "^4.24.2"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/core-js"
-      }
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/cors": {
-      "version": "2.8.5",
-      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
-      "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "object-assign": "^4",
-        "vary": "^1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/cosmiconfig": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
-      "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "env-paths": "^2.2.1",
-        "import-fresh": "^3.3.0",
-        "js-yaml": "^4.1.0",
-        "parse-json": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/d-fischer"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.9.5"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
-      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/cross-spawn/node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/css-loader": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz",
-      "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "icss-utils": "^5.1.0",
-        "postcss": "^8.4.33",
-        "postcss-modules-extract-imports": "^3.1.0",
-        "postcss-modules-local-by-default": "^4.0.5",
-        "postcss-modules-scope": "^3.2.0",
-        "postcss-modules-values": "^4.0.0",
-        "postcss-value-parser": "^4.2.0",
-        "semver": "^7.5.4"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "@rspack/core": "0.x || 1.x",
-        "webpack": "^5.27.0"
-      },
-      "peerDependenciesMeta": {
-        "@rspack/core": {
-          "optional": true
-        },
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/css-select": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
-      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "boolbase": "^1.0.0",
-        "css-what": "^6.1.0",
-        "domhandler": "^5.0.2",
-        "domutils": "^3.0.1",
-        "nth-check": "^2.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/css-what": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
-      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">= 6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/fb55"
-      }
-    },
-    "node_modules/cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "cssesc": "bin/cssesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/custom-event": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
-      "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/date-format": {
-      "version": "4.0.14",
-      "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
-      "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/debug": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
-      "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/default-browser": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
-      "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bundle-name": "^4.1.0",
-        "default-browser-id": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/default-browser-id": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
-      "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/defaults": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
-      "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/define-lazy-prop": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
-      "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/destroy": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
-      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8",
-        "npm": "1.2.8000 || >= 1.4.16"
-      }
-    },
-    "node_modules/detect-libc": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
-      "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/detect-node": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
-      "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/di": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
-      "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/dns-packet": {
-      "version": "5.6.1",
-      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
-      "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@leichtgewicht/ip-codec": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/dom-serialize": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
-      "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "custom-event": "~1.0.0",
-        "ent": "~2.2.0",
-        "extend": "^3.0.0",
-        "void-elements": "^2.0.0"
-      }
-    },
-    "node_modules/dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-      }
-    },
-    "node_modules/domelementtype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ],
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "domelementtype": "^2.3.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
-    "node_modules/domutils": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz",
-      "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/dunder-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
-      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/eastasianwidth": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
-      "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
-      "license": "MIT"
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.5.76",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz",
-      "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/emoji-regex": {
-      "version": "10.4.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
-      "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/emojis-list": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/encodeurl": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
-      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/encoding": {
-      "version": "0.1.13",
-      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
-      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "iconv-lite": "^0.6.2"
-      }
-    },
-    "node_modules/encoding/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/engine.io": {
-      "version": "6.6.2",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",
-      "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/cookie": "^0.4.1",
-        "@types/cors": "^2.8.12",
-        "@types/node": ">=10.0.0",
-        "accepts": "~1.3.4",
-        "base64id": "2.0.0",
-        "cookie": "~0.7.2",
-        "cors": "~2.8.5",
-        "debug": "~4.3.1",
-        "engine.io-parser": "~5.2.1",
-        "ws": "~8.17.1"
-      },
-      "engines": {
-        "node": ">=10.2.0"
-      }
-    },
-    "node_modules/engine.io-parser": {
-      "version": "5.2.3",
-      "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz",
-      "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/engine.io/node_modules/cookie": {
-      "version": "0.7.2",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
-      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/engine.io/node_modules/debug": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.18.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz",
-      "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/ent": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz",
-      "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.3",
-        "es-errors": "^1.3.0",
-        "punycode": "^1.4.1",
-        "safe-regex-test": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/entities": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
-      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/env-paths": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
-      "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/environment": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz",
-      "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/err-code": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
-      "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/errno": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
-      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "prr": "~1.0.1"
-      },
-      "bin": {
-        "errno": "cli.js"
-      }
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "node_modules/es-define-property": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
-      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-errors": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-module-lexer": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
-      "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
-      "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/esbuild": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz",
-      "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.24.0",
-        "@esbuild/android-arm": "0.24.0",
-        "@esbuild/android-arm64": "0.24.0",
-        "@esbuild/android-x64": "0.24.0",
-        "@esbuild/darwin-arm64": "0.24.0",
-        "@esbuild/darwin-x64": "0.24.0",
-        "@esbuild/freebsd-arm64": "0.24.0",
-        "@esbuild/freebsd-x64": "0.24.0",
-        "@esbuild/linux-arm": "0.24.0",
-        "@esbuild/linux-arm64": "0.24.0",
-        "@esbuild/linux-ia32": "0.24.0",
-        "@esbuild/linux-loong64": "0.24.0",
-        "@esbuild/linux-mips64el": "0.24.0",
-        "@esbuild/linux-ppc64": "0.24.0",
-        "@esbuild/linux-riscv64": "0.24.0",
-        "@esbuild/linux-s390x": "0.24.0",
-        "@esbuild/linux-x64": "0.24.0",
-        "@esbuild/netbsd-x64": "0.24.0",
-        "@esbuild/openbsd-arm64": "0.24.0",
-        "@esbuild/openbsd-x64": "0.24.0",
-        "@esbuild/sunos-x64": "0.24.0",
-        "@esbuild/win32-arm64": "0.24.0",
-        "@esbuild/win32-ia32": "0.24.0",
-        "@esbuild/win32-x64": "0.24.0"
-      }
-    },
-    "node_modules/esbuild-wasm": {
-      "version": "0.24.0",
-      "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.24.0.tgz",
-      "integrity": "sha512-xhNn5tL1AhkPg4ft59yXT6FkwKXiPSYyz1IeinJHUJpjvOHOIPvdmFQc0pGdjxlKSbzZc2mNmtVOWAR1EF/JAg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
-      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
-      "license": "MIT"
-    },
-    "node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esrecurse/node_modules/estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/eventemitter3": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
-      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/exponential-backoff": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz",
-      "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==",
-      "dev": true,
-      "license": "Apache-2.0"
-    },
-    "node_modules/express": {
-      "version": "4.21.2",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
-      "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
-      "license": "MIT",
-      "dependencies": {
-        "accepts": "~1.3.8",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.20.3",
-        "content-disposition": "0.5.4",
-        "content-type": "~1.0.4",
-        "cookie": "0.7.1",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.3.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "merge-descriptors": "1.0.3",
-        "methods": "~1.1.2",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.12",
-        "proxy-addr": "~2.0.7",
-        "qs": "6.13.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.2.1",
-        "send": "0.19.0",
-        "serve-static": "1.16.2",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.10.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/express"
-      }
-    },
-    "node_modules/express/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/express/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "license": "MIT"
-    },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/external-editor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
-      "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "chardet": "^0.7.0",
-        "iconv-lite": "^0.4.24",
-        "tmp": "^0.0.33"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fast-glob": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
-      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/fast-glob/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/fast-uri": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
-      "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/fastq": {
-      "version": "1.18.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
-      "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/faye-websocket": {
-      "version": "0.11.4",
-      "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
-      "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "websocket-driver": ">=0.5.1"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/finalhandler": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
-      "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "statuses": "2.0.1",
-        "unpipe": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/finalhandler/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/finalhandler/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "license": "MIT"
-    },
-    "node_modules/find-cache-dir": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
-      "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "common-path-prefix": "^3.0.0",
-        "pkg-dir": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/find-up": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
-      "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "locate-path": "^7.1.0",
-        "path-exists": "^5.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/flat": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
-      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "bin": {
-        "flat": "cli.js"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
-      "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.15.9",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
-      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/foreground-child": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
-      "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "cross-spawn": "^7.0.0",
-        "signal-exit": "^4.0.1"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/forwarded": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
-      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fraction.js": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
-      "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "type": "patreon",
-        "url": "https://github.com/sponsors/rawify"
-      }
-    },
-    "node_modules/fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
-      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "^4.2.0",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/fs-minipass": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz",
-      "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^7.0.3"
-      },
-      "engines": {
-        "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/get-east-asian-width": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
-      "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
-      "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "dunder-proto": "^1.0.0",
-        "es-define-property": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
-        "function-bind": "^1.1.2",
-        "gopd": "^1.2.0",
-        "has-symbols": "^1.1.0",
-        "hasown": "^2.0.2",
-        "math-intrinsics": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-      "deprecated": "Glob versions prior to v9 are no longer supported",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.1.1",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.3"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "dev": true,
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/globby": {
-      "version": "14.0.2",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz",
-      "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@sindresorhus/merge-streams": "^2.1.0",
-        "fast-glob": "^3.3.2",
-        "ignore": "^5.2.4",
-        "path-type": "^5.0.0",
-        "slash": "^5.1.0",
-        "unicorn-magic": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/gopd": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
-      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/handle-thing": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
-      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
-      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
-      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "license": "MIT",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/hosted-git-info": {
-      "version": "8.0.2",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-8.0.2.tgz",
-      "integrity": "sha512-sYKnA7eGln5ov8T8gnYlkSOxFJvywzEx9BueN6xo/GKO8PGiI6uK6xx+DIGe45T3bdVjLAQDQW1aicT8z8JwQg==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^10.0.1"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/hosted-git-info/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/hpack.js": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
-      "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "obuf": "^1.0.0",
-        "readable-stream": "^2.0.1",
-        "wbuf": "^1.1.0"
-      }
-    },
-    "node_modules/hpack.js/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/hpack.js/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/hpack.js/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/html-entities": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
-      "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/mdevils"
-        },
-        {
-          "type": "patreon",
-          "url": "https://patreon.com/mdevils"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/htmlparser2": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
-      "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
-      "dev": true,
-      "funding": [
-        "https://github.com/fb55/htmlparser2?sponsor=1",
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.3",
-        "domutils": "^3.1.0",
-        "entities": "^4.5.0"
-      }
-    },
-    "node_modules/http-cache-semantics": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
-      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
-      "dev": true,
-      "license": "BSD-2-Clause"
-    },
-    "node_modules/http-deceiver": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
-      "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/http-errors": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
-      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
-      "license": "MIT",
-      "dependencies": {
-        "depd": "2.0.0",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "toidentifier": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/http-parser-js": {
-      "version": "0.5.8",
-      "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
-      "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/http-proxy": {
-      "version": "1.18.1",
-      "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
-      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eventemitter3": "^4.0.0",
-        "follow-redirects": "^1.0.0",
-        "requires-port": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/http-proxy-agent": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
-      "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "agent-base": "^7.1.0",
-        "debug": "^4.3.4"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/http-proxy-middleware": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz",
-      "integrity": "sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/http-proxy": "^1.17.15",
-        "debug": "^4.3.6",
-        "http-proxy": "^1.18.1",
-        "is-glob": "^4.0.3",
-        "is-plain-object": "^5.0.0",
-        "micromatch": "^4.0.8"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/https-proxy-agent": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
-      "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "agent-base": "^7.0.2",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/hyperdyperid": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
-      "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.18"
-      }
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/icss-utils": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
-      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/ignore": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
-      "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/ignore-walk": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz",
-      "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minimatch": "^9.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/ignore-walk/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/ignore-walk/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/image-size": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
-      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "bin": {
-        "image-size": "bin/image-size.js"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/immutable": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz",
-      "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "license": "ISC"
-    },
-    "node_modules/ini": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz",
-      "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/ip-address": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
-      "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jsbn": "1.1.0",
-        "sprintf-js": "^1.1.3"
-      },
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.16.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
-      "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-docker": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
-      "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "is-docker": "cli.js"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
-      "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-inside-container": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
-      "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-docker": "^3.0.0"
-      },
-      "bin": {
-        "is-inside-container": "cli.js"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-interactive": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
-      "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-network-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.1.0.tgz",
-      "integrity": "sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-plain-obj": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
-      "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-plain-object": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-regex": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
-      "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "gopd": "^1.2.0",
-        "has-tostringtag": "^1.0.2",
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-unicode-supported": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
-      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-what": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
-      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/is-wsl": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
-      "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-inside-container": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/isbinaryfile": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
-      "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/gjtorikian/"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/isobject": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
-      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/istanbul-lib-coverage": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
-      "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
-      "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@babel/core": "^7.23.9",
-        "@babel/parser": "^7.23.9",
-        "@istanbuljs/schema": "^0.1.3",
-        "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^7.5.4"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/istanbul-lib-report": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
-      "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^4.0.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/istanbul-lib-source-maps": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
-      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/istanbul-reports": {
-      "version": "3.1.7",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
-      "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/jackspeak": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
-      "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "@isaacs/cliui": "^8.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      },
-      "optionalDependencies": {
-        "@pkgjs/parseargs": "^0.11.0"
-      }
-    },
-    "node_modules/jasmine-core": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.4.0.tgz",
-      "integrity": "sha512-T4fio3W++llLd7LGSGsioriDHgWyhoL6YTu4k37uwJLF7DzOzspz7mNxRoM3cQdLWtL/ebazQpIf/yZGJx/gzg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/jest-worker": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
-      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/jiti": {
-      "version": "1.21.7",
-      "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
-      "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "jiti": "bin/jiti.js"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "argparse": "^2.0.1"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/jsbn": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
-      "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/jsesc": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
-      "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz",
-      "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
-      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jsonc-parser": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
-      "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
-      "dev": true,
-      "license": "MIT",
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/jsonparse": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==",
-      "dev": true,
-      "engines": [
-        "node >= 0.2.0"
-      ],
-      "license": "MIT"
-    },
-    "node_modules/karma": {
-      "version": "6.4.4",
-      "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
-      "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@colors/colors": "1.5.0",
-        "body-parser": "^1.19.0",
-        "braces": "^3.0.2",
-        "chokidar": "^3.5.1",
-        "connect": "^3.7.0",
-        "di": "^0.0.1",
-        "dom-serialize": "^2.2.1",
-        "glob": "^7.1.7",
-        "graceful-fs": "^4.2.6",
-        "http-proxy": "^1.18.1",
-        "isbinaryfile": "^4.0.8",
-        "lodash": "^4.17.21",
-        "log4js": "^6.4.1",
-        "mime": "^2.5.2",
-        "minimatch": "^3.0.4",
-        "mkdirp": "^0.5.5",
-        "qjobs": "^1.2.0",
-        "range-parser": "^1.2.1",
-        "rimraf": "^3.0.2",
-        "socket.io": "^4.7.2",
-        "source-map": "^0.6.1",
-        "tmp": "^0.2.1",
-        "ua-parser-js": "^0.7.30",
-        "yargs": "^16.1.1"
-      },
-      "bin": {
-        "karma": "bin/karma"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/karma-chrome-launcher": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz",
-      "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "which": "^1.2.1"
-      }
-    },
-    "node_modules/karma-coverage": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz",
-      "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "istanbul-lib-coverage": "^3.2.0",
-        "istanbul-lib-instrument": "^5.1.0",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.1",
-        "istanbul-reports": "^3.0.5",
-        "minimatch": "^3.0.4"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
-      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "@babel/core": "^7.12.3",
-        "@babel/parser": "^7.14.7",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma-coverage/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/karma-jasmine": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz",
-      "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jasmine-core": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "peerDependencies": {
-        "karma": "^6.0.0"
-      }
-    },
-    "node_modules/karma-jasmine-html-reporter": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz",
-      "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "jasmine-core": "^4.0.0 || ^5.0.0",
-        "karma": "^6.0.0",
-        "karma-jasmine": "^5.0.0"
-      }
-    },
-    "node_modules/karma-jasmine/node_modules/jasmine-core": {
-      "version": "4.6.1",
-      "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz",
-      "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/karma-source-map-support": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz",
-      "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "source-map-support": "^0.5.5"
-      }
-    },
-    "node_modules/karma/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/karma/node_modules/cliui": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
-      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "node_modules/karma/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/karma/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/karma/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/karma/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/karma/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/karma/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/karma/node_modules/tmp": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
-      "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.14"
-      }
-    },
-    "node_modules/karma/node_modules/wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/karma/node_modules/yargs": {
-      "version": "16.2.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cliui": "^7.0.2",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.0",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^20.2.2"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/karma/node_modules/yargs-parser": {
-      "version": "20.2.9",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
-      "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/kind-of": {
-      "version": "6.0.3",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/launch-editor": {
-      "version": "2.9.1",
-      "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
-      "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picocolors": "^1.0.0",
-        "shell-quote": "^1.8.1"
-      }
-    },
-    "node_modules/less": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
-      "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "copy-anything": "^2.0.1",
-        "parse-node-version": "^1.0.1",
-        "tslib": "^2.3.0"
-      },
-      "bin": {
-        "lessc": "bin/lessc"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "optionalDependencies": {
-        "errno": "^0.1.1",
-        "graceful-fs": "^4.1.2",
-        "image-size": "~0.5.0",
-        "make-dir": "^2.1.0",
-        "mime": "^1.4.1",
-        "needle": "^3.1.0",
-        "source-map": "~0.6.0"
-      }
-    },
-    "node_modules/less-loader": {
-      "version": "12.2.0",
-      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-12.2.0.tgz",
-      "integrity": "sha512-MYUxjSQSBUQmowc0l5nPieOYwMzGPUaTzB6inNW/bdPEG9zOL3eAAD1Qw5ZxSPk7we5dMojHwNODYMV1hq4EVg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "@rspack/core": "0.x || 1.x",
-        "less": "^3.5.0 || ^4.0.0",
-        "webpack": "^5.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@rspack/core": {
-          "optional": true
-        },
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/less/node_modules/make-dir": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "pify": "^4.0.1",
-        "semver": "^5.6.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/less/node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/less/node_modules/semver": {
-      "version": "5.7.2",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
-      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
-      "dev": true,
-      "license": "ISC",
-      "optional": true,
-      "bin": {
-        "semver": "bin/semver"
-      }
-    },
-    "node_modules/less/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/license-webpack-plugin": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz",
-      "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "webpack-sources": "^3.0.0"
-      },
-      "peerDependenciesMeta": {
-        "webpack": {
-          "optional": true
-        },
-        "webpack-sources": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/lines-and-columns": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/listr2": {
-      "version": "8.2.5",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz",
-      "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cli-truncate": "^4.0.0",
-        "colorette": "^2.0.20",
-        "eventemitter3": "^5.0.1",
-        "log-update": "^6.1.0",
-        "rfdc": "^1.4.1",
-        "wrap-ansi": "^9.0.0"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/listr2/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
-      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/listr2/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/listr2/node_modules/eventemitter3": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/listr2/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/listr2/node_modules/wrap-ansi": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
-      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.2.1",
-        "string-width": "^7.0.0",
-        "strip-ansi": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/lmdb": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.1.5.tgz",
-      "integrity": "sha512-46Mch5Drq+A93Ss3gtbg+Xuvf5BOgIuvhKDWoGa3HcPHI6BL2NCOkRdSx1D4VfzwrxhnsjbyIVsLRlQHu6URvw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "msgpackr": "^1.11.2",
-        "node-addon-api": "^6.1.0",
-        "node-gyp-build-optional-packages": "5.2.2",
-        "ordered-binary": "^1.5.3",
-        "weak-lru-cache": "^1.2.2"
-      },
-      "bin": {
-        "download-lmdb-prebuilds": "bin/download-prebuilds.js"
-      },
-      "optionalDependencies": {
-        "@lmdb/lmdb-darwin-arm64": "3.1.5",
-        "@lmdb/lmdb-darwin-x64": "3.1.5",
-        "@lmdb/lmdb-linux-arm": "3.1.5",
-        "@lmdb/lmdb-linux-arm64": "3.1.5",
-        "@lmdb/lmdb-linux-x64": "3.1.5",
-        "@lmdb/lmdb-win32-x64": "3.1.5"
-      }
-    },
-    "node_modules/loader-runner": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
-      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "node_modules/loader-utils": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
-      "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 12.13.0"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
-      "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-locate": "^6.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/lodash.debounce": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
-      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/log-symbols": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
-      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "chalk": "^4.1.0",
-        "is-unicode-supported": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-update": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz",
-      "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-escapes": "^7.0.0",
-        "cli-cursor": "^5.0.0",
-        "slice-ansi": "^7.1.0",
-        "strip-ansi": "^7.1.0",
-        "wrap-ansi": "^9.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-update/node_modules/ansi-escapes": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz",
-      "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "environment": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-update/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
-      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/log-update/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/log-update/node_modules/is-fullwidth-code-point": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz",
-      "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "get-east-asian-width": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-update/node_modules/slice-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz",
-      "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.2.1",
-        "is-fullwidth-code-point": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "node_modules/log-update/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/log-update/node_modules/wrap-ansi": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz",
-      "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.2.1",
-        "string-width": "^7.0.0",
-        "strip-ansi": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/log4js": {
-      "version": "6.9.1",
-      "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
-      "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "date-format": "^4.0.14",
-        "debug": "^4.3.4",
-        "flatted": "^3.2.7",
-        "rfdc": "^1.3.0",
-        "streamroller": "^3.1.5"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "node_modules/magic-string": {
-      "version": "0.30.12",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
-      "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/sourcemap-codec": "^1.5.0"
-      }
-    },
-    "node_modules/make-dir": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
-      "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "semver": "^7.5.3"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/make-fetch-happen": {
-      "version": "14.0.3",
-      "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz",
-      "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/agent": "^3.0.0",
-        "cacache": "^19.0.1",
-        "http-cache-semantics": "^4.1.1",
-        "minipass": "^7.0.2",
-        "minipass-fetch": "^4.0.0",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "negotiator": "^1.0.0",
-        "proc-log": "^5.0.0",
-        "promise-retry": "^2.0.1",
-        "ssri": "^12.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/make-fetch-happen/node_modules/negotiator": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
-      "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/math-intrinsics": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
-      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/memfs": {
-      "version": "4.15.1",
-      "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.1.tgz",
-      "integrity": "sha512-ufCzgFwiVnR6R9cCYuvwznJdhdYXEvFl0hpnM4cCtVaVkHuqBR+6fo2sqt1SSMdp+uiHw9GyPZr3OMM5tqjSmQ==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@jsonjoy.com/json-pack": "^1.0.3",
-        "@jsonjoy.com/util": "^1.3.0",
-        "tree-dump": "^1.0.1",
-        "tslib": "^2.0.0"
-      },
-      "engines": {
-        "node": ">= 4.0.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/streamich"
-      }
-    },
-    "node_modules/merge-descriptors": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
-      "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
-      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "braces": "^3.0.3",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/micromatch/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/mime": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
-      "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "license": "MIT",
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/mimic-function": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
-      "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/mini-css-extract-plugin": {
-      "version": "2.9.2",
-      "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
-      "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "schema-utils": "^4.0.0",
-        "tapable": "^2.2.1"
-      },
-      "engines": {
-        "node": ">= 12.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.0.0"
-      }
-    },
-    "node_modules/minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
-      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
-      "dev": true,
-      "license": "MIT",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/minipass": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
-      "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/minipass-collect": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz",
-      "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^7.0.3"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      }
-    },
-    "node_modules/minipass-fetch": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.0.tgz",
-      "integrity": "sha512-2v6aXUXwLP1Epd/gc32HAMIWoczx+fZwEPRHm/VwtrJzRGwR1qGZXEYV3Zp8ZjjbwaZhMrM6uHV4KVkk+XCc2w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minipass": "^7.0.3",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^3.0.1"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      },
-      "optionalDependencies": {
-        "encoding": "^0.1.13"
-      }
-    },
-    "node_modules/minipass-flush": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-flush/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-flush/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/minipass-pipeline": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-pipeline/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-pipeline/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/minipass-sized": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
-      "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-sized/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-sized/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/minizlib": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz",
-      "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minipass": "^7.0.4",
-        "rimraf": "^5.0.5"
-      },
-      "engines": {
-        "node": ">= 18"
-      }
-    },
-    "node_modules/minizlib/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/minizlib/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dev": true,
-      "license": "ISC",
-      "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"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/minizlib/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/minizlib/node_modules/rimraf": {
-      "version": "5.0.10",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz",
-      "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^10.3.7"
-      },
-      "bin": {
-        "rimraf": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/mkdirp": {
-      "version": "0.5.6",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
-      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minimist": "^1.2.6"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/mrmime": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
-      "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "license": "MIT"
-    },
-    "node_modules/msgpackr": {
-      "version": "1.11.2",
-      "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.2.tgz",
-      "integrity": "sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "optionalDependencies": {
-        "msgpackr-extract": "^3.0.2"
-      }
-    },
-    "node_modules/msgpackr-extract": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz",
-      "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "node-gyp-build-optional-packages": "5.2.2"
-      },
-      "bin": {
-        "download-msgpackr-prebuilds": "bin/download-prebuilds.js"
-      },
-      "optionalDependencies": {
-        "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3",
-        "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3",
-        "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3",
-        "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3",
-        "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3",
-        "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3"
-      }
-    },
-    "node_modules/multicast-dns": {
-      "version": "7.2.5",
-      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
-      "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "dns-packet": "^5.2.2",
-        "thunky": "^1.0.2"
-      },
-      "bin": {
-        "multicast-dns": "cli.js"
-      }
-    },
-    "node_modules/mute-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
-      "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/nanoid": {
-      "version": "3.3.8",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
-      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/needle": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
-      "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "iconv-lite": "^0.6.3",
-        "sax": "^1.2.4"
-      },
-      "bin": {
-        "needle": "bin/needle"
-      },
-      "engines": {
-        "node": ">= 4.4.x"
-      }
-    },
-    "node_modules/needle/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/negotiator": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
-      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/node-addon-api": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
-      "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/node-forge": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
-      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
-      "dev": true,
-      "license": "(BSD-3-Clause OR GPL-2.0)",
-      "engines": {
-        "node": ">= 6.13.0"
-      }
-    },
-    "node_modules/node-gyp": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.0.0.tgz",
-      "integrity": "sha512-zQS+9MTTeCMgY0F3cWPyJyRFAkVltQ1uXm+xXu/ES6KFgC6Czo1Seb9vQW2wNxSX2OrDTiqL0ojtkFxBQ0ypIw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "env-paths": "^2.2.0",
-        "exponential-backoff": "^3.1.1",
-        "glob": "^10.3.10",
-        "graceful-fs": "^4.2.6",
-        "make-fetch-happen": "^14.0.3",
-        "nopt": "^8.0.0",
-        "proc-log": "^5.0.0",
-        "semver": "^7.3.5",
-        "tar": "^7.4.3",
-        "which": "^5.0.0"
-      },
-      "bin": {
-        "node-gyp": "bin/node-gyp.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/node-gyp-build-optional-packages": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
-      "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "dependencies": {
-        "detect-libc": "^2.0.1"
-      },
-      "bin": {
-        "node-gyp-build-optional-packages": "bin.js",
-        "node-gyp-build-optional-packages-optional": "optional.js",
-        "node-gyp-build-optional-packages-test": "build-test.js"
-      }
-    },
-    "node_modules/node-gyp/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/node-gyp/node_modules/chownr": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
-      "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/node-gyp/node_modules/glob": {
-      "version": "10.4.5",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
-      "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
-      "dev": true,
-      "license": "ISC",
-      "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"
-      },
-      "bin": {
-        "glob": "dist/esm/bin.mjs"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/node-gyp/node_modules/isexe": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
-      "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=16"
-      }
-    },
-    "node_modules/node-gyp/node_modules/minimatch": {
-      "version": "9.0.5",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
-      "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/node-gyp/node_modules/mkdirp": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
-      "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "mkdirp": "dist/cjs/src/bin.js"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/node-gyp/node_modules/tar": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz",
-      "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@isaacs/fs-minipass": "^4.0.0",
-        "chownr": "^3.0.0",
-        "minipass": "^7.1.2",
-        "minizlib": "^3.0.1",
-        "mkdirp": "^3.0.1",
-        "yallist": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/node-gyp/node_modules/which": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
-      "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^3.1.1"
-      },
-      "bin": {
-        "node-which": "bin/which.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/node-gyp/node_modules/yallist": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
-      "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "engines": {
-        "node": ">=18"
-      }
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.19",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
-      "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/nopt": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.0.0.tgz",
-      "integrity": "sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "abbrev": "^2.0.0"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/normalize-package-data": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz",
-      "integrity": "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "hosted-git-info": "^8.0.0",
-        "semver": "^7.3.5",
-        "validate-npm-package-license": "^3.0.4"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/normalize-range": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
-      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/npm-bundled": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz",
-      "integrity": "sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-normalize-package-bin": "^4.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/npm-install-checks": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz",
-      "integrity": "sha512-u6DCwbow5ynAX5BdiHQ9qvexme4U3qHW3MWe5NqH+NeBm0LbiH6zvGjNNew1fY+AZZUtVHbOPF3j7mJxbUzpXg==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "semver": "^7.1.1"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/npm-normalize-package-bin": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz",
-      "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/npm-package-arg": {
-      "version": "12.0.0",
-      "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.0.tgz",
-      "integrity": "sha512-ZTE0hbwSdTNL+Stx2zxSqdu2KZfNDcrtrLdIk7XGnQFYBWYDho/ORvXtn5XEePcL3tFpGjHCV3X3xrtDh7eZ+A==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "hosted-git-info": "^8.0.0",
-        "proc-log": "^5.0.0",
-        "semver": "^7.3.5",
-        "validate-npm-package-name": "^6.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/npm-packlist": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz",
-      "integrity": "sha512-8qSayfmHJQTx3nJWYbbUmflpyarbLMBc6LCAjYsiGtXxDB68HaZpb8re6zeaLGxZzDuMdhsg70jryJe+RrItVQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "ignore-walk": "^7.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/npm-pick-manifest": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz",
-      "integrity": "sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-install-checks": "^7.1.0",
-        "npm-normalize-package-bin": "^4.0.0",
-        "npm-package-arg": "^12.0.0",
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/npm-registry-fetch": {
-      "version": "18.0.2",
-      "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz",
-      "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/redact": "^3.0.0",
-        "jsonparse": "^1.3.1",
-        "make-fetch-happen": "^14.0.0",
-        "minipass": "^7.0.2",
-        "minipass-fetch": "^4.0.0",
-        "minizlib": "^3.0.1",
-        "npm-package-arg": "^12.0.0",
-        "proc-log": "^5.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/nth-check": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
-      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "boolbase": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/nth-check?sponsor=1"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
-      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/obuf": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
-      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/on-finished": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
-      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
-      "license": "MIT",
-      "dependencies": {
-        "ee-first": "1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/onetime": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
-      "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mimic-function": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/open": {
-      "version": "10.1.0",
-      "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz",
-      "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "default-browser": "^5.2.1",
-        "define-lazy-prop": "^3.0.0",
-        "is-inside-container": "^1.0.0",
-        "is-wsl": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ora": {
-      "version": "5.4.1",
-      "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
-      "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "bl": "^4.1.0",
-        "chalk": "^4.1.0",
-        "cli-cursor": "^3.1.0",
-        "cli-spinners": "^2.5.0",
-        "is-interactive": "^1.0.0",
-        "is-unicode-supported": "^0.1.0",
-        "log-symbols": "^4.1.0",
-        "strip-ansi": "^6.0.0",
-        "wcwidth": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ora/node_modules/cli-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
-      "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "restore-cursor": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ora/node_modules/onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mimic-fn": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/ora/node_modules/restore-cursor": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
-      "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^5.1.0",
-        "signal-exit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ora/node_modules/signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/ordered-binary": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.5.3.tgz",
-      "integrity": "sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/os-tmpdir": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
-      "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "yocto-queue": "^1.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
-      "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "p-limit": "^4.0.0"
-      },
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-map": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
-      "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-retry": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz",
-      "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/retry": "0.12.2",
-        "is-network-error": "^1.0.0",
-        "retry": "^0.13.1"
-      },
-      "engines": {
-        "node": ">=16.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-retry/node_modules/retry": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
-      "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/package-json-from-dist": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
-      "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
-      "dev": true,
-      "license": "BlueOak-1.0.0"
-    },
-    "node_modules/pacote": {
-      "version": "20.0.0",
-      "resolved": "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz",
-      "integrity": "sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/git": "^6.0.0",
-        "@npmcli/installed-package-contents": "^3.0.0",
-        "@npmcli/package-json": "^6.0.0",
-        "@npmcli/promise-spawn": "^8.0.0",
-        "@npmcli/run-script": "^9.0.0",
-        "cacache": "^19.0.0",
-        "fs-minipass": "^3.0.0",
-        "minipass": "^7.0.2",
-        "npm-package-arg": "^12.0.0",
-        "npm-packlist": "^9.0.0",
-        "npm-pick-manifest": "^10.0.0",
-        "npm-registry-fetch": "^18.0.0",
-        "proc-log": "^5.0.0",
-        "promise-retry": "^2.0.1",
-        "sigstore": "^3.0.0",
-        "ssri": "^12.0.0",
-        "tar": "^6.1.11"
-      },
-      "bin": {
-        "pacote": "bin/index.js"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/parse-node-version": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
-      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/parse5": {
-      "version": "7.2.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
-      "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "entities": "^4.5.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
-    "node_modules/parse5-html-rewriting-stream": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz",
-      "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "entities": "^4.3.0",
-        "parse5": "^7.0.0",
-        "parse5-sax-parser": "^7.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
-    "node_modules/parse5-sax-parser": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz",
-      "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "parse5": "^7.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/inikulin/parse5?sponsor=1"
-      }
-    },
-    "node_modules/parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/path-exists": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
-      "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/path-scurry": {
-      "version": "1.11.1",
-      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
-      "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
-      "dev": true,
-      "license": "BlueOak-1.0.0",
-      "dependencies": {
-        "lru-cache": "^10.2.0",
-        "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
-      "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/path-to-regexp": {
-      "version": "0.1.12",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
-      "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
-      "license": "MIT"
-    },
-    "node_modules/path-type": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
-      "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/picomatch": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
-      "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/pify": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/piscina": {
-      "version": "4.7.0",
-      "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.7.0.tgz",
-      "integrity": "sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw==",
-      "dev": true,
-      "license": "MIT",
-      "optionalDependencies": {
-        "@napi-rs/nice": "^1.0.1"
-      }
-    },
-    "node_modules/pkg-dir": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
-      "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "find-up": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.4.49",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
-      "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "nanoid": "^3.3.7",
-        "picocolors": "^1.1.1",
-        "source-map-js": "^1.2.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postcss-loader": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-8.1.1.tgz",
-      "integrity": "sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cosmiconfig": "^9.0.0",
-        "jiti": "^1.20.0",
-        "semver": "^7.5.4"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "@rspack/core": "0.x || 1.x",
-        "postcss": "^7.0.0 || ^8.0.1",
-        "webpack": "^5.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@rspack/core": {
-          "optional": true
-        },
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/postcss-media-query-parser": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-      "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/postcss-modules-extract-imports": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
-      "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-modules-local-by-default": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
-      "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "icss-utils": "^5.0.0",
-        "postcss-selector-parser": "^7.0.0",
-        "postcss-value-parser": "^4.1.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-modules-scope": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
-      "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "postcss-selector-parser": "^7.0.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-modules-values": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
-      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "icss-utils": "^5.0.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >= 14"
-      },
-      "peerDependencies": {
-        "postcss": "^8.1.0"
-      }
-    },
-    "node_modules/postcss-selector-parser": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
-      "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/proc-log": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
-      "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/promise-inflight": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
-      "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/promise-retry": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
-      "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "err-code": "^2.0.2",
-        "retry": "^0.12.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/proxy-addr": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
-      "license": "MIT",
-      "dependencies": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      },
-      "engines": {
-        "node": ">= 0.10"
-      }
-    },
-    "node_modules/prr": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
-      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/punycode": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/qjobs": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
-      "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.9"
-      }
-    },
-    "node_modules/qs": {
-      "version": "6.13.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
-      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "side-channel": "^1.0.6"
-      },
-      "engines": {
-        "node": ">=0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/raw-body": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
-      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
-      "license": "MIT",
-      "dependencies": {
-        "bytes": "3.1.2",
-        "http-errors": "2.0.0",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "3.6.2",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
-      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
-      "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 14.16.0"
-      },
-      "funding": {
-        "type": "individual",
-        "url": "https://paulmillr.com/funding/"
-      }
-    },
-    "node_modules/reflect-metadata": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
-      "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
-      "dev": true,
-      "license": "Apache-2.0"
-    },
-    "node_modules/regenerate": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
-      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/regenerate-unicode-properties": {
-      "version": "10.2.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
-      "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "regenerate": "^1.4.2"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regenerator-runtime": {
-      "version": "0.14.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/regenerator-transform": {
-      "version": "0.15.2",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
-      "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@babel/runtime": "^7.8.4"
-      }
-    },
-    "node_modules/regex-parser": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz",
-      "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/regexpu-core": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
-      "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "regenerate": "^1.4.2",
-        "regenerate-unicode-properties": "^10.2.0",
-        "regjsgen": "^0.8.0",
-        "regjsparser": "^0.12.0",
-        "unicode-match-property-ecmascript": "^2.0.0",
-        "unicode-match-property-value-ecmascript": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/regjsgen": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
-      "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/regjsparser": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz",
-      "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "jsesc": "~3.0.2"
-      },
-      "bin": {
-        "regjsparser": "bin/parser"
-      }
-    },
-    "node_modules/regjsparser/node_modules/jsesc": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
-      "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-from-string": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
-      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/resolve": {
-      "version": "1.22.8",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
-      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-core-module": "^2.13.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/resolve-url-loader": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz",
-      "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "adjust-sourcemap-loader": "^4.0.0",
-        "convert-source-map": "^1.7.0",
-        "loader-utils": "^2.0.0",
-        "postcss": "^8.2.14",
-        "source-map": "0.6.1"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/resolve-url-loader/node_modules/loader-utils": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/resolve-url-loader/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/restore-cursor": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
-      "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "onetime": "^7.0.0",
-        "signal-exit": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rfdc": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
-      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "deprecated": "Rimraf versions prior to v4 are no longer supported",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "4.26.0",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz",
-      "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/estree": "1.0.6"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.26.0",
-        "@rollup/rollup-android-arm64": "4.26.0",
-        "@rollup/rollup-darwin-arm64": "4.26.0",
-        "@rollup/rollup-darwin-x64": "4.26.0",
-        "@rollup/rollup-freebsd-arm64": "4.26.0",
-        "@rollup/rollup-freebsd-x64": "4.26.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.26.0",
-        "@rollup/rollup-linux-arm-musleabihf": "4.26.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.26.0",
-        "@rollup/rollup-linux-arm64-musl": "4.26.0",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.26.0",
-        "@rollup/rollup-linux-s390x-gnu": "4.26.0",
-        "@rollup/rollup-linux-x64-gnu": "4.26.0",
-        "@rollup/rollup-linux-x64-musl": "4.26.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.26.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.26.0",
-        "@rollup/rollup-win32-x64-msvc": "4.26.0",
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/run-applescript": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
-      "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/rxjs": {
-      "version": "7.8.1",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
-      "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "tslib": "^2.1.0"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "license": "MIT"
-    },
-    "node_modules/safe-regex-test": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
-      "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "is-regex": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "license": "MIT"
-    },
-    "node_modules/sass": {
-      "version": "1.80.7",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz",
-      "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "chokidar": "^4.0.0",
-        "immutable": "^5.0.2",
-        "source-map-js": ">=0.6.2 <2.0.0"
-      },
-      "bin": {
-        "sass": "sass.js"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "optionalDependencies": {
-        "@parcel/watcher": "^2.4.1"
-      }
-    },
-    "node_modules/sass-loader": {
-      "version": "16.0.3",
-      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.3.tgz",
-      "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "neo-async": "^2.6.2"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "@rspack/core": "0.x || 1.x",
-        "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
-        "sass": "^1.3.0",
-        "sass-embedded": "*",
-        "webpack": "^5.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@rspack/core": {
-          "optional": true
-        },
-        "node-sass": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/sax": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
-      "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
-      "dev": true,
-      "license": "ISC",
-      "optional": true
-    },
-    "node_modules/schema-utils": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
-      "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/json-schema": "^7.0.9",
-        "ajv": "^8.9.0",
-        "ajv-formats": "^2.1.1",
-        "ajv-keywords": "^5.1.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/schema-utils/node_modules/ajv-formats": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
-      "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ajv": "^8.0.0"
-      },
-      "peerDependencies": {
-        "ajv": "^8.0.0"
-      },
-      "peerDependenciesMeta": {
-        "ajv": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/select-hose": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
-      "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/selfsigned": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
-      "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/node-forge": "^1.3.0",
-        "node-forge": "^1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver": {
-      "version": "7.6.3",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
-      "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
-      "dev": true,
-      "license": "ISC",
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/send": {
-      "version": "0.19.0",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
-      "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
-      "license": "MIT",
-      "dependencies": {
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "mime": "1.6.0",
-        "ms": "2.1.3",
-        "on-finished": "2.4.1",
-        "range-parser": "~1.2.1",
-        "statuses": "2.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/send/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/send/node_modules/debug/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "license": "MIT"
-    },
-    "node_modules/send/node_modules/encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/send/node_modules/mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-      "license": "MIT",
-      "bin": {
-        "mime": "cli.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/serialize-javascript": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
-      "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/serve-index": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
-      "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "accepts": "~1.3.4",
-        "batch": "0.6.1",
-        "debug": "2.6.9",
-        "escape-html": "~1.0.3",
-        "http-errors": "~1.6.2",
-        "mime-types": "~2.1.17",
-        "parseurl": "~1.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/serve-index/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/serve-index/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/serve-index/node_modules/http-errors": {
-      "version": "1.6.3",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
-      "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "depd": "~1.1.2",
-        "inherits": "2.0.3",
-        "setprototypeof": "1.1.0",
-        "statuses": ">= 1.4.0 < 2"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/serve-index/node_modules/inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/serve-index/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/serve-index/node_modules/setprototypeof": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
-      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/serve-index/node_modules/statuses": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
-      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/serve-static": {
-      "version": "1.16.2",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
-      "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
-      "license": "MIT",
-      "dependencies": {
-        "encodeurl": "~2.0.0",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.19.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/setprototypeof": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
-      "license": "ISC"
-    },
-    "node_modules/shallow-clone": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
-      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kind-of": "^6.0.2"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shell-quote": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz",
-      "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
-      "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3",
-        "side-channel-list": "^1.0.0",
-        "side-channel-map": "^1.0.1",
-        "side-channel-weakmap": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-list": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
-      "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-map": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
-      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel-weakmap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
-      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bound": "^1.0.2",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.5",
-        "object-inspect": "^1.13.3",
-        "side-channel-map": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/signal-exit": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
-      "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/sigstore": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-3.0.0.tgz",
-      "integrity": "sha512-PHMifhh3EN4loMcHCz6l3v/luzgT3za+9f8subGgeMNjbJjzH4Ij/YoX3Gvu+kaouJRIlVdTHHCREADYf+ZteA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "@sigstore/bundle": "^3.0.0",
-        "@sigstore/core": "^2.0.0",
-        "@sigstore/protobuf-specs": "^0.3.2",
-        "@sigstore/sign": "^3.0.0",
-        "@sigstore/tuf": "^3.0.0",
-        "@sigstore/verify": "^2.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/slash": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
-      "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/slice-ansi": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
-      "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.0.0",
-        "is-fullwidth-code-point": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/slice-ansi?sponsor=1"
-      }
-    },
-    "node_modules/slice-ansi/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
-      "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/smart-buffer": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
-      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6.0.0",
-        "npm": ">= 3.0.0"
-      }
-    },
-    "node_modules/socket.io": {
-      "version": "4.8.1",
-      "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz",
-      "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "accepts": "~1.3.4",
-        "base64id": "~2.0.0",
-        "cors": "~2.8.5",
-        "debug": "~4.3.2",
-        "engine.io": "~6.6.0",
-        "socket.io-adapter": "~2.5.2",
-        "socket.io-parser": "~4.2.4"
-      },
-      "engines": {
-        "node": ">=10.2.0"
-      }
-    },
-    "node_modules/socket.io-adapter": {
-      "version": "2.5.5",
-      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
-      "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "~4.3.4",
-        "ws": "~8.17.1"
-      }
-    },
-    "node_modules/socket.io-adapter/node_modules/debug": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/socket.io-parser": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
-      "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@socket.io/component-emitter": "~3.1.0",
-        "debug": "~4.3.1"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      }
-    },
-    "node_modules/socket.io-parser/node_modules/debug": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/socket.io/node_modules/debug": {
-      "version": "4.3.7",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
-      "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.1.3"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/sockjs": {
-      "version": "0.3.24",
-      "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
-      "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "faye-websocket": "^0.11.3",
-        "uuid": "^8.3.2",
-        "websocket-driver": "^0.7.4"
-      }
-    },
-    "node_modules/socks": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
-      "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ip-address": "^9.0.5",
-        "smart-buffer": "^4.2.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0",
-        "npm": ">= 3.0.0"
-      }
-    },
-    "node_modules/socks-proxy-agent": {
-      "version": "8.0.5",
-      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
-      "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "agent-base": "^7.1.2",
-        "debug": "^4.3.4",
-        "socks": "^2.8.3"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
-      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
-      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-loader": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-5.0.0.tgz",
-      "integrity": "sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "iconv-lite": "^0.6.3",
-        "source-map-js": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.72.1"
-      }
-    },
-    "node_modules/source-map-loader/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/source-map-support/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "dev": true,
-      "license": "BSD-3-Clause",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/spdx-correct": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
-      "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-exceptions": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
-      "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
-      "dev": true,
-      "license": "CC-BY-3.0"
-    },
-    "node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-license-ids": {
-      "version": "3.0.20",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
-      "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
-      "dev": true,
-      "license": "CC0-1.0"
-    },
-    "node_modules/spdy": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
-      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.1.0",
-        "handle-thing": "^2.0.0",
-        "http-deceiver": "^1.2.7",
-        "select-hose": "^2.0.0",
-        "spdy-transport": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/spdy-transport": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
-      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.1.0",
-        "detect-node": "^2.0.4",
-        "hpack.js": "^2.1.6",
-        "obuf": "^1.1.2",
-        "readable-stream": "^3.0.6",
-        "wbuf": "^1.7.3"
-      }
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
-      "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
-      "dev": true,
-      "license": "BSD-3-Clause"
-    },
-    "node_modules/ssri": {
-      "version": "12.0.0",
-      "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz",
-      "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^7.0.3"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/statuses": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
-      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/streamroller": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
-      "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "date-format": "^4.0.14",
-        "debug": "^4.3.4",
-        "fs-extra": "^8.1.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
-    "node_modules/string-width": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
-      "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^10.3.0",
-        "get-east-asian-width": "^1.0.0",
-        "strip-ansi": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/string-width-cjs": {
-      "name": "string-width",
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width-cjs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/string-width/node_modules/ansi-regex": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
-      "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/string-width/node_modules/strip-ansi": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
-      "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-ansi-cjs": {
-      "name": "strip-ansi",
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/symbol-observable": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz",
-      "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tar": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
-      "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^5.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/tar/node_modules/fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/tar/node_modules/minipass": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
-      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/tar/node_modules/minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/tar/node_modules/minizlib/node_modules/minipass": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
-      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/tar/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/tar/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/terser": {
-      "version": "5.36.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
-      "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "@jridgewell/source-map": "^0.3.3",
-        "acorn": "^8.8.2",
-        "commander": "^2.20.0",
-        "source-map-support": "~0.5.20"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terser-webpack-plugin": {
-      "version": "5.3.11",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz",
-      "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@jridgewell/trace-mapping": "^0.3.25",
-        "jest-worker": "^27.4.5",
-        "schema-utils": "^4.3.0",
-        "serialize-javascript": "^6.0.2",
-        "terser": "^5.31.1"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      },
-      "peerDependenciesMeta": {
-        "@swc/core": {
-          "optional": true
-        },
-        "esbuild": {
-          "optional": true
-        },
-        "uglify-js": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/thingies": {
-      "version": "1.21.0",
-      "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
-      "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==",
-      "dev": true,
-      "license": "Unlicense",
-      "engines": {
-        "node": ">=10.18"
-      },
-      "peerDependencies": {
-        "tslib": "^2"
-      }
-    },
-    "node_modules/thunky": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
-      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/tmp": {
-      "version": "0.0.33",
-      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
-      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "os-tmpdir": "~1.0.2"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/toidentifier": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
-      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/tree-dump": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz",
-      "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=10.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/streamich"
-      },
-      "peerDependencies": {
-        "tslib": "2"
-      }
-    },
-    "node_modules/tree-kill": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
-      "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "tree-kill": "cli.js"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
-      "license": "0BSD"
-    },
-    "node_modules/tuf-js": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz",
-      "integrity": "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@tufjs/models": "3.0.1",
-        "debug": "^4.3.6",
-        "make-fetch-happen": "^14.0.1"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.21.3",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-      "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-      "license": "MIT",
-      "dependencies": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/typed-assert": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz",
-      "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/typescript": {
-      "version": "5.6.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
-      "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=14.17"
-      }
-    },
-    "node_modules/ua-parser-js": {
-      "version": "0.7.40",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.40.tgz",
-      "integrity": "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/ua-parser-js"
-        },
-        {
-          "type": "paypal",
-          "url": "https://paypal.me/faisalman"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/faisalman"
-        }
-      ],
-      "license": "MIT",
-      "bin": {
-        "ua-parser-js": "script/cli.js"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/undici-types": {
-      "version": "5.26.5",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
-      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/unicode-canonical-property-names-ecmascript": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
-      "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-match-property-ecmascript": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
-      "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "unicode-canonical-property-names-ecmascript": "^2.0.0",
-        "unicode-property-aliases-ecmascript": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-match-property-value-ecmascript": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
-      "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicode-property-aliases-ecmascript": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
-      "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/unicorn-magic": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
-      "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/unique-filename": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz",
-      "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "unique-slug": "^5.0.0"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/unique-slug": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz",
-      "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "imurmurhash": "^0.1.4"
-      },
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/update-browserslist-db": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
-      "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "license": "MIT",
-      "dependencies": {
-        "escalade": "^3.2.0",
-        "picocolors": "^1.1.0"
-      },
-      "bin": {
-        "update-browserslist-db": "cli.js"
-      },
-      "peerDependencies": {
-        "browserslist": ">= 4.21.0"
-      }
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/uri-js/node_modules/punycode": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
-      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
-    "node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "node_modules/validate-npm-package-name": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.0.tgz",
-      "integrity": "sha512-d7KLgL1LD3U3fgnvWEY1cQXoO/q6EQ1BSz48Sa149V/5zVTAbgmZIpyI8TRi6U9/JNyeYLlTKsEMPtLC27RFUg==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^18.17.0 || >=20.5.0"
-      }
-    },
-    "node_modules/vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/vite": {
-      "version": "5.4.11",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
-      "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "esbuild": "^0.21.3",
-        "postcss": "^8.4.43",
-        "rollup": "^4.20.0"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^18.0.0 || >=20.0.0",
-        "less": "*",
-        "lightningcss": "^1.21.0",
-        "sass": "*",
-        "sass-embedded": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.4.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "sass-embedded": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
-      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
-      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
-      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/android-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
-      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
-      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
-      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
-      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
-      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
-      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
-      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
-      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
-      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
-      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
-      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
-      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
-      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/linux-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
-      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
-      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
-      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
-      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/@esbuild/win32-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
-      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "license": "MIT",
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/vite/node_modules/esbuild": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
-      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "license": "MIT",
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.21.5",
-        "@esbuild/android-arm": "0.21.5",
-        "@esbuild/android-arm64": "0.21.5",
-        "@esbuild/android-x64": "0.21.5",
-        "@esbuild/darwin-arm64": "0.21.5",
-        "@esbuild/darwin-x64": "0.21.5",
-        "@esbuild/freebsd-arm64": "0.21.5",
-        "@esbuild/freebsd-x64": "0.21.5",
-        "@esbuild/linux-arm": "0.21.5",
-        "@esbuild/linux-arm64": "0.21.5",
-        "@esbuild/linux-ia32": "0.21.5",
-        "@esbuild/linux-loong64": "0.21.5",
-        "@esbuild/linux-mips64el": "0.21.5",
-        "@esbuild/linux-ppc64": "0.21.5",
-        "@esbuild/linux-riscv64": "0.21.5",
-        "@esbuild/linux-s390x": "0.21.5",
-        "@esbuild/linux-x64": "0.21.5",
-        "@esbuild/netbsd-x64": "0.21.5",
-        "@esbuild/openbsd-x64": "0.21.5",
-        "@esbuild/sunos-x64": "0.21.5",
-        "@esbuild/win32-arm64": "0.21.5",
-        "@esbuild/win32-ia32": "0.21.5",
-        "@esbuild/win32-x64": "0.21.5"
-      }
-    },
-    "node_modules/void-elements": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
-      "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/watchpack": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
-      "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/wbuf": {
-      "version": "1.7.3",
-      "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
-      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "node_modules/wcwidth": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
-      "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "defaults": "^1.0.3"
-      }
-    },
-    "node_modules/weak-lru-cache": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz",
-      "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==",
-      "dev": true,
-      "license": "MIT",
-      "optional": true
-    },
-    "node_modules/webpack": {
-      "version": "5.96.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
-      "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.7",
-        "@types/estree": "^1.0.6",
-        "@webassemblyjs/ast": "^1.12.1",
-        "@webassemblyjs/wasm-edit": "^1.12.1",
-        "@webassemblyjs/wasm-parser": "^1.12.1",
-        "acorn": "^8.14.0",
-        "browserslist": "^4.24.0",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.17.1",
-        "es-module-lexer": "^1.2.1",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.11",
-        "json-parse-even-better-errors": "^2.3.1",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.2.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.3.10",
-        "watchpack": "^2.4.1",
-        "webpack-sources": "^3.2.3"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-dev-middleware": {
-      "version": "7.4.2",
-      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-7.4.2.tgz",
-      "integrity": "sha512-xOO8n6eggxnwYpy1NlzUKpvrjfJTvae5/D6WOK0S2LSo7vjmo5gCM1DbLUmFqrMTJP+W/0YZNctm7jasWvLuBA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "colorette": "^2.0.10",
-        "memfs": "^4.6.0",
-        "mime-types": "^2.1.31",
-        "on-finished": "^2.4.1",
-        "range-parser": "^1.2.1",
-        "schema-utils": "^4.0.0"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.0.0"
-      },
-      "peerDependenciesMeta": {
-        "webpack": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-dev-server": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz",
-      "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/bonjour": "^3.5.13",
-        "@types/connect-history-api-fallback": "^1.5.4",
-        "@types/express": "^4.17.21",
-        "@types/serve-index": "^1.9.4",
-        "@types/serve-static": "^1.15.5",
-        "@types/sockjs": "^0.3.36",
-        "@types/ws": "^8.5.10",
-        "ansi-html-community": "^0.0.8",
-        "bonjour-service": "^1.2.1",
-        "chokidar": "^3.6.0",
-        "colorette": "^2.0.10",
-        "compression": "^1.7.4",
-        "connect-history-api-fallback": "^2.0.0",
-        "express": "^4.19.2",
-        "graceful-fs": "^4.2.6",
-        "html-entities": "^2.4.0",
-        "http-proxy-middleware": "^2.0.3",
-        "ipaddr.js": "^2.1.0",
-        "launch-editor": "^2.6.1",
-        "open": "^10.0.3",
-        "p-retry": "^6.2.0",
-        "schema-utils": "^4.2.0",
-        "selfsigned": "^2.4.1",
-        "serve-index": "^1.9.1",
-        "sockjs": "^0.3.24",
-        "spdy": "^4.0.2",
-        "webpack-dev-middleware": "^7.4.2",
-        "ws": "^8.18.0"
-      },
-      "bin": {
-        "webpack-dev-server": "bin/webpack-dev-server.js"
-      },
-      "engines": {
-        "node": ">= 18.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.0.0"
-      },
-      "peerDependenciesMeta": {
-        "webpack": {
-          "optional": true
-        },
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/chokidar": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
-      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "funding": {
-        "url": "https://paulmillr.com/funding/"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/http-proxy-middleware": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
-      "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/http-proxy": "^1.17.8",
-        "http-proxy": "^1.18.1",
-        "is-glob": "^4.0.1",
-        "is-plain-obj": "^3.0.0",
-        "micromatch": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      },
-      "peerDependencies": {
-        "@types/express": "^4.17.13"
-      },
-      "peerDependenciesMeta": {
-        "@types/express": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/ipaddr.js": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
-      "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/readdirp": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
-      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/webpack-dev-server/node_modules/ws": {
-      "version": "8.18.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
-      "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": ">=5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-merge": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz",
-      "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "clone-deep": "^4.0.1",
-        "flat": "^5.0.2",
-        "wildcard": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=18.0.0"
-      }
-    },
-    "node_modules/webpack-sources": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
-      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack-subresource-integrity": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz",
-      "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "typed-assert": "^1.0.8"
-      },
-      "engines": {
-        "node": ">= 12"
-      },
-      "peerDependencies": {
-        "html-webpack-plugin": ">= 5.0.0-beta.1 < 6",
-        "webpack": "^5.12.0"
-      },
-      "peerDependenciesMeta": {
-        "html-webpack-plugin": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack/node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/webpack/node_modules/ajv-keywords": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
-      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "dev": true,
-      "license": "MIT",
-      "peerDependencies": {
-        "ajv": "^6.9.1"
-      }
-    },
-    "node_modules/webpack/node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/webpack/node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/webpack/node_modules/schema-utils": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
-      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/websocket-driver": {
-      "version": "0.7.4",
-      "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
-      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "http-parser-js": ">=0.5.1",
-        "safe-buffer": ">=5.1.0",
-        "websocket-extensions": ">=0.1.1"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/websocket-extensions": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
-      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
-      "dev": true,
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "which": "bin/which"
-      }
-    },
-    "node_modules/wildcard": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
-      "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi-cjs": {
-      "name": "wrap-ansi",
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi-cjs/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/ws": {
-      "version": "8.17.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
-      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": ">=5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/xhr2": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz",
-      "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/yargs": {
-      "version": "17.7.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
-      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
-      "dev": true,
-      "license": "MIT",
-      "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"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
-      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/yargs/node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/yargs/node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/yocto-queue": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
-      "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/yoctocolors-cjs": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
-      "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=18"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/zone.js": {
-      "version": "0.15.0",
-      "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz",
-      "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==",
-      "license": "MIT"
-    }
-  }
-}
Index: stributor-app-frontend/package.json
===================================================================
--- distributor-app-frontend/package.json	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,44 +1,0 @@
-{
-  "name": "distributor-app-frontend",
-  "version": "0.0.0",
-  "scripts": {
-    "ng": "ng",
-    "start": "ng serve",
-    "build": "ng build",
-    "watch": "ng build --watch --configuration development",
-    "test": "ng test",
-    "serve:ssr:distributor-app-frontend": "node dist/distributor-app-frontend/server/server.mjs"
-  },
-  "private": true,
-  "dependencies": {
-    "@angular/animations": "^19.0.0",
-    "@angular/common": "^19.0.0",
-    "@angular/compiler": "^19.0.0",
-    "@angular/core": "^19.0.0",
-    "@angular/forms": "^19.0.0",
-    "@angular/platform-browser": "^19.0.0",
-    "@angular/platform-browser-dynamic": "^19.0.0",
-    "@angular/platform-server": "^19.0.0",
-    "@angular/router": "^19.0.0",
-    "@angular/ssr": "^19.0.5",
-    "express": "^4.18.2",
-    "rxjs": "~7.8.0",
-    "tslib": "^2.3.0",
-    "zone.js": "~0.15.0"
-  },
-  "devDependencies": {
-    "@angular-devkit/build-angular": "^19.0.5",
-    "@angular/cli": "^19.0.5",
-    "@angular/compiler-cli": "^19.0.0",
-    "@types/express": "^4.17.17",
-    "@types/jasmine": "~5.1.0",
-    "@types/node": "^18.18.0",
-    "jasmine-core": "~5.4.0",
-    "karma": "~6.4.0",
-    "karma-chrome-launcher": "~3.2.0",
-    "karma-coverage": "~2.2.0",
-    "karma-jasmine": "~5.1.0",
-    "karma-jasmine-html-reporter": "~2.1.0",
-    "typescript": "~5.6.2"
-  }
-}
Index: stributor-app-frontend/src/app/app.component.html
===================================================================
--- distributor-app-frontend/src/app/app.component.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-<div>
-  @for (customer of customers; track customer.userId) {
-  <div>
-    {{ customer.userName }}
-  </div>
-  }
-</div>
Index: stributor-app-frontend/src/app/app.component.spec.ts
===================================================================
--- distributor-app-frontend/src/app/app.component.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,29 +1,0 @@
-import { TestBed } from '@angular/core/testing';
-import { AppComponent } from './app.component';
-
-describe('AppComponent', () => {
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [AppComponent],
-    }).compileComponents();
-  });
-
-  it('should create the app', () => {
-    const fixture = TestBed.createComponent(AppComponent);
-    const app = fixture.componentInstance;
-    expect(app).toBeTruthy();
-  });
-
-  it(`should have the 'distributor-app-frontend' title`, () => {
-    const fixture = TestBed.createComponent(AppComponent);
-    const app = fixture.componentInstance;
-    expect(app.title).toEqual('distributor-app-frontend');
-  });
-
-  it('should render title', () => {
-    const fixture = TestBed.createComponent(AppComponent);
-    fixture.detectChanges();
-    const compiled = fixture.nativeElement as HTMLElement;
-    expect(compiled.querySelector('h1')?.textContent).toContain('Hello, distributor-app-frontend');
-  });
-});
Index: stributor-app-frontend/src/app/app.component.ts
===================================================================
--- distributor-app-frontend/src/app/app.component.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,39 +1,0 @@
-import { Component, Inject, OnInit } from '@angular/core';
-import { RouterOutlet } from '@angular/router';
-import { CustomerModel } from './models/customer.model';
-import { CustomerService } from './services/customer.service';
-import { HttpErrorResponse } from '@angular/common/http';
-
-@Component({
-  selector: 'app-root',
-  // imports: [RouterOutlet],
-  imports: [],
-  templateUrl: './app.component.html',
-  styleUrl: './app.component.css',
-})
-export class AppComponent implements OnInit {
-  title = 'distributor-app-frontend';
-
-  public customers: CustomerModel[] = [];
-
-  constructor() {}
-
-  // constructor(customerService: CustomerService){}
-
-  private customerService = Inject(CustomerService);
-
-  ngOnInit(): void {
-    this.getCustomers();
-  }
-
-  public getCustomers(): void {
-    this.customerService.getCustomers().subscribe(
-      (response: CustomerModel[]) => {
-        this.customers = response;
-      },
-      (error: HttpErrorResponse) => {
-        alert(error.message);
-      }
-    );
-  }
-}
Index: stributor-app-frontend/src/app/app.config.server.ts
===================================================================
--- distributor-app-frontend/src/app/app.config.server.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,14 +1,0 @@
-import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
-import { provideServerRendering } from '@angular/platform-server';
-import { provideServerRoutesConfig } from '@angular/ssr';
-import { appConfig } from './app.config';
-import { serverRoutes } from './app.routes.server';
-
-const serverConfig: ApplicationConfig = {
-  providers: [
-    provideServerRendering(),
-    provideServerRoutesConfig(serverRoutes)
-  ]
-};
-
-export const config = mergeApplicationConfig(appConfig, serverConfig);
Index: stributor-app-frontend/src/app/app.config.ts
===================================================================
--- distributor-app-frontend/src/app/app.config.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,18 +1,0 @@
-import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
-import { provideRouter } from '@angular/router';
-
-import { routes } from './app.routes';
-import {
-  provideClientHydration,
-  withEventReplay,
-} from '@angular/platform-browser';
-import { provideHttpClient } from '@angular/common/http';
-
-export const appConfig: ApplicationConfig = {
-  providers: [
-    provideZoneChangeDetection({ eventCoalescing: true }),
-    provideRouter(routes),
-    provideClientHydration(withEventReplay()),
-    provideHttpClient(),
-  ],
-};
Index: stributor-app-frontend/src/app/app.routes.server.ts
===================================================================
--- distributor-app-frontend/src/app/app.routes.server.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import { RenderMode, ServerRoute } from '@angular/ssr';
-
-export const serverRoutes: ServerRoute[] = [
-  {
-    path: '**',
-    renderMode: RenderMode.Prerender
-  }
-];
Index: stributor-app-frontend/src/app/app.routes.ts
===================================================================
--- distributor-app-frontend/src/app/app.routes.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,3 +1,0 @@
-import { Routes } from '@angular/router';
-
-export const routes: Routes = [];
Index: stributor-app-frontend/src/app/components/home/home.component.html
===================================================================
--- distributor-app-frontend/src/app/components/home/home.component.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<p>home works!</p>
Index: stributor-app-frontend/src/app/components/home/home.component.spec.ts
===================================================================
--- distributor-app-frontend/src/app/components/home/home.component.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { HomeComponent } from './home.component';
-
-describe('HomeComponent', () => {
-  let component: HomeComponent;
-  let fixture: ComponentFixture<HomeComponent>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [HomeComponent]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(HomeComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/components/home/home.component.ts
===================================================================
--- distributor-app-frontend/src/app/components/home/home.component.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-import { Component } from '@angular/core';
-import { NavbarComponent } from '../navbar/navbar.component';
-
-@Component({
-  selector: 'app-home',
-  imports: [],
-  templateUrl: './home.component.html',
-  styleUrl: './home.component.css',
-})
-export class HomeComponent {}
Index: stributor-app-frontend/src/app/components/login/login.component.html
===================================================================
--- distributor-app-frontend/src/app/components/login/login.component.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<p>login works!</p>
Index: stributor-app-frontend/src/app/components/login/login.component.spec.ts
===================================================================
--- distributor-app-frontend/src/app/components/login/login.component.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { LoginComponent } from './login.component';
-
-describe('LoginComponent', () => {
-  let component: LoginComponent;
-  let fixture: ComponentFixture<LoginComponent>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [LoginComponent]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(LoginComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/components/login/login.component.ts
===================================================================
--- distributor-app-frontend/src/app/components/login/login.component.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-login',
-  imports: [],
-  templateUrl: './login.component.html',
-  styleUrl: './login.component.css'
-})
-export class LoginComponent {
-
-}
Index: stributor-app-frontend/src/app/components/navbar/navbar.component.html
===================================================================
--- distributor-app-frontend/src/app/components/navbar/navbar.component.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<p>navbar works!</p>
Index: stributor-app-frontend/src/app/components/navbar/navbar.component.spec.ts
===================================================================
--- distributor-app-frontend/src/app/components/navbar/navbar.component.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { NavbarComponent } from './navbar.component';
-
-describe('NavbarComponent', () => {
-  let component: NavbarComponent;
-  let fixture: ComponentFixture<NavbarComponent>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [NavbarComponent]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(NavbarComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/components/navbar/navbar.component.ts
===================================================================
--- distributor-app-frontend/src/app/components/navbar/navbar.component.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-navbar',
-  imports: [],
-  templateUrl: './navbar.component.html',
-  styleUrl: './navbar.component.css'
-})
-export class NavbarComponent {
-
-}
Index: stributor-app-frontend/src/app/components/register/register.component.html
===================================================================
--- distributor-app-frontend/src/app/components/register/register.component.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,1 +1,0 @@
-<p>register works!</p>
Index: stributor-app-frontend/src/app/components/register/register.component.spec.ts
===================================================================
--- distributor-app-frontend/src/app/components/register/register.component.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,23 +1,0 @@
-import { ComponentFixture, TestBed } from '@angular/core/testing';
-
-import { RegisterComponent } from './register.component';
-
-describe('RegisterComponent', () => {
-  let component: RegisterComponent;
-  let fixture: ComponentFixture<RegisterComponent>;
-
-  beforeEach(async () => {
-    await TestBed.configureTestingModule({
-      imports: [RegisterComponent]
-    })
-    .compileComponents();
-
-    fixture = TestBed.createComponent(RegisterComponent);
-    component = fixture.componentInstance;
-    fixture.detectChanges();
-  });
-
-  it('should create', () => {
-    expect(component).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/components/register/register.component.ts
===================================================================
--- distributor-app-frontend/src/app/components/register/register.component.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { Component } from '@angular/core';
-
-@Component({
-  selector: 'app-register',
-  imports: [],
-  templateUrl: './register.component.html',
-  styleUrl: './register.component.css'
-})
-export class RegisterComponent {
-
-}
Index: stributor-app-frontend/src/app/models/article.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/article.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,14 +1,0 @@
-import { ArticleUnitModel } from './articleUnit.model';
-import { CategoryModel } from './category.model';
-import { ManufacturerModel } from './manufacturer.model';
-import { PriceModel } from './price.model';
-
-export interface ArticleModel {
-  articleId: number;
-  articleName: string;
-  articleWeight: number;
-  category?: CategoryModel;
-  manufacturer?: ManufacturerModel;
-  prices?: PriceModel[];
-  articleUnits?: ArticleUnitModel[];
-}
Index: stributor-app-frontend/src/app/models/articleUnit.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/articleUnit.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,15 +1,0 @@
-import { ArticleModel } from './article.model';
-import { OrderModel } from './order.model';
-import { WarehouseModel } from './warehouse.model';
-
-export interface ArticleUnitModel {
-  unitId: number;
-  unitExpirationDate: string;
-  unitSerialNumber: string;
-  unitBatchModel: string;
-  unitManufactureDate: string;
-  unitCostPrice: number;
-  article?: ArticleModel;
-  warehouse?: WarehouseModel;
-  order?: OrderModel;
-}
Index: stributor-app-frontend/src/app/models/category.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/category.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import { ArticleModel } from './article.model';
-
-export interface CategoryModel {
-  categoryId: number;
-  categoryName: string;
-  articles?: ArticleModel[];
-}
Index: stributor-app-frontend/src/app/models/city.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/city.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { RegionModel } from './region.model';
-import { UserModel } from './user.model';
-import { WarehouseModel } from './warehouse.model';
-
-export interface CityModel {
-  cityId: number;
-  cityName: string;
-  region?: RegionModel;
-  users?: UserModel[];
-  warehouses?: WarehouseModel[];
-}
Index: stributor-app-frontend/src/app/models/customer.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/customer.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,12 +1,0 @@
-import { OrderModel } from './order.model';
-import { UserModel } from './user.model';
-
-export interface CustomerModel extends UserModel {
-  edb: string;
-  companyName: string;
-  address: string;
-  openTime: string;
-  closeTime: string;
-  representativeImage: string;
-  orders?: OrderModel[];
-}
Index: stributor-app-frontend/src/app/models/delivery.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/delivery.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import { DeliveryStatusModel } from './deliveryStatus.model';
-import { OrderModel } from './order.model';
-import { VehicleModel } from './vehicle.model';
-
-export interface DeliveryModel {
-  deliveryId: number;
-  deliveryDateCreated: string;
-  deliveryDate: string;
-  deliveryStartKm: number;
-  deliveryEndKm: number;
-  deliveryStartTime: number;
-  deliveryEndTime: number;
-  deliveryStatus?: DeliveryStatusModel;
-  vehicle?: VehicleModel;
-  orders?: OrderModel[];
-}
Index: stributor-app-frontend/src/app/models/deliveryStatus.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/deliveryStatus.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import { DeliveryModel } from './delivery.model';
-
-export interface DeliveryStatusModel {
-  deliveryStatusId: number;
-  deliveryStatusName: string;
-  deliveryStatusDescription: string;
-  deliveries?: DeliveryModel[];
-}
Index: stributor-app-frontend/src/app/models/driver.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/driver.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,3 +1,0 @@
-import { UserModel } from './user.model';
-
-export interface DriverModel extends UserModel {}
Index: stributor-app-frontend/src/app/models/manager.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/manager.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,3 +1,0 @@
-import { UserModel } from './user.model';
-
-export interface ManagerModel extends UserModel {}
Index: stributor-app-frontend/src/app/models/manufacturer.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/manufacturer.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-import { ArticleModel } from './article.model';
-
-export interface ManufacturerModel {
-  manufacturerId: number;
-  manufacturerName: string;
-  manufacturerAddress: string;
-  manufacturerMobile: string;
-  manufacturerEmail: string;
-  articles?: ArticleModel[];
-}
Index: stributor-app-frontend/src/app/models/order.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/order.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,18 +1,0 @@
-import { ArticleUnitModel } from './articleUnit.model';
-import { CustomerModel } from './customer.model';
-import { DeliveryModel } from './delivery.model';
-import { OrderStatusModel } from './orderStatus.model';
-import { ProFormaModel } from './proForma.model';
-
-export interface OrderModel {
-  orderId: number;
-  orderDate: string;
-  orderSum: number;
-  orderFulfillmentDate: string;
-  orderComment: string;
-  orderStatus?: OrderStatusModel;
-  customer?: CustomerModel;
-  delivery?: DeliveryModel;
-  proForma?: ProFormaModel;
-  articleUnits?: ArticleUnitModel[];
-}
Index: stributor-app-frontend/src/app/models/orderStatus.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/orderStatus.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import { OrderModel } from './order.model';
-
-export interface OrderStatusModel {
-  orderStatusId: number;
-  orderStatusName: string;
-  orderStatusDescription: string;
-  orders?: OrderModel[];
-}
Index: stributor-app-frontend/src/app/models/price.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/price.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import { ArticleModel } from './article.model';
-
-export interface PriceModel {
-  priceId: number;
-  price: number;
-  priceEffectiveDate: string;
-  article?: ArticleModel;
-}
Index: stributor-app-frontend/src/app/models/proForma.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/proForma.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,10 +1,0 @@
-import { OrderModel } from './order.model';
-import { ProFormaStatusModel } from './proFormaStatus.model';
-
-export interface ProFormaModel {
-  proFormaId: number;
-  proFormaDeadline: string;
-  proFormaDateCreated: string;
-  proFormaStatus?: ProFormaStatusModel;
-  order?: OrderModel;
-}
Index: stributor-app-frontend/src/app/models/proFormaStatus.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/proFormaStatus.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import { ProFormaModel } from './proForma.model';
-
-export interface ProFormaStatusModel {
-  proFormaStatusId: number;
-  proFormaStatusName: string;
-  proFormaStatusDescription: string;
-  proFormas?: ProFormaModel[];
-}
Index: stributor-app-frontend/src/app/models/region.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/region.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import { CityModel } from './city.model';
-
-export interface RegionModel {
-  regionId: number;
-  regionName: string;
-  cities?: CityModel[];
-}
Index: stributor-app-frontend/src/app/models/user.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/user.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { CityModel } from './city.model';
-
-export interface UserModel {
-  userId: number;
-  userName: string;
-  userSurname: string;
-  userEmail: string;
-  userMobile: string;
-  userImage: string;
-  userCity?: CityModel;
-}
Index: stributor-app-frontend/src/app/models/vehicle.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/vehicle.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-import { DeliveryModel } from './delivery.model';
-import { DriverModel } from './driver.model';
-import { WarehouseModel } from './warehouse.model';
-
-export interface VehicleModel {
-  vehicleId: number;
-  vehicleCarryWeight: number;
-  vehicleServiceInterval: number;
-  vehicleKilometers: number;
-  vehicleLastService: string;
-  vehicleLastServiceKm: number;
-  vehiclePlate: string;
-  vehicleVin: string;
-  vehicleRegDate: string;
-
-  warehouse?: WarehouseModel;
-  driver?: DriverModel;
-  deliveries?: DeliveryModel[];
-}
Index: stributor-app-frontend/src/app/models/warehouse.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/warehouse.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-import { ArticleUnitModel } from './articleUnit.model';
-import { CityModel } from './city.model';
-import { ManagerModel } from './manager.model';
-import { VehicleModel } from './vehicle.model';
-
-export interface WarehouseModel {
-  warehouseId: number;
-  warehosueAddress: string;
-  city?: CityModel;
-  manager?: ManagerModel;
-  vehicles?: VehicleModel[];
-  articleUnits?: ArticleUnitModel;
-}
Index: stributor-app-frontend/src/app/models/weekday.model.ts
===================================================================
--- distributor-app-frontend/src/app/models/weekday.model.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,4 +1,0 @@
-export interface WeekDayModel {
-  weekdayId: number;
-  weekdayName: string;
-}
Index: stributor-app-frontend/src/app/services/auth.service.spec.ts
===================================================================
--- distributor-app-frontend/src/app/services/auth.service.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import { TestBed } from '@angular/core/testing';
-
-import { AuthService } from './auth.service';
-
-describe('AuthService', () => {
-  let service: AuthService;
-
-  beforeEach(() => {
-    TestBed.configureTestingModule({});
-    service = TestBed.inject(AuthService);
-  });
-
-  it('should be created', () => {
-    expect(service).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/services/auth.service.ts
===================================================================
--- distributor-app-frontend/src/app/services/auth.service.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,21 +1,0 @@
-import { HttpClient } from '@angular/common/http';
-import { Injectable } from '@angular/core';
-import { Observable } from 'rxjs';
-import { UserModel } from '../models/user.model';
-
-@Injectable({
-  providedIn: 'root',
-})
-export class AuthService {
-  private apiUrl = 'http://localhost:8080/api/auth';
-
-  constructor(private http: HttpClient) {}
-
-  login(credentials: { email: string; password: string }): Observable<any> {
-    return this.http.post(`${this.apiUrl}/login`, credentials);
-  }
-
-  register(user: UserModel): Observable<any> {
-    return this.http.post(`${this.apiUrl}/register`, user);
-  }
-}
Index: stributor-app-frontend/src/app/services/city.service.spec.ts
===================================================================
--- distributor-app-frontend/src/app/services/city.service.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import { TestBed } from '@angular/core/testing';
-
-import { CityService } from './city.service';
-
-describe('CityService', () => {
-  let service: CityService;
-
-  beforeEach(() => {
-    TestBed.configureTestingModule({});
-    service = TestBed.inject(CityService);
-  });
-
-  it('should be created', () => {
-    expect(service).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/services/city.service.ts
===================================================================
--- distributor-app-frontend/src/app/services/city.service.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,9 +1,0 @@
-import { Injectable } from '@angular/core';
-
-@Injectable({
-  providedIn: 'root'
-})
-export class CityService {
-
-  constructor() { }
-}
Index: stributor-app-frontend/src/app/services/customer.service.spec.ts
===================================================================
--- distributor-app-frontend/src/app/services/customer.service.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import { TestBed } from '@angular/core/testing';
-
-import { CustomerService } from './customer.service';
-
-describe('CustomerService', () => {
-  let service: CustomerService;
-
-  beforeEach(() => {
-    TestBed.configureTestingModule({});
-    service = TestBed.inject(CustomerService);
-  });
-
-  it('should be created', () => {
-    expect(service).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/services/customer.service.ts
===================================================================
--- distributor-app-frontend/src/app/services/customer.service.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,37 +1,0 @@
-import { HttpClient } from '@angular/common/http';
-import { Injectable } from '@angular/core';
-import { CustomerModel } from '../models/customer.model';
-import { Observable } from 'rxjs';
-
-@Injectable({
-  providedIn: 'root',
-})
-export class CustomerService {
-  private apiServerUrl = '';
-
-  constructor(private http: HttpClient) {}
-
-  public getCustomers(): Observable<CustomerModel[]> {
-    return this.http.get<any>(`${this.apiServerUrl}/customer/all`);
-  }
-
-  public addCustomer(customer: CustomerModel): Observable<CustomerModel> {
-    return this.http.post<CustomerModel>(
-      `${this.apiServerUrl}/customer/add`,
-      customer
-    );
-  }
-
-  public updateCustomer(customer: CustomerModel): Observable<CustomerModel> {
-    return this.http.put<CustomerModel>(
-      `${this.apiServerUrl}/customer/edit`,
-      customer
-    );
-  }
-
-  public deleteUser(customerId: number): Observable<void> {
-    return this.http.delete<void>(
-      `${this.apiServerUrl}/customer/delete/${customerId}`
-    );
-  }
-}
Index: stributor-app-frontend/src/app/services/user.service.spec.ts
===================================================================
--- distributor-app-frontend/src/app/services/user.service.spec.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,16 +1,0 @@
-import { TestBed } from '@angular/core/testing';
-
-import { UserService } from './user.service';
-
-describe('UserService', () => {
-  let service: UserService;
-
-  beforeEach(() => {
-    TestBed.configureTestingModule({});
-    service = TestBed.inject(UserService);
-  });
-
-  it('should be created', () => {
-    expect(service).toBeTruthy();
-  });
-});
Index: stributor-app-frontend/src/app/services/user.service.ts
===================================================================
--- distributor-app-frontend/src/app/services/user.service.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,31 +1,0 @@
-import { HttpClient } from '@angular/common/http';
-import { Injectable } from '@angular/core';
-import { Observable } from 'rxjs';
-import { UserModel } from '../models/user.model';
-
-@Injectable({
-  providedIn: 'root',
-})
-export class UserService {
-  private apiServerUrl = '';
-
-  constructor(private http: HttpClient) {}
-
-  public getUsers(): Observable<UserModel[]> {
-    return this.http.get<any>(`${this.apiServerUrl}/users/all`);
-  }
-
-  public addUser(user: UserModel): Observable<UserModel> {
-    return this.http.post<UserModel>(`${this.apiServerUrl}/users/add`, user);
-  }
-
-  public updateUser(user: UserModel): Observable<UserModel> {
-    return this.http.put<UserModel>(`${this.apiServerUrl}/users/edit`, user);
-  }
-
-  public deleteUser(userId: number): Observable<void> {
-    return this.http.delete<void>(
-      `${this.apiServerUrl}/users/delete/${userId}`
-    );
-  }
-}
Index: stributor-app-frontend/src/environments/environment.development.ts
===================================================================
--- distributor-app-frontend/src/environments/environment.development.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export const environment = {};
Index: stributor-app-frontend/src/environments/environment.ts
===================================================================
--- distributor-app-frontend/src/environments/environment.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,3 +1,0 @@
-export const environment = {
-  production: true,
-};
Index: stributor-app-frontend/src/index.html
===================================================================
--- distributor-app-frontend/src/index.html	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,13 +1,0 @@
-<!doctype html>
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <title>DistributorAppFrontend</title>
-  <base href="/">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <link rel="icon" type="image/x-icon" href="favicon.ico">
-</head>
-<body>
-  <app-root></app-root>
-</body>
-</html>
Index: stributor-app-frontend/src/main.server.ts
===================================================================
--- distributor-app-frontend/src/main.server.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,7 +1,0 @@
-import { bootstrapApplication } from '@angular/platform-browser';
-import { AppComponent } from './app/app.component';
-import { config } from './app/app.config.server';
-
-const bootstrap = () => bootstrapApplication(AppComponent, config);
-
-export default bootstrap;
Index: stributor-app-frontend/src/main.ts
===================================================================
--- distributor-app-frontend/src/main.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,6 +1,0 @@
-import { bootstrapApplication } from '@angular/platform-browser';
-import { appConfig } from './app/app.config';
-import { AppComponent } from './app/app.component';
-
-bootstrapApplication(AppComponent, appConfig)
-  .catch((err) => console.error(err));
Index: stributor-app-frontend/src/server.ts
===================================================================
--- distributor-app-frontend/src/server.ts	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,66 +1,0 @@
-import {
-  AngularNodeAppEngine,
-  createNodeRequestHandler,
-  isMainModule,
-  writeResponseToNodeResponse,
-} from '@angular/ssr/node';
-import express from 'express';
-import { dirname, resolve } from 'node:path';
-import { fileURLToPath } from 'node:url';
-
-const serverDistFolder = dirname(fileURLToPath(import.meta.url));
-const browserDistFolder = resolve(serverDistFolder, '../browser');
-
-const app = express();
-const angularApp = new AngularNodeAppEngine();
-
-/**
- * Example Express Rest API endpoints can be defined here.
- * Uncomment and define endpoints as necessary.
- *
- * Example:
- * ```ts
- * app.get('/api/**', (req, res) => {
- *   // Handle API request
- * });
- * ```
- */
-
-/**
- * Serve static files from /browser
- */
-app.use(
-  express.static(browserDistFolder, {
-    maxAge: '1y',
-    index: false,
-    redirect: false,
-  }),
-);
-
-/**
- * Handle all other requests by rendering the Angular application.
- */
-app.use('/**', (req, res, next) => {
-  angularApp
-    .handle(req)
-    .then((response) =>
-      response ? writeResponseToNodeResponse(response, res) : next(),
-    )
-    .catch(next);
-});
-
-/**
- * Start the server if this module is the main entry point.
- * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000.
- */
-if (isMainModule(import.meta.url)) {
-  const port = process.env['PORT'] || 4000;
-  app.listen(port, () => {
-    console.log(`Node Express server listening on http://localhost:${port}`);
-  });
-}
-
-/**
- * The request handler used by the Angular CLI (dev-server and during build).
- */
-export const reqHandler = createNodeRequestHandler(app);
Index: stributor-app-frontend/src/styles.css
===================================================================
--- distributor-app-frontend/src/styles.css	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,1 +1,0 @@
-/* You can add global styles to this file, and also import other style files */
Index: stributor-app-frontend/tsconfig.app.json
===================================================================
--- distributor-app-frontend/tsconfig.app.json	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,19 +1,0 @@
-/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
-/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
-{
-  "extends": "./tsconfig.json",
-  "compilerOptions": {
-    "outDir": "./out-tsc/app",
-    "types": [
-      "node"
-    ]
-  },
-  "files": [
-    "src/main.ts",
-    "src/main.server.ts",
-    "src/server.ts"
-  ],
-  "include": [
-    "src/**/*.d.ts"
-  ]
-}
Index: stributor-app-frontend/tsconfig.json
===================================================================
--- distributor-app-frontend/tsconfig.json	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,27 +1,0 @@
-/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
-/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
-{
-  "compileOnSave": false,
-  "compilerOptions": {
-    "outDir": "./dist/out-tsc",
-    "strict": true,
-    "noImplicitOverride": true,
-    "noPropertyAccessFromIndexSignature": true,
-    "noImplicitReturns": true,
-    "noFallthroughCasesInSwitch": true,
-    "skipLibCheck": true,
-    "isolatedModules": true,
-    "esModuleInterop": true,
-    "experimentalDecorators": true,
-    "moduleResolution": "bundler",
-    "importHelpers": true,
-    "target": "ES2022",
-    "module": "ES2022"
-  },
-  "angularCompilerOptions": {
-    "enableI18nLegacyMessageIdFormat": false,
-    "strictInjectionParameters": true,
-    "strictInputAccessModifiers": true,
-    "strictTemplates": true
-  }
-}
Index: stributor-app-frontend/tsconfig.spec.json
===================================================================
--- distributor-app-frontend/tsconfig.spec.json	(revision 1bac4662d667eaad2414c77edf4f2d41f823e9a8)
+++ 	(revision )
@@ -1,15 +1,0 @@
-/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
-/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
-{
-  "extends": "./tsconfig.json",
-  "compilerOptions": {
-    "outDir": "./out-tsc/spec",
-    "types": [
-      "jasmine"
-    ]
-  },
-  "include": [
-    "src/**/*.spec.ts",
-    "src/**/*.d.ts"
-  ]
-}
Index: mvnw
===================================================================
--- mvnw	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ mvnw	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,259 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.2
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  if [ -n "${JAVA_HOME-}" ]; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ]; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+trim() {
+  # MWRAPPER-139:
+  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
+  #   Needed for removing poorly interpreted newline sequences when running in more
+  #   exotic environments such as mingw bash on Windows.
+  printf "%s" "${1}" | tr -d '[:space:]'
+}
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl=$(trim "${value-}") ;;
+  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
+  esac
+done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
+MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"
Index: mvnw.cmd
===================================================================
--- mvnw.cmd	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ mvnw.cmd	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,149 @@
+<# : batch portion
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Apache Maven Wrapper startup batch script, version 3.3.2
+@REM
+@REM Optional ENV vars
+@REM   MVNW_REPOURL - repo url base for downloading maven distribution
+@REM   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+@REM   MVNW_VERBOSE - true: enable verbose log; others: silence the output
+@REM ----------------------------------------------------------------------------
+
+@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
+@SET __MVNW_CMD__=
+@SET __MVNW_ERROR__=
+@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
+@SET PSModulePath=
+@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
+  IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
+)
+@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
+@SET __MVNW_PSMODULEP_SAVE=
+@SET __MVNW_ARG0_NAME__=
+@SET MVNW_USERNAME=
+@SET MVNW_PASSWORD=
+@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
+@echo Cannot start maven from wrapper >&2 && exit /b 1
+@GOTO :EOF
+: end batch / begin powershell #>
+
+$ErrorActionPreference = "Stop"
+if ($env:MVNW_VERBOSE -eq "true") {
+  $VerbosePreference = "Continue"
+}
+
+# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
+$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
+if (!$distributionUrl) {
+  Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
+}
+
+switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
+  "maven-mvnd-*" {
+    $USE_MVND = $true
+    $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
+    $MVN_CMD = "mvnd.cmd"
+    break
+  }
+  default {
+    $USE_MVND = $false
+    $MVN_CMD = $script -replace '^mvnw','mvn'
+    break
+  }
+}
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+if ($env:MVNW_REPOURL) {
+  $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
+  $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
+}
+$distributionUrlName = $distributionUrl -replace '^.*/',''
+$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
+$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
+if ($env:MAVEN_USER_HOME) {
+  $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
+}
+$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
+$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
+
+if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
+  Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
+  exit $?
+}
+
+if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
+  Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
+}
+
+# prepare tmp dir
+$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
+$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
+$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
+trap {
+  if ($TMP_DOWNLOAD_DIR.Exists) {
+    try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+    catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+  }
+}
+
+New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
+
+# Download and Install Apache Maven
+Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+Write-Verbose "Downloading from: $distributionUrl"
+Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+$webclient = New-Object System.Net.WebClient
+if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
+  $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
+}
+[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
+$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
+if ($distributionSha256Sum) {
+  if ($USE_MVND) {
+    Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
+  }
+  Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
+  if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
+    Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
+  }
+}
+
+# unzip and move
+Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
+Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
+try {
+  Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
+} catch {
+  if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
+    Write-Error "fail to move MAVEN_HOME"
+  }
+} finally {
+  try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
+  catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
+}
+
+Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
Index: pom.xml
===================================================================
--- pom.xml	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ pom.xml	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>3.4.2</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>mk.ukim.finki.db</groupId>
+    <artifactId>DistributorApp</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>DistributorApp</name>
+    <description>DistributorApp</description>
+    <url/>
+    <licenses>
+        <license/>
+    </licenses>
+    <developers>
+        <developer/>
+    </developers>
+    <scm>
+        <connection/>
+        <developerConnection/>
+        <tag/>
+        <url/>
+    </scm>
+    <properties>
+        <java.version>17</java.version>
+    </properties>
+    <dependencies>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-thymeleaf</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.thymeleaf.extras</groupId>
+            <artifactId>thymeleaf-extras-springsecurity6</artifactId>
+            <version>3.1.1.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-actuator</artifactId>
+        </dependency>
+
+<!--        JWT Dependencies: -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-api</artifactId>
+            <version>0.11.5</version>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-impl</artifactId>
+            <version>0.11.5</version>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt-jackson</artifactId>
+            <version>0.11.5</version>
+            <scope>runtime</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
Index: src/main/java/mk/ukim/finki/db/distributorapp/DistributorAppApplication.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/DistributorAppApplication.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/DistributorAppApplication.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,15 @@
+package mk.ukim.finki.db.distributorapp;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+
+@SpringBootApplication
+@ServletComponentScan
+public class DistributorAppApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(DistributorAppApplication.class, args);
+    }
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/EmailAlreadyExistsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class EmailAlreadyExistsException extends RuntimeException {
+    public EmailAlreadyExistsException(String email) {
+        super("User with the email " + email + " already exists.");
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidArgumentsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class InvalidArgumentsException extends RuntimeException {
+
+    public InvalidArgumentsException() {
+        super("Invalid argument.");
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUserCredentialsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,8 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class InvalidUserCredentialsException extends RuntimeException {
+
+    public InvalidUserCredentialsException() {
+        super("Invalid user credentials");
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/InvalidUsernameOrPasswordException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,4 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class InvalidUsernameOrPasswordException extends RuntimeException {
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/PasswordsDoNotMatchException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class PasswordsDoNotMatchException extends RuntimeException {
+    public PasswordsDoNotMatchException() {
+        super("The two passwords do not match.");
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UserNotFoundException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+@ResponseStatus(HttpStatus.NOT_FOUND)
+public class UserNotFoundException extends RuntimeException {
+
+    public UserNotFoundException(String username) {
+        super(String.format("User with username: %s was not found", username));
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_exceptions/UsernameAlreadyExistsException.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,7 @@
+package mk.ukim.finki.db.distributorapp._exceptions;
+
+public class UsernameAlreadyExistsException extends RuntimeException {
+    public UsernameAlreadyExistsException(String username) {
+        super("User with the username " + username + " already exists.");
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUserDetailsService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.User;
+import mk.ukim.finki.db.distributorapp.users.UserRepository;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@RequiredArgsConstructor
+public class CustomUserDetailsService implements UserDetailsService {
+
+    private final UserRepository userRepository;
+
+    @Override
+    @Transactional
+    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
+        return new User(this.userRepository.findUsersByUserEmailIgnoreCaseDto(email));
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/CustomUsernamePasswordAuthenticationProvider.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,39 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class CustomUsernamePasswordAuthenticationProvider implements AuthenticationProvider {
+    private final UserService userService;
+    private final CustomUserDetailsService customUserDetailsService;
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        String email = authentication.getName();
+        String password = authentication.getCredentials().toString();
+
+        if ("".equals(email) || "".equals(password)) {
+            throw new BadCredentialsException("Invalid email or password");
+        }
+
+        UserDetails userDetails = this.customUserDetailsService.loadUserByUsername(email);
+        String salt = this.userService.findFullUserDtoByEmail(email).getUserSalt();
+        if (!PassEncryption.verifyUserPassword(password, userDetails.getPassword(), salt))
+            throw new BadCredentialsException("Invalid password");
+        return new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
+    }
+
+    @Override
+    public boolean supports(Class<?> aClass) {
+        return aClass.equals(UsernamePasswordAuthenticationToken.class);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/EmailService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,22 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+@Service("emailService")
+public class EmailService {
+    private final JavaMailSender javaMailSender;
+
+    @Autowired
+    public EmailService(JavaMailSender javaMailSender) {
+        this.javaMailSender = javaMailSender;
+    }
+
+    @Async
+    public void sendEmail(SimpleMailMessage message) {
+        javaMailSender.send(message);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryption.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,58 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.stereotype.Component;
+
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.spec.InvalidKeySpecException;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Random;
+
+@Component
+public class PassEncryption {
+    private static final Random random = new SecureRandom();
+    private static final String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+    private static final int iterations = 20000;
+    private static final int keyLength = 256;
+
+    public static String genSaltValue(int length) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < length; i++) {
+            sb.append(characters.charAt(random.nextInt(characters.length())));
+        }
+
+        return new String(sb);
+    }
+
+    public static byte[] hash(char[] password, byte[] salt) {
+        PBEKeySpec spec = new PBEKeySpec(password, salt, iterations, keyLength);
+        Arrays.fill(password, Character.MIN_VALUE);
+        try {
+            SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
+            return skf.generateSecret(spec).getEncoded();
+        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
+            throw new AssertionError("Error while hashing a password: " + e.getMessage(), e);
+        } finally {
+            spec.clearPassword();
+        }
+    }
+
+    public static String generateSecurePassword(String password, String salt) {
+        String res;
+        byte[] securePassword = hash(password.toCharArray(), salt.getBytes());
+
+        res = Base64.getEncoder().encodeToString(securePassword);
+        return res;
+    }
+
+    public static boolean verifyUserPassword(String providedPassword, String securedPassword, String salt) {
+        boolean res;
+        String newSecuredPassword = generateSecurePassword(providedPassword, salt);
+        res = newSecuredPassword.equals(securedPassword);
+
+        return res;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/PassEncryptionPasswordEncoder.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,30 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+import static mk.ukim.finki.db.distributorapp._security.PassEncryption.generateSecurePassword;
+import static mk.ukim.finki.db.distributorapp._security.PassEncryption.verifyUserPassword;
+
+@Component
+public class PassEncryptionPasswordEncoder implements PasswordEncoder {
+
+    @Override
+    public String encode(CharSequence rawPassword) {
+        throw new UnsupportedOperationException("Salt must be provided explicitly!");
+    }
+
+    public String encodeWithSalt(CharSequence rawPassword, String salt) {
+        return generateSecurePassword(rawPassword.toString(), salt);
+    }
+
+    @Override
+    public boolean matches(CharSequence rawPassword, String encodedPassword) {
+        throw new UnsupportedOperationException("Use matchesWithSalt for explicit salt verification!");
+    }
+
+    public boolean matchesWithSalt(CharSequence rawPassword, String encodedPassword, String salt) {
+        return verifyUserPassword(rawPassword.toString(), encodedPassword, salt);
+    }
+}
+
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/SecurityConfig.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,116 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp._security.jwt.JwtAuthenticationFilter;
+import mk.ukim.finki.db.distributorapp._security.jwt.JwtTokenProvider;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.CorsConfigurationSource;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+
+import java.util.List;
+
+@Configuration
+@RequiredArgsConstructor
+@EnableWebSecurity
+@EnableMethodSecurity()
+public class SecurityConfig {
+
+    private final CustomUsernamePasswordAuthenticationProvider authenticationProvider;
+    private final SuperUserAuthenticationProvider superUserAuthenticationProvider;
+    private final JwtTokenProvider jwtTokenProvider;
+
+    @Bean
+    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+        http
+                .requiresChannel(channel -> channel
+                        .anyRequest().requiresSecure() // Force HTTPS for all requests.
+                )
+                .cors(Customizer.withDefaults())
+                .authorizeHttpRequests(auth -> auth
+                        .requestMatchers("/auth/**", "/api/auth/**", "/reset-password/**", "/css/**", "/js/**").permitAll()
+                        .requestMatchers("/admin/**").hasRole("ADMIN")
+                        .requestMatchers("/customer/**", "/api/customer/**").hasAnyRole("CUSTOMER", "ADMIN")
+                        .requestMatchers("/manager/**", "/api/manager/**").hasAnyRole("MANAGER", "ADMIN")
+                        .requestMatchers("/driver/**", "/api/driver/**").hasAnyRole("DRIVER", "ADMIN")
+                        .anyRequest()
+                        .authenticated()
+                )
+                .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
+                .logout(logout -> logout
+                        .logoutUrl("/logout")
+                        .logoutSuccessUrl("/login?logout")
+                        .clearAuthentication(true)
+                        .invalidateHttpSession(true)
+                        .deleteCookies("JSESSIONID")
+                        .logoutSuccessUrl("/")
+                        .permitAll()
+                )
+                .exceptionHandling(exception ->
+                        exception.authenticationEntryPoint((request, response, authException) -> {
+                            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
+                        })
+                )
+                .csrf(AbstractHttpConfigurer::disable);
+
+        return http.build();
+    }
+
+    @Bean
+    public CorsConfigurationSource corsConfigurationSource() {
+        CorsConfiguration configuration = new CorsConfiguration();
+
+        configuration.setAllowedOrigins(List.of("https://10.0.2.2:8443"));
+        configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS"));
+        configuration.setAllowedHeaders(List.of("*"));
+        configuration.setAllowCredentials(true);
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", configuration);
+        return source;
+    }
+
+    @Bean
+    public InMemoryUserDetailsManager inMemoryUserDetailsManager() {
+        PasswordEncoder standardEncoder = new BCryptPasswordEncoder();
+        UserDetails superUser = User.withUsername("superuser@admin.com")
+                .password(standardEncoder.encode("supersecret"))
+                .roles("ADMIN")
+                .build();
+        return new InMemoryUserDetailsManager(superUser);
+    }
+
+    @Bean
+    public AuthenticationManager authenticationManager(
+            HttpSecurity http
+    ) throws Exception {
+        AuthenticationManagerBuilder authenticationManagerBuilder =
+                http.getSharedObject(AuthenticationManagerBuilder.class);
+
+        authenticationManagerBuilder.authenticationProvider(superUserAuthenticationProvider);
+        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
+
+        return authenticationManagerBuilder.build();
+    }
+
+    @Bean
+    public PasswordEncoder passwordEncoder() {
+        return new PassEncryptionPasswordEncoder();
+    }
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/SuperUserAuthenticationProvider.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,46 @@
+package mk.ukim.finki.db.distributorapp._security;
+
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SuperUserAuthenticationProvider implements AuthenticationProvider {
+
+    private static final String SUPERUSER_ENCODED_PASSWORD = "$2a$12$KC9Z0kHyu06iV4xlpKOgL.p2KH3NS9EY/N3g97nGAtC/NCpRXVgXa";
+
+    private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        String username = authentication.getName();
+        String rawPassword = authentication.getCredentials().toString();
+
+        if (!"superuser@admin.com".equalsIgnoreCase(username)) {
+            return null;
+        }
+
+        if (!passwordEncoder.matches(rawPassword, SUPERUSER_ENCODED_PASSWORD)) {
+            throw new BadCredentialsException("Invalid superuser credentials");
+        }
+
+        UserDetails superUser = User.withUsername("superuser@admin.com")
+                .password(SUPERUSER_ENCODED_PASSWORD)
+                .roles("ADMIN")
+                .build();
+
+        return new UsernamePasswordAuthenticationToken(superUser, superUser.getPassword(), superUser.getAuthorities());
+    }
+
+    @Override
+    public boolean supports(Class<?> authentication) {
+        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,94 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import jakarta.servlet.http.HttpServletRequest;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
+import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import mk.ukim.finki.db.distributorapp._exceptions.InvalidUserCredentialsException;
+import mk.ukim.finki.db.distributorapp.city.CityService;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import java.util.List;
+
+
+@Controller
+@RequestMapping("/auth")
+public class AuthController {
+
+    private final CityService cityService;
+    private final AuthService authService;
+
+    public AuthController(CityService cityService, AuthService authService) {
+        this.cityService = cityService;
+        this.authService = authService;
+    }
+
+    @GetMapping("/login")
+    public String login(@RequestParam(value = "error", required = false) String error, Model model) {
+        if (error != null) {
+            model.addAttribute("error", "Invalid username or password");
+        }
+        return "authentication/login";
+    }
+
+    @PostMapping("/login")
+    public String login(@ModelAttribute LoginRequestDto loginRequest, RedirectAttributes redirectAttributes) {
+        try {
+            UsersLoadingDto user = authService.login(loginRequest);
+
+            switch (user.getUserRole()) {
+                case "ROLE_CUSTOMER" -> {
+                    return "redirect:/home/customer";
+                }
+                case "ROLE_ADMIN" -> {
+                    return "redirect:/home/admin";
+                }
+                case "ROLE_MANAGER" -> {
+                    return "redirect:/home/manager";
+                }
+                case "ROLE_DRIVER" -> {
+                    return "redirect:/home/driver";
+                }
+                default -> {
+                    return "redirect:/home";
+                }
+            }
+        } catch (InvalidUserCredentialsException e) {
+            redirectAttributes.addFlashAttribute("error", "Invalid credentials.");
+            return "redirect:/auth/login";
+        }
+    }
+
+    @GetMapping("/register")
+    public String registerCustomer(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("cities", cities);
+        return "authentication/register";
+    }
+
+    @PostMapping("/register")
+    public String register(@ModelAttribute RegisterRequestDto registerRequest) throws Exception {
+        authService.register(registerRequest);
+        return "redirect:/auth/login";
+    }
+
+    @GetMapping("/changePass")
+    public String changePassword(Model model) {
+        return "authentication/changePass";
+    }
+
+    @GetMapping("/logout")
+    public String logout(HttpServletRequest req) {
+        req.getSession().invalidate();
+        return "redirect:/auth/login";
+    }
+
+    @PostMapping("/logout")
+    public String logout(Model model) {
+        return "redirect:/auth/login";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
+import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
+import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
+import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+
+public interface AuthService {
+    void register(RegisterRequestDto registerRequest) throws Exception;
+
+    void createManager(CreateManagerDto createUserDto) throws Exception;
+
+    void createDriver(CreateDriverDto createDriverDto) throws Exception;
+
+    UsersLoadingDto login(LoginRequestDto loginRequest);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/AuthServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,173 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.customer.CustomerRepository;
+import mk.ukim.finki.db.distributorapp.driver.DriverRepository;
+import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
+import mk.ukim.finki.db.distributorapp.manager.ManagerRepository;
+import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
+import mk.ukim.finki.db.distributorapp.token.TokenRepository;
+import mk.ukim.finki.db.distributorapp.users.Role;
+import mk.ukim.finki.db.distributorapp.token.TokenType;
+import mk.ukim.finki.db.distributorapp._exceptions.InvalidArgumentsException;
+import mk.ukim.finki.db.distributorapp._exceptions.InvalidUserCredentialsException;
+import mk.ukim.finki.db.distributorapp._security.EmailService;
+import mk.ukim.finki.db.distributorapp._security.PassEncryption;
+import mk.ukim.finki.db.distributorapp._security.PassEncryptionPasswordEncoder;
+import mk.ukim.finki.db.distributorapp._security.dto.LoginRequestDto;
+import mk.ukim.finki.db.distributorapp._security.dto.RegisterRequestDto;
+import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
+import mk.ukim.finki.db.distributorapp.users.UserRepository;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+@Service
+@RequiredArgsConstructor
+public class AuthServiceImpl implements AuthService {
+
+    private final UserRepository userRepository;
+    private final TokenRepository tokenRepository;
+    private final EmailService emailService;
+    private final PassEncryptionPasswordEncoder passwordEncoder;
+    private final CustomerRepository customerRepository;
+    private final ManagerRepository managerRepository;
+    private final DriverRepository driverRepository;
+
+    @Override
+    @Transactional
+    public void register(RegisterRequestDto registerRequest) throws Exception {
+        String saltValue = PassEncryption.genSaltValue(30);
+        String safePass = passwordEncoder.encodeWithSalt(registerRequest.getPassword(), saltValue);
+
+        Integer res = this.userRepository.create(
+                registerRequest.getName(),
+                registerRequest.getSurname(),
+                safePass,
+                registerRequest.getEmail(),
+                registerRequest.getMobile(),
+                saltValue,
+                false,
+                null,
+                registerRequest.getCity(),
+                Role.ROLE_CUSTOMER.name(),
+                "CUSTOMER");
+        if (res == 0) {
+            throw new Exception("User insertion failed");
+        }
+
+        UserDto user = this.userRepository.findUserDtoByEmail(registerRequest.getEmail());
+        String t_value = UUID.randomUUID().toString();
+        tokenRepository.create(
+                t_value,
+                LocalDateTime.now().plusHours(1),
+                user.getId(),
+                TokenType.TOKEN_VERIFICATION.name()
+        );
+
+        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
+
+        SimpleMailMessage mailMessage = new SimpleMailMessage();
+        mailMessage.setTo(registerRequest.getEmail());
+        mailMessage.setSubject("Complete Registration!");
+        mailMessage.setText(("To confirm your account, please click here: " +
+                "https://localhost:8080/register/confirm-account?token=" + createdToken.getT_value()));
+        System.out.println("Confirmation Token: " + createdToken.getT_value());
+        emailService.sendEmail(mailMessage);
+
+        this.customerRepository.create(
+                user.getId(),
+                registerRequest.getEdb(),
+                registerRequest.getName(),
+                registerRequest.getAddress(),
+                registerRequest.getProfileImage());
+    }
+
+    @Override
+    @Transactional
+    public void createManager(CreateManagerDto createManagerDto) throws Exception {
+        String saltValue = PassEncryption.genSaltValue(30);
+        String safePass = passwordEncoder.encodeWithSalt(createManagerDto.getPassword(), saltValue);
+
+        Integer res = this.userRepository.create(
+                createManagerDto.getName(),
+                createManagerDto.getSurname(),
+                safePass,
+                createManagerDto.getEmail(),
+                createManagerDto.getMobile(),
+                saltValue,
+                false,
+                null,
+                createManagerDto.getCity(),
+                Role.ROLE_MANAGER.name(),
+                "MANAGER");
+
+        if (res == 0) {
+            throw new Exception("User insertion failed");
+        }
+
+        UserDto user = this.userRepository.findUserDtoByEmail(createManagerDto.getEmail());
+        this.managerRepository.create(
+                user.getId(),
+                createManagerDto.getWarehouseId()
+        );
+    }
+
+    @Override
+    @Transactional
+    public void createDriver(CreateDriverDto createDriverDto) throws Exception {
+        String saltValue = PassEncryption.genSaltValue(30);
+        String safePass = passwordEncoder.encodeWithSalt(createDriverDto.getPassword(), saltValue);
+
+        Integer res = this.userRepository.create(
+                createDriverDto.getName(),
+                createDriverDto.getSurname(),
+                safePass,
+                createDriverDto.getEmail(),
+                createDriverDto.getMobile(),
+                saltValue,
+                false,
+                null,
+                createDriverDto.getCity(),
+                Role.ROLE_DRIVER.name(),
+                "DRIVER");
+
+        if (res == 0) {
+            throw new Exception("User insertion failed");
+        }
+
+        UserDto user = this.userRepository.findUserDtoByEmail(createDriverDto.getEmail());
+        this.driverRepository.create(
+                user.getId(),
+                createDriverDto.getVehicle()
+        );
+    }
+
+    @Override
+    @Transactional
+    public UsersLoadingDto login(LoginRequestDto loginRequest) {
+        if (loginRequest.getEmail() == null
+                || loginRequest.getEmail().isEmpty()
+                || loginRequest.getPassword() == null
+                || loginRequest.getPassword().isEmpty()) {
+
+            throw new InvalidArgumentsException();
+        }
+
+        UsersLoadingDto user = this.userRepository.findUsersByUserEmailIgnoreCaseDto(loginRequest.getEmail());
+
+        String secPassword = passwordEncoder
+                .encodeWithSalt(loginRequest.getPassword(), user.getUserSalt());
+
+        if (!secPassword.equals(user.getUserPassword())) {
+            throw new InvalidUserCredentialsException();
+        }
+
+        return user;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/PasswordResetController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,121 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import mk.ukim.finki.db.distributorapp.token.TokenType;
+import mk.ukim.finki.db.distributorapp.token.TokenRepository;
+import mk.ukim.finki.db.distributorapp._security.EmailService;
+import mk.ukim.finki.db.distributorapp._security.PassEncryptionPasswordEncoder;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/reset-password")
+public class PasswordResetController {
+    private final UserService userService;
+    private final EmailService emailService;
+    private final PassEncryptionPasswordEncoder passwordEncoder;
+    private final TokenRepository tokenRepository;
+
+
+    @GetMapping("/request")
+    public String resetPasswordRequest() {
+        return "authentication/reset-password-request";
+    }
+
+    @PostMapping("/reset-password-request")
+    public String resetPasswordRequest(@RequestParam("email") String email, Model model) {
+
+        UsersLoadingDto user = this.userService.findFullUserDtoByEmail(email);
+        if (user == null) {
+            model.addAttribute("error", "No user found with this email.");
+            return "authentication/reset-password-request";
+        }
+
+        String t_value = UUID.randomUUID().toString();
+        tokenRepository.create(
+                t_value,
+                LocalDateTime.now().plusHours(1),
+                user.getUserId(),
+                TokenType.TOKEN_RESET.name()
+        );
+        TokenDto createdToken = this.tokenRepository.findTokenByValue(t_value);
+
+        UserDto dto = this.userService.findUserDtoByEmail(email);
+        this.userService.edit(dto);
+
+        String resetLink = "https://localhost:8080/reset-password?token=" + createdToken.getT_value();
+        String emailBody = "Click the link to reset your password: " + resetLink;
+
+        SimpleMailMessage message = new SimpleMailMessage();
+        message.setTo(email);
+        message.setSubject("Password Reset Request");
+        message.setText(emailBody);
+        emailService.sendEmail(message);
+
+        model.addAttribute("success", "A password link has been sent to your email.");
+        return "authentication/reset-password-request";
+    }
+
+    @GetMapping("/reset-password")
+    public String showResetPasswordForm(@RequestParam("token") String tokenValue, Model model) {
+
+        UsersLoadingDto user = userService.findUserByResetToken(tokenValue);
+        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
+        if (user == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
+            model.addAttribute("error", "Invalid or expired token.");
+            return "authentication/reset-password";
+        }
+        model.addAttribute("token", token);
+        return "authentication/reset-password";
+    }
+
+    @PostMapping("/reset-password")
+    public String handleResetPassword(
+            @RequestParam("token") String tokenValue,
+            @RequestParam("newPassword") String newPassword,
+            @RequestParam("confirmPassword") String confirmPassword,
+            Model model) {
+
+        UsersLoadingDto user = userService.findUserByResetToken(tokenValue);
+        TokenDto token = tokenRepository.findTokenByValue(tokenValue);
+        if (user.getUserId() == null || token.getT_expiry().isBefore(LocalDateTime.now())) {
+            model.addAttribute("error", "Invalid or expired token.");
+            return "authentication/reset-password";
+        }
+
+        if (!newPassword.equals(confirmPassword)) {
+            model.addAttribute("error", "Passwords do not match.");
+            return "authentication/reset-password";
+        }
+
+        user.setUserPassword(passwordEncoder.encodeWithSalt(newPassword, user.getUserSalt()));
+        token.setT_validated_at(LocalDateTime.now());
+        tokenRepository.edit(
+                token.getT_id(),
+                token.getT_value(),
+                token.getT_expiry(),
+                token.getUser_id(),
+                token.getT_validated_at(),
+                token.getT_type()
+        );
+
+        UserDto dto = this.userService.findUserDtoByEmail(user.getUserEmail());
+        this.userService.edit(dto);
+
+        model.addAttribute("success", "Your password has been reset successfully.");
+        return "authentication/reset-password";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/auth/RestAuthController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,60 @@
+package mk.ukim.finki.db.distributorapp._security.auth;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
+import mk.ukim.finki.db.distributorapp._security.jwt.JwtTokenProvider;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/auth")
+public class RestAuthController {
+    private final AuthService authService;
+    private final JwtTokenProvider jwtTokenProvider;
+    private final AuthenticationManager authenticationManager;
+
+    @PostMapping("/login")
+    public ResponseEntity<?> login(@RequestBody AuthRequest request){
+        try{
+            var authentication = authenticationManager.authenticate(
+                    new UsernamePasswordAuthenticationToken(request.getEmail(), request.getPassword())
+            );
+            String email = authentication.getName();
+            List<String> roles = authentication.getAuthorities()
+                    .stream()
+                    .map(GrantedAuthority::getAuthority)
+                    .toList();
+            String token = jwtTokenProvider.createToken(email,roles);
+            return ResponseEntity.ok(new AuthResponse(token));
+        }catch (AuthenticationException e){
+            return ResponseEntity.status(404).body("Invalid email/password supplied");
+        }
+    }
+}
+
+@Getter
+@Setter
+class AuthRequest {
+    private String email;
+    private String password;
+}
+
+@Getter
+@Setter
+@AllArgsConstructor
+class AuthResponse {
+    private String token;
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/ChangePasswordDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChangePasswordDto {
+    String email;
+    String oldPassword;
+    String newPassword;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginRequestDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginRequestDto {
+    private String email;
+    private String password;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/LoginResponseDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginResponseDto {
+    private String token;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/dto/RegisterRequestDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp._security.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RegisterRequestDto {
+    private String name;
+    private String surname;
+    private String password;
+    private String repeatedPassword;
+    private String email;
+    private String mobile;
+    private String profileImage;
+    private Integer city;
+    private String edb;
+    private String compName;
+    private String address;
+    private String repImage;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtAuthenticationFilter.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,57 @@
+package mk.ukim.finki.db.distributorapp._security.jwt;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.util.StringUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+public class JwtAuthenticationFilter extends OncePerRequestFilter {
+
+    private final JwtTokenProvider jwtTokenProvider;
+
+    @Override
+    protected void doFilterInternal(HttpServletRequest request,
+                                    HttpServletResponse response,
+                                    FilterChain filterChain) throws ServletException, IOException {
+
+        String token = resolveToken(request);
+        if(token!=null && jwtTokenProvider.validateToken(token)){
+            String email = jwtTokenProvider.getEmailFromToken(token);
+
+            List<String> roles = jwtTokenProvider.getRolesFromToken(token);
+
+            List<GrantedAuthority> authorities = roles.stream()
+                    .map(SimpleGrantedAuthority::new)
+                    .collect(Collectors.toList());
+
+            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
+                    email, null, authorities);
+            auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+
+            SecurityContextHolder.getContext().setAuthentication(auth);
+        }
+
+        filterChain.doFilter(request, response);
+    }
+
+    private String resolveToken(HttpServletRequest request) {
+        String bearerToken = request.getHeader("Authorization");
+        if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
+            return bearerToken.substring(7);
+        }
+        return null;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_security/jwt/JwtTokenProvider.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,72 @@
+package mk.ukim.finki.db.distributorapp._security.jwt;
+
+import io.jsonwebtoken.*;
+import io.jsonwebtoken.security.Keys;
+import jakarta.annotation.PostConstruct;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.security.Key;
+import java.util.Date;
+import java.util.List;
+
+@Component
+public class JwtTokenProvider {
+
+    @Value("${jwt.secret}")
+    private String secret;
+
+    @Value("${jwt.validity}")
+    private long validityInMilliseconds;
+
+    private Key secretKey;
+
+    @PostConstruct
+    protected void init() {
+        secretKey = Keys.hmacShaKeyFor(secret.getBytes());
+    }
+
+    public String createToken(String email, List<String> roles) {
+        Claims claims = Jwts.claims().setSubject(email);
+        claims.put("roles", roles);
+        Date now = new Date();
+        Date validity = new Date(now.getTime() + validityInMilliseconds);
+
+        return Jwts.builder()
+                .setClaims(claims)
+                .setIssuedAt(now)
+                .setExpiration(validity)
+                .signWith(secretKey, SignatureAlgorithm.HS256)
+                .compact();
+    }
+
+    public boolean validateToken(String token) {
+        try {
+            Jws<Claims> claims = Jwts.parserBuilder()
+                    .setSigningKey(secretKey)
+                    .build()
+                    .parseClaimsJws(token);
+            return !claims.getBody().getExpiration().before(new Date());
+        } catch (JwtException | IllegalArgumentException e) {
+            return false;
+        }
+    }
+
+    public String getEmailFromToken(String token) {
+        return Jwts.parserBuilder()
+                .setSigningKey(secretKey)
+                .build()
+                .parseClaimsJws(token)
+                .getBody()
+                .getSubject();
+    }
+
+    public List<String> getRolesFromToken(String token) {
+        Claims claims = Jwts.parserBuilder()
+                .setSigningKey(secretKey)
+                .build()
+                .parseClaimsJws(token)
+                .getBody();
+        return (List<String>) claims.get("roles");
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/AdminController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,122 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+import mk.ukim.finki.db.distributorapp.driver.dto.CreateDriverDto;
+import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
+import mk.ukim.finki.db.distributorapp.manager.dto.CreateManagerDto;
+import mk.ukim.finki.db.distributorapp._security.auth.AuthService;
+import mk.ukim.finki.db.distributorapp.city.CityService;
+import mk.ukim.finki.db.distributorapp.driver.DriverService;
+import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping("/admin")
+public class AdminController {
+
+    private final AuthService authService;
+    private final CityService cityService;
+    private final WarehouseService warehouseService;
+    private final DriverService driverService;
+    private final VehicleService vehicleService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String getDashboard(Model model) {
+        return "home/admin";
+    }
+
+    //    MANAGER CONTROLS:
+
+    @GetMapping("/create-manager")
+    public String createManager(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("cities", cities);
+        model.addAttribute("manager", new CreateManagerDto());
+        return "create-manager";
+    }
+
+    @PostMapping("/create-manager")
+    public String createManager(@ModelAttribute("manager") CreateManagerDto createManagerDto) throws Exception {
+        WarehouseDto wh = this.warehouseService.findByCityId(createManagerDto.getCity());
+        createManagerDto.setWarehouseId(wh.getId());
+        this.authService.createManager(createManagerDto);
+        return "redirect:/manager/all";
+    }
+
+    @GetMapping("/edit-manager")
+    public String editManager() {
+        return "edit-manager";
+    }
+
+    @GetMapping("/warehouse-by-city")
+    @ResponseBody
+    public WarehouseDto getWarehouseByCity(@RequestParam("cityId") Integer cityId) {
+        return this.warehouseService.findByCityId(cityId);
+    }
+
+    //    DRIVER CONTROLS:
+    @GetMapping("/create-driver")
+    public String createDriver(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("cities", cities);
+        model.addAttribute("driver", new CreateDriverDto());
+        return "create-driver";
+    }
+
+    @GetMapping("/vehicle-by-city")
+    @ResponseBody
+    public List<VehicleBasicDto> getVehicleByCity(@RequestParam("cityId") Integer cityId) {
+        WarehouseDto wh = this.warehouseService.findByCityId(cityId);
+        return this.vehicleService.getVehiclesByWarehouse(wh.getId());
+    }
+
+    @PostMapping("/create-driver")
+    public String createDriver(@ModelAttribute("driver") CreateDriverDto createDriverDto, @ModelAttribute("vehicle") VehicleDto vehicleDto) throws Exception {
+        this.authService.createDriver(createDriverDto);
+        return "all-drivers";
+    }
+
+    @GetMapping("/edit-driver/{id}")
+    public String editDriver(@PathVariable("id") Long id, Model model) {
+        DriverDto driver = this.driverService.findById(id);
+        model.addAttribute("driver", driver);
+        return "edit-driver";
+    }
+
+    @PostMapping("/edit-driver/{id}")
+    public String editDriver(@PathVariable("id") Long id, @ModelAttribute("driver") DriverDto driverDto, Model model) {
+        Integer res = this.driverService.edit(driverDto);
+        if (res == 1) {
+            model.addAttribute("edit-success", true);
+        } else {
+            model.addAttribute("edit-success", false);
+        }
+        return "all-drivers";
+    }
+
+    //    WAREHOUSE CONTROLS:
+
+    @GetMapping("/create-warehouse")
+    public String createWarehouse(Model model) {
+        List<CityDtoRegister> cities = this.cityService.findAllCityDtos();
+        model.addAttribute("warehouse", new WarehouseDto());
+        model.addAttribute("cities", cities);
+        return "create-warehouse";
+    }
+
+    @PostMapping("/create-warehouse")
+    public String createWarehouse(@ModelAttribute("warehouse") WarehouseDto warehouseDto, Model model) {
+        this.warehouseService.create(warehouseDto);
+        return "redirect:/warehouse";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/CustomerController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,128 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.article.ArticleService;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnitService;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
+import mk.ukim.finki.db.distributorapp.category.CategoryService;
+import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
+import mk.ukim.finki.db.distributorapp.customer.CustomerService;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
+import mk.ukim.finki.db.distributorapp.manufacturer.ManufacturerService;
+import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
+import mk.ukim.finki.db.distributorapp.order.OrdersService;
+import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.Principal;
+import java.util.List;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping(value = "/customer")
+public class CustomerController {
+    private final CustomerService customerService;
+    private final UserService userService;
+    private final OrdersService ordersService;
+    private final DeliveryService deliveryService;
+    private final CategoryService categoryService;
+    private final WarehouseService warehouseService;
+    private final ArticleService articleService;
+    private final ArticleUnitService articleUnitService;
+    private final ManufacturerService manufacturerService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String dashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        CustomerDto customer = this.customerService.findCustomerById(user.getId());
+        model.addAttribute("customer", customer);
+        // TODO: fix fetching current orders for customer
+        model.addAttribute("currentOrders", ordersService.findCurrentOrdersByCustomer(customer.getId()));
+        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByCustomer(customer.getId()));
+        return "home/customer";
+    }
+
+    @GetMapping("/create-order")
+    public String createOrder(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        String userEmail = authentication.getName();
+
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        WarehouseDto warehouse = this.warehouseService.findByCityId(user.getCityId());
+
+        List<CategoryDto> categories = this.categoryService.listCategories();
+        List<ArticleDto> articles = this.articleService.getAllArticlesByWarehouse(warehouse.getId());
+        List<ManufacturerDto> manufacturers = this.manufacturerService.getAllManufacturers();
+        List<ArticleUnitDto> articleUnits = this.articleUnitService.getAllArticleUnitsByWarehouse(warehouse.getId());
+
+        model.addAttribute("categories", categories);
+        model.addAttribute("articles", articles);
+        model.addAttribute("manufacturers", manufacturers);
+        model.addAttribute("articleUnits", articleUnits);
+        return "create-order";
+    }
+
+    @InitBinder
+    public void initBinder(WebDataBinder binder) {
+        ObjectMapper objectMapper = new ObjectMapper();
+        binder.registerCustomEditor(List.class, "orderItems", new java.beans.PropertyEditorSupport() {
+            @Override
+            public void setAsText(String text) throws IllegalArgumentException {
+                try {
+                    List<OrderItemDto> items = objectMapper.readValue(
+                            text, new TypeReference<List<OrderItemDto>>() {
+                            }
+                    );
+                    setValue(items);
+                } catch (Exception e) {
+                    throw new IllegalArgumentException("Invalid JSON for order items", e);
+                }
+            }
+        });
+    }
+
+    @PostMapping("/create-order")
+    public String createOrder(@ModelAttribute CreateOrderDto createOrderDto, Principal principal) {
+
+        this.ordersService.create(createOrderDto, principal.getName());
+
+        String userEmail = principal.getName();
+
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        CustomerDto customer = this.customerService.findCustomerById(user.getId());
+
+        List<OrderSimpleDto> simpleCustomerOrders = this.ordersService.findSimpleOrdersByCustomer(customer.getId());
+        OrderSimpleDto createdOrder = simpleCustomerOrders.get(simpleCustomerOrders.size() - 1);
+        WarehouseDto wh = this.warehouseService.findByCityId(user.getCityId());
+
+        List<ArticleUnitSimpleDto> editedUnits = this.articleUnitService.addArticleUnitToOrder(createOrderDto.getOrderItems(), createdOrder.getId(), wh.getId());
+
+        for (ArticleUnitSimpleDto unit : editedUnits) {
+            this.articleUnitService.simpleEdit(unit);
+        }
+
+        return "redirect:/customer/dashboard";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/DriverController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,53 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.driver.DriverService;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping(value = "/driver")
+public class DriverController {
+    private final DriverService driverService;
+    private final UserService userService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String dashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        model.addAttribute("user", user);
+        model.addAttribute("startDelivery", new DeliveryStartDto());
+        model.addAttribute("endDelivery", new DeliveryEndDto());
+        model.addAttribute("ongoingDeliveries", this.driverService.getOngoingDeliveries(user.getId()));
+        model.addAttribute("newDeliveries", this.driverService.getNewAssignedDeliveries(user.getId()));
+        model.addAttribute("finishedDeliveries", this.driverService.getFinishedAssignedDeliveries(user.getId()));
+        return "home/driver";
+    }
+
+    @PostMapping("/start-delivery")
+    public String startDelivery(@ModelAttribute("startDelivery") DeliveryStartDto delivery) {
+        this.driverService.startDelivery(delivery);
+        return "redirect:/driver/dashboard";
+    }
+
+    @PostMapping("/end-delivery")
+    public String endDelivery(@ModelAttribute("endDelivery") DeliveryEndDto delivery) {
+        this.driverService.endDelivery(delivery);
+        return "redirect:/driver/dashboard";
+    }
+
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/HomeController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,54 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequiredArgsConstructor
+@RequestMapping({"/", "/home"})
+public class HomeController {
+    private final UserService userService;
+
+    @GetMapping
+    public String homePage(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication == null || !authentication.isAuthenticated() || authentication.getPrincipal().equals("anonymousUser")) {
+            model.addAttribute("userType", "Guest");
+            return "authentication/login";
+        }
+
+        String userEmail = authentication.getName();
+        if (userEmail.equals("superuser@admin.com")) {
+            return "redirect:/admin/dashboard";
+        }
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        switch (user.getRole()) {
+            case "ROLE_CUSTOMER" -> {
+                return "redirect:/customer/dashboard";
+            }
+            case "ROLE_DRIVER" -> {
+                return "redirect:/driver/dashboard";
+            }
+            case "ROLE_MANAGER" -> {
+                return "redirect:/manager/dashboard";
+            }
+        }
+        model.addAttribute("userType", "Guest");
+        return "authentication/login";
+    }
+
+    @GetMapping("/access_denied")
+    public String getAccessDeniedPage(Model model) {
+        model.addAttribute("error", "access_denied");
+        return "authentication/access_denied";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/ManagerController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,81 @@
+package mk.ukim.finki.db.distributorapp._web;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import mk.ukim.finki.db.distributorapp.order.OrdersService;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.vehicle.VehicleService;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.List;
+
+@Controller
+@RequestMapping(value = "/manager")
+@RequiredArgsConstructor
+public class ManagerController {
+    private final UserService userService;
+    private final VehicleService vehicleService;
+    private final OrdersService ordersService;
+    private final WarehouseService warehouseService;
+    private final DeliveryService deliveryService;
+
+    @GetMapping({"/dashboard", "/"})
+    public String dashboard(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        model.addAttribute("user", user);
+        model.addAttribute("currentInventory", warehouseService.getInventoryByManager(user.getId()));
+        model.addAttribute("vehicleStatus", vehicleService.getVehiclesByManager(user.getId()));
+        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
+        model.addAttribute("currentDeliveries", deliveryService.getCurrentDeliveriesByManager(user.getId()));
+        return "home/manager";
+    }
+
+    @GetMapping("/all")
+    public String allManagers(Model model) {
+        return "all-managers";
+    }
+
+    @GetMapping("/create-delivery")
+    public String createDelivery(Model model) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        model.addAttribute("user", user);
+        model.addAttribute("newDelivery", new DeliveryCreateDto());
+        model.addAttribute("newOrders", ordersService.getNewOrdersByManager(user.getId()));
+        model.addAttribute("vehicles", vehicleService.getVehiclesByManager(user.getId()));
+
+        return "create-delivery";
+    }
+
+    @PostMapping("/create-delivery")
+    public String createDelivery(@ModelAttribute DeliveryCreateDto newDelivery) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = authentication.getName();
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        this.deliveryService.create(newDelivery);
+
+        List<DeliverySimpleDto> deliveries = this.deliveryService.getDeliveriesByVehicle(newDelivery.getVehId());
+        DeliverySimpleDto createdDelivery = deliveries.get(0);
+
+        this.ordersService.addOrdersToDelivery(newDelivery.getOrders(), createdDelivery.getDeliveryId());
+
+        return "redirect:/manager/dashboard";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestArticleController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestArticleController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestArticleController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,26 @@
+package mk.ukim.finki.db.distributorapp._web.api;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.article.ArticleService;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/article")
+@CrossOrigin(origins = "*")
+public class RestArticleController {
+    private final ArticleService articleService;
+
+    @GetMapping("/")
+    public ResponseEntity<List<ArticleDto>> getArticles() {
+        List<ArticleDto> articles = this.articleService.getAllArticles();
+        return ResponseEntity.ok().body(articles);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestCustomerController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestCustomerController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestCustomerController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,66 @@
+package mk.ukim.finki.db.distributorapp._web.api;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.article.ArticleService;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnitService;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDashboardDto;
+import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
+import mk.ukim.finki.db.distributorapp.order.OrdersService;
+import mk.ukim.finki.db.distributorapp.order.dto.AndroidCreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.proForma.ProFormaService;
+import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("api/customer")
+@CrossOrigin(origins = "*")
+public class RestCustomerController {
+    private final ArticleService articleService;
+    private final OrdersService ordersService;
+    private final DeliveryService deliveryService;
+    private final ProFormaService proFormaService;
+    private final WarehouseService warehouseService;
+    private final UserService userService;
+    private final ArticleUnitService articleUnitService;
+
+    @GetMapping("/{customerId}/dashboard")
+    public ResponseEntity<CustomerDashboardDto> getCustomerDashboard(@PathVariable("customerId") Long customerId) {
+        CustomerDashboardDto dashboard = new CustomerDashboardDto();
+        List<OrderSimpleDto> userOrders = this.ordersService.findSimpleOrdersByCustomer(customerId);
+        List<DeliveryDto> userDeliveries = this.deliveryService.getCurrentDeliveriesByCustomer(customerId);
+        List<ProFormaDto> userProFormas = this.proFormaService.getCurentProFormasByCustomer(customerId);
+        dashboard.setOrders(userOrders);
+        dashboard.setDeliveries(userDeliveries);
+        dashboard.setProFormas(userProFormas);
+        return ResponseEntity.ok(dashboard);
+    }
+
+    @GetMapping("/articles")
+    public ResponseEntity<List<ArticleDto>> getArticles() {
+        List<ArticleDto> articles = this.articleService.getAllArticles();
+        return ResponseEntity.ok().body(articles);
+    }
+
+    @PostMapping("/create-order")
+    public ResponseEntity<OrderSimpleDto> createOrder(@RequestBody AndroidCreateOrderDto order){
+        // todo: implement creating order via api and try to unify the code for both android and angular.
+        UserDto user = this.userService.findUserDtoByEmail(order.getUserEmail());
+        WarehouseDto wh = this.warehouseService.findByUserId(user.getCityId());
+        ArticleDto article = this.articleService.findById(order.getArticleId(), wh.getId());
+        CreateOrderDto orderDto = new CreateOrderDto();
+        orderDto.setProForma(order.getProForma());
+        return ResponseEntity.ok(new OrderSimpleDto());
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestOrderController.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestOrderController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/_web/api/RestOrderController.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,62 @@
+package mk.ukim.finki.db.distributorapp._web.api;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnitService;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
+import mk.ukim.finki.db.distributorapp.customer.CustomerService;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+import mk.ukim.finki.db.distributorapp.order.OrdersService;
+import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseService;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/order")
+@CrossOrigin(origins = "*")
+public class RestOrderController {
+    private final OrdersService ordersService;
+    private final UserService userService;
+    private final CustomerService customerService;
+    private final WarehouseService warehouseService;
+    private final ArticleUnitService articleUnitService;
+
+    @PostMapping("/create")
+    @PreAuthorize("hasAnyRole('CUSTOMER','ADMIN')")
+    public ResponseEntity<?> createOrder(@RequestBody CreateOrderDto order) {
+        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+        String userEmail = auth.getPrincipal().toString();
+
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+
+        if (user == null) {
+            return ResponseEntity.badRequest().body("User not found");
+        }
+
+        this.ordersService.create(order,userEmail);
+
+        CustomerDto customer = this.customerService.findCustomerById(user.getId());
+
+        List<OrderSimpleDto> simpleCustomerOrders = this.ordersService.findSimpleOrdersByCustomer(customer.getId());
+        OrderSimpleDto createdOrder = simpleCustomerOrders.get(simpleCustomerOrders.size()-1);
+        WarehouseDto wh = this.warehouseService.findByCityId(user.getCityId());
+
+        List<ArticleUnitSimpleDto> editedUnits = this.articleUnitService.addArticleUnitToOrder(order.getOrderItems(), createdOrder.getId(), wh.getId());
+
+        for (ArticleUnitSimpleDto unit : editedUnits) {
+            this.articleUnitService.simpleEdit(unit);
+        }
+
+        return ResponseEntity.ok(createdOrder);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/article/Article.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,49 @@
+package mk.ukim.finki.db.distributorapp.article;
+
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.category.Category;
+import mk.ukim.finki.db.distributorapp.manufacturer.Manufacturer;
+import mk.ukim.finki.db.distributorapp.price.Price;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "article")
+public class Article {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "art_id", nullable = false)
+    private Long articleId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "art_name", nullable = false)
+    private String articleName;
+
+    @NotNull
+    @Column(name = "art_weight", nullable = false)
+    private Integer articleWeight;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "art_image", nullable = false)
+    private String artImage;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "ctg_id", nullable = false)
+    private Category category;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "man_id", nullable = false)
+    private Manufacturer manufacturer;
+
+    @OneToMany(mappedBy = "article")
+    private List<Price> prices;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,145 @@
+package mk.ukim.finki.db.distributorapp.article;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface ArticleRepository extends JpaRepository<Article, Long> {
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select a.art_id as id,
+                           a.art_name as name,
+                           m.man_name as manufacturer,
+                           0 as quantity,
+                           a.man_id as manufacturerId,
+                           p.price as price,
+                           c.ctg_name as category,
+                           a.ctg_id as categoryId,
+                           a.art_weight as weight,
+                           a.art_image as image
+                    from article a
+                    join manufacturer m on a.man_id = m.man_id
+                    join price p on p.art_id = a.art_id
+                    join category c on a.ctg_id = c.ctg_id
+                    """
+    )
+    List<ArticleDto> listAll();
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into article(art_name, art_image, art_weight, ctg_id, man_id) " +
+                    "values (?1,?2,?3,?4,?5)"
+    )
+    Integer create(
+            @NonNull @Param("name") String name,
+            @NonNull @Param("image") String image,
+            @NonNull @Param("weight") Integer weight,
+            @NonNull @Param("ctg") Integer ctg_id,
+            @NonNull @Param("man") Long man_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update article " +
+                    "set art_name=?2,art_image=?3,art_weight=?4,ctg_id=?5,man_id=?6 " +
+                    "where art_id=?1"
+    )
+    Integer edit(
+            @NonNull @Param("id") Long id,
+            @NonNull @Param("name") String name,
+            @NonNull @Param("img") String image,
+            @NonNull @Param("weight") Integer weight,
+            @NonNull @Param("ctg") Integer ctg_id,
+            @NonNull @Param("man") Long man_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from article where art_id=?1"
+    )
+    void delete(@Param("id") Long id);
+
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    with stock as (
+                        select a.art_id,
+                               count(au.unit_id) as quantity
+                        from article a
+                        join price p on a.art_id = p.art_id
+                        join unit_price up on p.price_id = up.price_id
+                        join article_unit au on up.unit_id = au.unit_id
+                        group by a.art_id
+                    )
+                    select a.art_id as id,
+                           a.art_name as name,
+                           m.man_name as manufacturer,
+                           st.quantity as quantity,
+                           m.man_id as manufacturerId,
+                           p.price as price,
+                           c.ctg_name as category,
+                           c.ctg_id as categoryId,
+                           a.art_weight as weight,
+                           a.art_image as image
+                    from article a
+                    join stock st on st.art_id=a.art_id
+                    join manufacturer m on a.man_id = m.man_id
+                    join category c on a.ctg_id = c.ctg_id
+                    join price p on a.art_id = p.art_id
+                    join unit_price up on p.price_id = up.price_id
+                    join article_unit au on up.unit_id = au.unit_id
+                    join warehouse w on w.wh_id = au.wh_id
+                    where w.wh_id = ?1
+                    """
+    )
+    List<ArticleDto> findAllByWarehouse(Integer warehouseId);
+//    ------------------------------------------------------------------------------
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    with stock as (
+                        select a.art_id,
+                               count(au.unit_id) as quantity
+                        from article a
+                        join price p on a.art_id = p.art_id
+                        join unit_price up on p.price_id = up.price_id
+                        join article_unit au on up.unit_id = au.unit_id
+                        group by a.art_id
+                    )
+                    select a.art_id as id,
+                           a.art_name as name,
+                           m.man_name as manufacturer,
+                           st.quantity as quantity,
+                           m.man_id as manufacturerId,
+                           p.price as price,
+                           c.ctg_name as category,
+                           c.ctg_id as categoryId,
+                           a.art_weight as weight,
+                           a.art_image as image
+                    from article a
+                    join stock st on st.art_id=a.art_id
+                    join manufacturer m on a.man_id = m.man_id
+                    join category c on a.ctg_id = c.ctg_id
+                    join price p on a.art_id = p.art_id
+                    join unit_price up on p.price_id = up.price_id
+                    join article_unit au on up.unit_id = au.unit_id
+                    join warehouse w on w.wh_id = au.wh_id
+                    where a.art_id=?1 and w.wh_id=?2
+                    """
+    )
+    ArticleDto findArticleDtoById(Long articleId, Integer warehouseId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.article;
+
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+
+import java.util.List;
+
+public interface ArticleService {
+    List<ArticleDto> getAllArticles();
+
+    void deleteById(Long id);
+
+    Integer editById(ArticleDto article);
+
+    Integer create(ArticleDto article);
+
+    List<ArticleDto> getAllArticlesByWarehouse(Integer warehouseId);
+
+    ArticleDto findById(Long articleId, Integer warehouseId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/article/ArticleServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,54 @@
+package mk.ukim.finki.db.distributorapp.article;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class ArticleServiceImpl implements ArticleService {
+    private final ArticleRepository articleRepository;
+
+    @Override
+    public List<ArticleDto> getAllArticles() {
+        return this.articleRepository.listAll();
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        this.articleRepository.deleteById(id);
+    }
+
+    @Override
+    public Integer editById(ArticleDto art) {
+        return this.articleRepository.edit(
+                art.getId(),
+                art.getName(),
+                art.getImage(),
+                art.getWeight(),
+                art.getCategoryId(),
+                art.getManufacturerId());
+    }
+
+    @Override
+    public Integer create(ArticleDto art) {
+        return this.articleRepository.create(
+                art.getName(),
+                art.getImage(),
+                art.getWeight(),
+                art.getCategoryId(),
+                art.getManufacturerId());
+    }
+
+    @Override
+    public List<ArticleDto> getAllArticlesByWarehouse(Integer warehouseId) {
+        return this.articleRepository.findAllByWarehouse(warehouseId);
+    }
+
+    @Override
+    public ArticleDto findById(Long articleId, Integer warehouseId) {
+        return this.articleRepository.findArticleDtoById(articleId, warehouseId);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/article/dto/ArticleDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/article/dto/ArticleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/article/dto/ArticleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,21 @@
+package mk.ukim.finki.db.distributorapp.article.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+public class ArticleDto {
+    private Long id;
+    private String name;
+    private String manufacturer;
+    private Integer quantity;
+    private Long manufacturerId;
+    private BigDecimal price;
+    private String category;
+    private Integer categoryId;
+    private Integer weight;
+    private String image;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnit.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,64 @@
+package mk.ukim.finki.db.distributorapp.articleUnit;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.order.Orders;
+import mk.ukim.finki.db.distributorapp.price.Price;
+import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+@Entity
+@Data
+@Table(name = "article_unit")
+public class ArticleUnit {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "unit_id")
+    private Long unitId;
+
+    @NotNull
+    @Column(name = "unit_expiration_date", nullable = false)
+    private Date unitExpirationDate;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "unit_serial_number", nullable = false)
+    private String unitSerialNumber;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "unit_batch_number", nullable = false)
+    private String unitBatchNumber;
+
+    @NotNull
+    @Column(name = "unit_manufacture_date", nullable = false)
+    private Date unitManufactureDate;
+
+    @NotNull
+    @Column(name = "unit_cost_price", nullable = false)
+    private BigDecimal unitCostPrice;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "wh_id", nullable = false)
+    private Warehouse warehouse;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "ord_id")
+    private Orders order;
+
+    @ManyToMany
+    @JoinTable(
+            name = "unit_price",
+            joinColumns = @JoinColumn(name = "unit_id"),
+            inverseJoinColumns = @JoinColumn(name = "price_id")
+    )
+    private Set<Price> prices = new LinkedHashSet<>();
+    // Hm...? Set<Price> or List<Price>
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,119 @@
+package mk.ukim.finki.db.distributorapp.articleUnit;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+public interface ArticleUnitRepository extends JpaRepository<ArticleUnit, Long> {
+    @Query(
+            nativeQuery = true,
+            value = "select * from article_unit"
+    )
+    List<ArticleUnitSimpleDto> listAll();
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select au.unit_id as id,
+                            au.unit_expiration_date as expiryDate,
+                            au.unit_serial_number as serialNo,
+                            au.unit_batch_number as batchNo,
+                            au.unit_manufacture_date as manufactureDate,
+                            au.unit_cost_price as costPrice,
+                            a.art_id as artId,
+                            a.art_name as artName,
+                            au.wh_id as whId,
+                            r.region_name as whRegion,
+                            c.city_name as whCity,
+                            au.ord_id as ordId,
+                            u.user_email as customerEmail
+                    from article_unit au
+                    join warehouse wh on au.wh_id = wh.wh_id
+                    join city c on wh.city_id = c.city_id
+                    join region r on c.region_id = r.region_id
+                    join unit_price up on au.unit_id = up.unit_id
+                    join price p on up.price_id = p.price_id
+                    join article a on p.art_id = a.art_id
+                    join orders o on au.ord_id = o.ord_id
+                    join customer cust on o.cust_id = cust.user_id
+                    join users u on cust.user_id = u.user_id
+                    """
+    )
+    List<ArticleUnitDto> findAllByWarehouse(@NonNull @Param("wh") Integer wh_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into article_unit(unit_expiration_date, unit_serial_number, unit_batch_number, unit_manufacture_date, unit_cost_price, wh_id, ord_id) " +
+                    "values (?1,?2,?3,?4,?5,?6,?7)"
+    )
+    Integer create(
+            @NonNull @Param("exp_date") Date unit_exp_date,
+            @NonNull @Param("ser_no") String unit_ser_number,
+            @NonNull @Param("batch_no") String unit_batch_number,
+            @NonNull @Param("man_date") Date unit_manufacture_date,
+            @NonNull @Param("cost_price") BigDecimal unit_cost_price,
+            @NonNull @Param("wh") Integer wh_id,
+            @Param("ord") Long ord_id
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    update article_unit
+                    set unit_expiration_date = ?2, unit_serial_number = ?3, unit_batch_number = ?4,unit_manufacture_date = ?5,unit_cost_price = ?6,wh_id = ?7,ord_id = ?8
+                    where unit_id=?1
+                    """
+    )
+    Integer edit(
+            @NonNull @Param("id") Long id,
+            @NonNull @Param("exp_date") Date unit_exp_date,
+            @NonNull @Param("ser_no") String unit_ser_number,
+            @NonNull @Param("batch_no") String unit_batch_number,
+            @NonNull @Param("man_date") Date unit_manufacture_date,
+            @NonNull @Param("cost_price") BigDecimal unit_cost_price,
+            @NonNull @Param("wh") Integer wh_id,
+            @Param("ord") Long ord_id
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from article_unit where unit_id=?1"
+    )
+    void delete(@NonNull @Param("id") Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select au.unit_id as id,
+                           au.unit_expiration_date as expiryDate,
+                           au.unit_serial_number as serialNo,
+                           au.unit_batch_number as batchNo,
+                           au.unit_manufacture_date as manufactureDate,
+                           au.unit_cost_price as costPrice,
+                           a.art_id as artId,
+                           au.wh_id as whId,
+                           au.ord_id as ordId
+                    from article_unit au
+                    join unit_price up on au.unit_id = up.unit_id
+                    join price p on up.price_id = p.price_id
+                    join article a on p.art_id = a.art_id
+                    where au.wh_id = ?2 and a.art_id = ?1
+                    """
+    )
+    List<ArticleUnitSimpleDto> findAllSimpleByArticleAndWarehouse(Long articleId, Integer warehouseId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,28 @@
+package mk.ukim.finki.db.distributorapp.articleUnit;
+
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface ArticleUnitService {
+    List<ArticleUnitSimpleDto> getAllArticleUnits();
+
+    Integer create(ArticleUnitDto articleUnitDto);
+
+    Integer edit(ArticleUnitDto articleUnitDto);
+
+    // TODO: Change edit and simpleEdit method
+    @Transactional
+    Integer simpleEdit(ArticleUnitSimpleDto articleUnitSimpleDto);
+
+    void delete(Long id);
+
+    List<ArticleUnitDto> getAllArticleUnitsByWarehouse(Integer warehouseId);
+
+    List<ArticleUnitSimpleDto> findAllSimpleByArticleAndWarehouse(Long articleId, Integer warehouseId);
+
+    List<ArticleUnitSimpleDto> addArticleUnitToOrder(List<OrderItemDto> orderItems, Long id, Integer whId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/ArticleUnitServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,101 @@
+package mk.ukim.finki.db.distributorapp.articleUnit;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitDto;
+import mk.ukim.finki.db.distributorapp.articleUnit.dto.ArticleUnitSimpleDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderItemDto;
+import mk.ukim.finki.db.distributorapp.unitPrice.UnitPriceRepository;
+import mk.ukim.finki.db.distributorapp.warehouse.WarehouseRepository;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class ArticleUnitServiceImpl implements ArticleUnitService {
+    private final ArticleUnitRepository articleUnitRepository;
+    private final WarehouseRepository warehouseRepository;
+    private final UnitPriceRepository unitPriceRepository;
+
+    @Override
+    public List<ArticleUnitSimpleDto> getAllArticleUnits() {
+        return this.articleUnitRepository.listAll();
+    }
+
+    @Override
+    @Transactional
+    public Integer create(ArticleUnitDto articleUnitDto) {
+        return this.articleUnitRepository.create(
+                articleUnitDto.getExpiryDate(),
+                articleUnitDto.getSerialNo(),
+                articleUnitDto.getBatchNo(),
+                articleUnitDto.getManufactureDate(),
+                articleUnitDto.getCostPrice(),
+                articleUnitDto.getWhId(),
+                articleUnitDto.getOrdId()
+        );
+    }
+
+    @Override
+    @Transactional
+    public Integer edit(ArticleUnitDto articleUnitDto) {
+        return this.articleUnitRepository.edit(
+                articleUnitDto.getId(),
+                articleUnitDto.getExpiryDate(),
+                articleUnitDto.getSerialNo(),
+                articleUnitDto.getBatchNo(),
+                articleUnitDto.getManufactureDate(),
+                articleUnitDto.getCostPrice(),
+                articleUnitDto.getWhId(),
+                articleUnitDto.getOrdId()
+        );
+    }
+
+    @Transactional
+    @Override
+    public Integer simpleEdit(ArticleUnitSimpleDto articleUnitSimpleDto) {
+        return this.articleUnitRepository.edit(
+                articleUnitSimpleDto.getId(),
+                articleUnitSimpleDto.getExpiryDate(),
+                articleUnitSimpleDto.getSerialNo(),
+                articleUnitSimpleDto.getBatchNo(),
+                articleUnitSimpleDto.getManufactureDate(),
+                articleUnitSimpleDto.getCostPrice(),
+                articleUnitSimpleDto.getWhId(),
+                articleUnitSimpleDto.getOrdId()
+        );
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.articleUnitRepository.deleteById(id);
+    }
+
+    @Override
+    public List<ArticleUnitDto> getAllArticleUnitsByWarehouse(Integer warehouseId) {
+        return this.articleUnitRepository.findAllByWarehouse(warehouseId);
+    }
+
+    @Override
+    public List<ArticleUnitSimpleDto> findAllSimpleByArticleAndWarehouse(Long articleId, Integer warehouseId) {
+        return this.articleUnitRepository.findAllSimpleByArticleAndWarehouse(articleId, warehouseId);
+    }
+
+    @Override
+    public List<ArticleUnitSimpleDto> addArticleUnitToOrder(List<OrderItemDto> orderItems, Long id, Integer whId) {
+        List<ArticleUnitSimpleDto> editedUnits = new ArrayList<>();
+        for (OrderItemDto orderItem : orderItems) {
+            Long articleId = orderItem.getArticle().getId();
+            Integer quantity = orderItem.getQuantity();
+
+            List<ArticleUnitSimpleDto> articleUnitItems = findAllSimpleByArticleAndWarehouse(articleId, whId);
+            for (int j = 0; j < quantity; j++) {
+                articleUnitItems.get(j).setOrdId(id);
+                editedUnits.add(articleUnitItems.get(j));
+            }
+        }
+        return editedUnits;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,25 @@
+package mk.ukim.finki.db.distributorapp.articleUnit.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class ArticleUnitDto {
+    private Long id;
+    private Date expiryDate;
+    private String serialNo;
+    private String batchNo;
+    private Date manufactureDate;
+    private BigDecimal costPrice;
+    private Long artId;
+    private String artName;
+    private Integer whId;
+    private String whRegion;
+    private String whCity;
+    private Long ordId;
+    private String customerEmail;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitSimpleDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitSimpleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/articleUnit/dto/ArticleUnitSimpleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp.articleUnit.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ArticleUnitSimpleDto {
+    Long id;
+    Date expiryDate;
+    String serialNo;
+    String batchNo;
+    Date manufactureDate;
+    BigDecimal costPrice;
+    Long artId;
+    Integer whId;
+    Long ordId;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/category/Category.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/category/Category.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/category/Category.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,29 @@
+package mk.ukim.finki.db.distributorapp.category;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.article.Article;
+
+import java.util.List;
+
+@Entity(name = "Category")
+@Data
+@Table(name = "category")
+public class Category {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ctg_id")
+    private Integer categoryId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "ctg_name", nullable = false)
+    private String categoryName;
+
+    @OneToMany(mappedBy = "category")
+    private List<Article> articles;
+
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,54 @@
+package mk.ukim.finki.db.distributorapp.category;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface CategoryRepository extends JpaRepository<Category, Long> {
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select ctg_id as id,
+                           ctg_name as name
+                    from category
+                    """
+    )
+    List<CategoryDto> listAll();
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into category(ctg_name)
+                    values (:name)
+                    """
+    )
+    Integer create(@Param("name") @NonNull String name);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update category " +
+                    "set ctg_name=?2 " +
+                    "where ctg_id=?1"
+    )
+    Integer edit(@NonNull Integer id,
+                 @NonNull String name);
+
+    @Modifying
+    @Transactional
+    @Query(
+            value = "delete from category " +
+                    "where ctg_id = ?1",
+            nativeQuery = true)
+    void deleteById(@NonNull Integer id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,16 @@
+package mk.ukim.finki.db.distributorapp.category;
+
+import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
+
+import java.util.List;
+
+public interface CategoryService {
+
+    List<CategoryDto> listCategories();
+
+    Integer create(CategoryDto categoryDto);
+
+    Integer edit(CategoryDto categoryDto);
+
+    void deleteById(Integer id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/category/CategoryServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,34 @@
+package mk.ukim.finki.db.distributorapp.category;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.category.dto.CategoryDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class CategoryServiceImpl implements CategoryService {
+    private final CategoryRepository categoryRepository;
+
+    @Override
+    public List<CategoryDto> listCategories() {
+        return this.categoryRepository.listAll();
+    }
+
+    @Override
+    public Integer create(CategoryDto categoryDto) {
+        return this.categoryRepository.create(categoryDto.getName());
+    }
+
+    @Override
+    public Integer edit(CategoryDto categoryDto) {
+        return this.categoryRepository.edit(categoryDto.getId(), categoryDto.getName());
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.categoryRepository.deleteById(id);
+    }
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/category/dto/CategoryDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/category/dto/CategoryDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/category/dto/CategoryDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.db.distributorapp.category.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class CategoryDto {
+    private Integer id;
+    private String name;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/city/City.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/city/City.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/city/City.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,38 @@
+package mk.ukim.finki.db.distributorapp.city;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.region.Region;
+import mk.ukim.finki.db.distributorapp.users.User;
+import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "city")
+public class City {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "city_id")
+    private Integer cityId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "city_name", nullable = false)
+    private String cityName;
+
+    @OneToMany(mappedBy = "city")
+    private List<User> users;
+
+    @OneToOne(mappedBy = "city")
+    private Warehouse warehouse;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "region_id", nullable = false)
+    private Region region;
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/city/CityRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/city/CityRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/city/CityRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,55 @@
+package mk.ukim.finki.db.distributorapp.city;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface CityRepository extends JpaRepository<City, Long> {
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select c.city_id as id, c.city_name as name
+                    from city c
+                    """
+    )
+    List<CityDtoRegister> findAllCityDtos();
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into city(city_name, region_id) " +
+                    "values (?1,?2)"
+    )
+    Integer create(
+            @NonNull String name,
+            @NonNull Integer region);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update city " +
+                    "set city_name=?2, region_id=?3 " +
+                    "where city_id=?1"
+    )
+    Integer edit(
+            @NonNull Integer id,
+            @NonNull String name,
+            @NonNull Integer region);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from city c " +
+                    "where c.city_id=?1"
+    )
+    void deleteById(@NonNull Integer id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/city/CityService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/city/CityService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/city/CityService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp.city;
+
+import mk.ukim.finki.db.distributorapp.city.dto.CityDto;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+
+import java.util.List;
+
+public interface CityService {
+
+    List<CityDtoRegister> findAllCityDtos();
+
+    Integer create(CityDto cityDto);
+
+    Integer edit(CityDto cityDto);
+
+    void deleteById(Integer id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/city/CityServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/city/CityServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/city/CityServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,34 @@
+package mk.ukim.finki.db.distributorapp.city;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDto;
+import mk.ukim.finki.db.distributorapp.city.dto.CityDtoRegister;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class CityServiceImpl implements CityService {
+    private final CityRepository cityRepository;
+
+    @Override
+    public List<CityDtoRegister> findAllCityDtos() {
+        return this.cityRepository.findAllCityDtos();
+    }
+
+    @Override
+    public Integer create(CityDto dto) {
+        return this.cityRepository.create(dto.getName(), dto.getRegionId());
+    }
+
+    @Override
+    public Integer edit(CityDto dto) {
+        return this.cityRepository.edit(dto.getId(), dto.getName(), dto.getRegionId());
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.cityRepository.deleteById(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,15 @@
+package mk.ukim.finki.db.distributorapp.city.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CityDto {
+    private Integer id;
+    private String name;
+    private Integer regionId;
+    private String regionName;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDtoRegister.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDtoRegister.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/city/dto/CityDtoRegister.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.db.distributorapp.city.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class CityDtoRegister {
+    private Integer id;
+    private String name;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customer/Customer.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,46 @@
+package mk.ukim.finki.db.distributorapp.customer;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import mk.ukim.finki.db.distributorapp.customerWeekday.CustomerWeekday;
+import mk.ukim.finki.db.distributorapp.order.Orders;
+import mk.ukim.finki.db.distributorapp.users.User;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Entity
+@Data
+@Table(name = "customer")
+@DiscriminatorValue("CUSTOMER")
+@PrimaryKeyJoinColumn(name = "user_id")
+public class Customer extends User {
+    @Size(max = 13)
+    @NotNull
+    @Column(name = "cust_EDB", nullable = false, length = 13)
+    private String customerEDB;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "cust_company_name", nullable = false)
+    private String customerCompanyName;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "cust_adr", nullable = false)
+    private String customerAddress;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "cust_representative_img")
+    private String customerRepresentativeImage;
+
+    @OneToMany(mappedBy = "customer", fetch = FetchType.EAGER)
+    private List<Orders> orders;
+
+    @OneToMany(mappedBy = "customer", fetch = FetchType.EAGER)
+    private List<CustomerWeekday> customerWeekdays;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,68 @@
+package mk.ukim.finki.db.distributorapp.customer;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface CustomerRepository extends JpaRepository<Customer, Long> {
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select c.user_id as id,
+                           u.user_name as name,
+                           u.user_email as email,
+                           u.user_mobile as phone,
+                           c.cust_edb as edb,
+                           c.cust_company_name as compName,
+                           c.cust_adr as address,
+                           c.cust_representative_img
+                    from customer c
+                    join users u on c.user_id = u.user_id
+                    """
+    )
+    CustomerDto findCustomerById(@NonNull Long id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into customer(user_id, cust_edb, cust_company_name, cust_adr, cust_representative_img)
+                    values (?1,?2,?3,?4,?5)
+                    """
+    )
+    Integer create(
+            @NonNull Long id,
+            @NonNull String customerEDB,
+            @NonNull String customerName,
+            @NonNull String customerStreet,
+            @NonNull String customerImage);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update customer " +
+                    "set cust_edb=?2,cust_company_name=?3,cust_adr=?4,cust_representative_img=?5 " +
+                    "where user_id=?1"
+    )
+    Integer edit(
+            @NonNull Long id,
+            @NonNull String customerEDB,
+            @NonNull String customerName,
+            @NonNull String customerStreet,
+            @NonNull String customerImage);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from customer " +
+                    "where user_id=?!"
+    )
+    void delete(@NonNull Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.db.distributorapp.customer;
+
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+
+public interface CustomerService {
+
+    CustomerDto findCustomerById(Long id);
+
+    Integer create(CustomerDto customerDto);
+
+    Integer edit(CustomerDto customerDto);
+
+    void deleteById(Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customer/CustomerServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,42 @@
+package mk.ukim.finki.db.distributorapp.customer;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CustomerServiceImpl implements CustomerService {
+
+    private final CustomerRepository customerRepository;
+
+    @Override
+    public CustomerDto findCustomerById(Long id) {
+        return this.customerRepository.findCustomerById(id);
+    }
+
+    @Override
+    public Integer create(CustomerDto customerDto) {
+        return this.customerRepository.create(
+                customerDto.getId(),
+                customerDto.getEdb(),
+                customerDto.getCompName(),
+                customerDto.getAddress(),
+                customerDto.getRepImage());
+    }
+
+    @Override
+    public Integer edit(CustomerDto customerDto) {
+        return this.customerRepository.edit(
+                customerDto.getId(),
+                customerDto.getEdb(),
+                customerDto.getCompName(),
+                customerDto.getAddress(),
+                customerDto.getRepImage());
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        this.customerRepository.delete(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDashboardDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDashboardDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDashboardDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.customer.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
+
+import java.util.List;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class CustomerDashboardDto {
+    List<OrderSimpleDto> orders;
+    List<DeliveryDto> deliveries;
+    List<ProFormaDto> proFormas;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customer/dto/CustomerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp.customer.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class CustomerDto {
+    private Long id;
+    private String name;
+    private String email;
+    private String phone;
+    private String edb;
+    private String compName;
+    private String address;
+    private String repImage;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekday.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekday.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekday.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,40 @@
+package mk.ukim.finki.db.distributorapp.customerWeekday;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import mk.ukim.finki.db.distributorapp.customer.Customer;
+import mk.ukim.finki.db.distributorapp.weekday.Weekday;
+
+import java.time.LocalTime;
+
+@Getter
+@Setter
+@Entity
+@Table(name = "customer_weekday")
+public class CustomerWeekday {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "cust_day_id", nullable = false)
+    private Long customerDayId;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "cust_id", nullable = false)
+    private Customer customer;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "day_id", nullable = false)
+    private Weekday day;
+
+    @NotNull
+    @Column(name = "start_time", nullable = false)
+    private LocalTime customerDayStartTime;
+
+    @NotNull
+    @Column(name = "end_time", nullable = false)
+    private LocalTime customerDayEndTime;
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,48 @@
+package mk.ukim.finki.db.distributorapp.customerWeekday;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalTime;
+
+public interface CustomerWeekdayRepository extends JpaRepository<CustomerWeekday, Long> {
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into customer_weekday(cust_id, day_id, start_time, end_time) " +
+                    "values (?1,?2,?3,?4)"
+    )
+    Integer create(
+            Long userId,
+            Short weekdayId,
+            LocalTime startTime,
+            LocalTime endTime);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update customer_weekday " +
+                    "set cust_id=?2,day_id=?3,start_time=?4,end_time=?5 " +
+                    "where cust_day_id=?1"
+    )
+    Integer edit(
+            Long custDayId,
+            Long userId,
+            Short weekdayId,
+            LocalTime startTime,
+            LocalTime endTime);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from customer_weekday where cust_day_id=?1"
+    )
+    void deleteById(@NonNull Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.customerWeekday;
+
+import mk.ukim.finki.db.distributorapp.customerWeekday.dto.CustomerWeekdayDto;
+
+public interface CustomerWeekdayService {
+
+    Integer create(CustomerWeekdayDto customerWeekdayDto);
+
+    Integer edit(CustomerWeekdayDto customerWeekdayDto);
+
+    void deleteById(Long customerWeekdayId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/CustomerWeekdayServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,37 @@
+package mk.ukim.finki.db.distributorapp.customerWeekday;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.customerWeekday.dto.CustomerWeekdayDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CustomerWeekdayServiceImpl implements CustomerWeekdayService {
+    private final CustomerWeekdayRepository customerWeekdayRepository;
+
+    @Override
+    public Integer create(CustomerWeekdayDto customerWeekdayDto) {
+        return this.customerWeekdayRepository.create(
+                customerWeekdayDto.getCustomerId(),
+                customerWeekdayDto.getDayId(),
+                customerWeekdayDto.getDayStartTime(),
+                customerWeekdayDto.getDayEndTime()
+        );
+    }
+
+    @Override
+    public Integer edit(CustomerWeekdayDto customerWeekdayDto) {
+        return this.customerWeekdayRepository.edit(
+                customerWeekdayDto.getCustomerId(),
+                customerWeekdayDto.getCustomerId(),
+                customerWeekdayDto.getDayId(),
+                customerWeekdayDto.getDayStartTime(),
+                customerWeekdayDto.getDayEndTime()
+        );
+    }
+
+    @Override
+    public void deleteById(Long customerWeekdayId) {
+        this.customerWeekdayRepository.deleteById(customerWeekdayId);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/dto/CustomerWeekdayDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/dto/CustomerWeekdayDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/customerWeekday/dto/CustomerWeekdayDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,18 @@
+package mk.ukim.finki.db.distributorapp.customerWeekday.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.time.LocalTime;
+
+@Data
+@AllArgsConstructor
+public class CustomerWeekdayDto {
+    private Long id;
+    private Long customerId;
+    private String customerName;
+    private Short dayId;
+    private String dayName;
+    private LocalTime dayStartTime;
+    private LocalTime dayEndTime;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/Delivery.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/Delivery.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/Delivery.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,55 @@
+package mk.ukim.finki.db.distributorapp.delivery;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.deliveryStatus.DeliveryStatus;
+import mk.ukim.finki.db.distributorapp.order.Orders;
+import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
+
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "delivery")
+public class Delivery {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "del_id")
+    private Long deliveryId;
+
+    @NotNull
+    @Column(name = "del_date_created", nullable = false)
+    private Date deliveryDateCreated;
+
+    @NotNull
+    @Column(name = "del_date", nullable = false)
+    private Date deliveryDate;
+
+    @Column(name = "del_start_km")
+    private Integer deliveryStartKm;
+
+    @Column(name = "del_end_km")
+    private Integer deliveryEndKm;
+
+    @Column(name = "del_start_time")
+    private LocalTime deliveryStartTime;
+
+    @Column(name = "del_end_time")
+    private LocalTime deliveryEndTime;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "d_status_id", nullable = false)
+    private DeliveryStatus deliveryStatus;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "veh_id", nullable = false)
+    private Vehicle vehicle;
+
+    @OneToMany(mappedBy = "delivery")
+    private List<Orders> orders;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,164 @@
+package mk.ukim.finki.db.distributorapp.delivery;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
+
+public interface DeliveryRepository extends JpaRepository<Delivery, Long> {
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into delivery(del_date_created, del_date, del_start_km, del_end_km, del_start_time, del_end_time, d_status_id, veh_id)
+                    values (?1,?2,?3,?4,?5,?6,?7,?8)
+                    """
+    )
+    Integer create(
+            @NonNull Date del_date_created,
+            @NonNull Date del_date,
+            Integer del_start_km,
+            Integer del_end_km,
+            LocalTime del_start_time,
+            LocalTime del_end_time,
+            @NonNull Short del_status_id,
+            @NonNull Integer veh_id
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    update delivery
+                    set del_date_created = ?2,del_date = ?3,del_start_km = ?4,del_end_km = ?5,del_start_time = ?6,del_end_time = ?7,d_status_id = ?8,veh_id = ?9
+                    where del_id = ?1
+                    """
+    )
+    Integer edit(
+            @NonNull Long id,
+            @NonNull Date del_date_created,
+            @NonNull Date del_date,
+            Integer del_start_km,
+            Integer del_end_km,
+            LocalTime del_start_time,
+            LocalTime del_end_time,
+            @NonNull Short del_status_id,
+            @NonNull Integer veh_id
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from delivery where del_id = ?1"
+    )
+    void delete(@NonNull Long id);
+
+    //------------------------------------------------------------------------------------------------------------------
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select del.del_id as id,
+                           del.del_date_created as dateCreated,
+                           del.del_date as deliveryDate,
+                           del.del_start_km as delStartKm,
+                           del.del_end_km as delEndKm,
+                           to_char(d.del_start_time, 'HH24:MI:22') as delStartTime,
+                           to_char(d.del_end_time, 'HH24:MI:SS') as delEndTime,
+                           del.d_status_id as dStatusId,
+                           ds.d_status_name as delStatus,
+                           v.veh_id as vehId,
+                           dr.user_id as driverId,
+                           u.user_name as driverName,
+                           u.user_image as driverImage
+                    from delivery del
+                        join orders o on o.del_id=del.del_id
+                        join delivery d on o.del_id = d.del_id
+                        join delivery_status ds on d.d_status_id=ds.d_status_id
+                        join vehicle v on v.veh_id=d.veh_id
+                        join driver dr on dr.veh_id=v.veh_id
+                        join users u on u.user_id=dr.user_id
+                    where o.cust_id=:customer and del.d_status_id <> 4;
+                    """
+    )
+    List<DeliveryDto> getCurrentDeliveriesByCustomer(@NonNull @Param("customer") Long customer_id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select d.del_id as id,
+                           d.del_date_created as dateCreated,
+                           d.del_date as deliveryDate,
+                           d.del_start_km as delStartKm,
+                           d.del_end_km as delEndKm,
+                           to_char(d.del_start_time, 'HH24:MI:22') as delStartTime,
+                           to_char(d.del_end_time, 'HH24:MI:SS') as delEndTime,
+                           d.d_status_id as dStatusId,
+                           ds.d_status_name as delStatus,
+                           v.veh_id as vehId,
+                           dr.user_id as driverId,
+                           u.user_name as driverName,
+                           u.user_image as driverImage
+                    from warehouse w
+                        join manager m on w.wh_id = m.wh_id
+                        join article_unit au on w.wh_id = au.wh_id
+                        join orders o on au.ord_id = o.ord_id
+                        join delivery d on o.del_id = d.del_id
+                        join delivery_status ds on d.d_status_id=ds.d_status_id
+                        join vehicle v on v.veh_id=d.veh_id
+                        join driver dr on dr.veh_id=v.veh_id
+                        join users u on u.user_id=dr.user_id
+                    where m.user_id=:manager and d.d_status_id<>4
+                    """
+    )
+    List<DeliveryDto> getCurrentDeliveriesByManager(@NonNull @Param("manager") Long manager_id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select del.del_id as deliveryId,
+                           u.user_name as driverName,
+                           del.del_date as deliveryDate,
+                           del.del_date_created as deliveryCreatedDate,
+                           del.d_status_id as deliveryStatus,
+                           ds.d_status_name as deliveryStatusName
+                    from delivery del
+                    join delivery_status ds on ds.d_status_id=del.d_status_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on d.veh_id = v.veh_id
+                    join users u on u.user_id=d.user_id
+                    where v.veh_id = ?1
+                    """
+    )
+    List<DeliverySimpleDto> getDeliveriesByVehicle(Integer vehicleId);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select d.del_id as delId,
+                           d.del_date_created as delDateCreated,
+                           d.del_date as delDate,
+                           d.del_start_km as delStartKm,
+                           d.del_end_km as delEndKm,
+                           to_char(d.del_start_time, 'HH24:MI:22') as delStartTime,
+                           to_char(d.del_end_time, 'HH24:MI:SS') as delEndTime,
+                           d.d_status_id as delStatusId,
+                           d.veh_id as veh_id
+                    from delivery d
+                    where d.del_id = ?1
+                    """
+    )
+    DeliveryFullDto findDeliveryDtoById(@Param("id") Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,25 @@
+package mk.ukim.finki.db.distributorapp.delivery;
+
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+
+import java.util.List;
+
+public interface DeliveryService {
+
+    DeliveryFullDto findDeliveryById(Long id);
+
+    Integer create(DeliveryCreateDto deliveryDto);
+
+    Integer edit(DeliveryFullDto deliveryDto);
+
+    void deleteById(Long del_id);
+
+    List<DeliveryDto> getCurrentDeliveriesByCustomer(Long customerId);
+
+    List<DeliveryDto> getCurrentDeliveriesByManager(Long managerId);
+
+    List<DeliverySimpleDto> getDeliveriesByVehicle(Integer vehicleId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/DeliveryServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,72 @@
+package mk.ukim.finki.db.distributorapp.delivery;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryCreateDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class DeliveryServiceImpl implements DeliveryService {
+    private final DeliveryRepository deliveryRepository;
+
+    @Override
+    public DeliveryFullDto findDeliveryById(Long id) {
+        return this.deliveryRepository.findDeliveryDtoById(id);
+    }
+
+    @Override
+    public Integer create(DeliveryCreateDto deliveryDto) {
+        Date currentDate = new Date();
+        return this.deliveryRepository.create(
+                currentDate,
+                deliveryDto.getDelDate(),
+                null,
+                null,
+                null,
+                null,
+                (short) 1,
+                deliveryDto.getVehId()
+        );
+    }
+
+    @Override
+    public Integer edit(DeliveryFullDto deliveryDto) {
+        return this.deliveryRepository.edit(
+                deliveryDto.getDelId(),
+                deliveryDto.getDelDateCreated(),
+                deliveryDto.getDelDate(),
+                deliveryDto.getDelStartKm(),
+                deliveryDto.getDelEndKm(),
+                deliveryDto.getParsedDelStartTime(),
+                deliveryDto.getParsedDelEndTime(),
+                deliveryDto.getDelStatusId(),
+                deliveryDto.getVeh_id()
+        );
+    }
+
+    @Override
+    public void deleteById(Long del_id) {
+        this.deliveryRepository.delete(del_id);
+    }
+
+    @Override
+    public List<DeliveryDto> getCurrentDeliveriesByCustomer(Long customerId) {
+        return this.deliveryRepository.getCurrentDeliveriesByCustomer(customerId);
+    }
+
+    @Override
+    public List<DeliveryDto> getCurrentDeliveriesByManager(Long managerId) {
+        return this.deliveryRepository.getCurrentDeliveriesByManager(managerId);
+    }
+
+    @Override
+    public List<DeliverySimpleDto> getDeliveriesByVehicle(Integer vehicleId) {
+        return this.deliveryRepository.getDeliveriesByVehicle(vehicleId);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryCreateDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryCreateDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryCreateDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.delivery.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeliveryCreateDto {
+    private Integer vehId;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private Date delDate;
+    private List<Long> orders;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,36 @@
+package mk.ukim.finki.db.distributorapp.delivery.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class DeliveryDto {
+    private Long id;
+    private Date dateCreated;
+    private Date delDate;
+    private Integer delStartKm;
+    private Integer delEndKm;
+
+    private String delStartTime;
+    private String delEndTime;
+
+    private Short dStatusId;
+    private String delStatus;
+    private Integer vehId;
+    private Long driverId;
+    private String driverName;
+    private String driverImg;
+
+
+    public LocalTime getParsedDelStartTime() {
+        return delStartTime != null ? LocalTime.parse(delStartTime) : null;
+    }
+
+    public LocalTime getParsedDelEndTime() {
+        return delEndTime != null ? LocalTime.parse(delEndTime) : null;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryEndDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryEndDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryEndDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.db.distributorapp.delivery.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeliveryEndDto {
+    private Long id;
+    private Integer delEndKm;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryFullDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryFullDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryFullDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,33 @@
+package mk.ukim.finki.db.distributorapp.delivery.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalTime;
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeliveryFullDto {
+    private Long delId;
+    private Date delDateCreated;
+    private Date delDate;
+    private Integer delStartKm;
+    private Integer delEndKm;
+
+    private String delStartTime;
+    private String delEndTime;
+
+    private Short delStatusId;
+    private Integer veh_id;
+
+    public LocalTime getParsedDelStartTime() {
+        return delStartTime != null ? LocalTime.parse(delStartTime) : null;
+    }
+
+    public LocalTime getParsedDelEndTime() {
+        return delEndTime != null ? LocalTime.parse(delEndTime) : null;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliverySimpleDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliverySimpleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliverySimpleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.delivery.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeliverySimpleDto {
+    private Long deliveryId;
+    private String driverName;
+    private Date deliveryDate;
+    private Date deliveryCreatedDate;
+    private Short deliveryStatus;
+    private String deliveryStatusName;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryStartDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryStartDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/delivery/dto/DeliveryStartDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.db.distributorapp.delivery.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeliveryStartDto {
+    private Long id;
+    private Integer delStartKm;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatus.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatus.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatus.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,31 @@
+package mk.ukim.finki.db.distributorapp.deliveryStatus;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.delivery.Delivery;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "delivery_status")
+public class DeliveryStatus {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "d_status_id")
+    private Short deliveryStatusId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "d_status_name", nullable = false)
+    private String deliveryStatusName;
+
+    @NotNull
+    @Column(name = "d_status_desc", nullable = false)
+    private String deliveryStatusDescription;
+
+    @OneToMany(mappedBy = "deliveryStatus")
+    private List<Delivery> deliveries;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,37 @@
+package mk.ukim.finki.db.distributorapp.deliveryStatus;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface DeliveryStatusRepository extends JpaRepository<DeliveryStatus, Short> {
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into delivery_status(d_status_name, d_status_desc) " +
+                    "values (?1,?2)"
+    )
+    Integer create(@NonNull String name, @NonNull String description);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update delivery_status " +
+                    "set d_status_name=?2,d_status_desc=?3 " +
+                    "where d_status_id=?1"
+    )
+    Integer edit(@NonNull Short id, @NonNull String name, @NonNull String description);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from delivery_status where d_status_id=?1"
+    )
+    void delete(@NonNull Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.deliveryStatus;
+
+import mk.ukim.finki.db.distributorapp.deliveryStatus.dto.DeliveryStatusDto;
+
+public interface DeliveryStatusService {
+
+    Integer create(DeliveryStatusDto deliveryStatusDto);
+
+    Integer edit(DeliveryStatusDto deliveryStatusDto);
+
+    void deleteById(Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/DeliveryStatusServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,31 @@
+package mk.ukim.finki.db.distributorapp.deliveryStatus;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.deliveryStatus.dto.DeliveryStatusDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class DeliveryStatusServiceImpl implements DeliveryStatusService {
+    private final DeliveryStatusRepository deliveryStatusRepository;
+
+    @Override
+    public Integer create(DeliveryStatusDto deliveryStatusDto) {
+        return this.deliveryStatusRepository.create(
+                deliveryStatusDto.getStatusName(),
+                deliveryStatusDto.getStatusDescription());
+    }
+
+    @Override
+    public Integer edit(DeliveryStatusDto deliveryStatusDto) {
+        return this.deliveryStatusRepository.edit(
+                deliveryStatusDto.getId(),
+                deliveryStatusDto.getStatusName(),
+                deliveryStatusDto.getStatusDescription());
+    }
+
+    @Override
+    public void deleteById(Short id) {
+        this.deliveryStatusRepository.delete(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/dto/DeliveryStatusDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/dto/DeliveryStatusDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/deliveryStatus/dto/DeliveryStatusDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.deliveryStatus.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class DeliveryStatusDto {
+    private Short id;
+    private String statusName;
+    private String statusDescription;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/driver/Driver.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,21 @@
+package mk.ukim.finki.db.distributorapp.driver;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import mk.ukim.finki.db.distributorapp.users.User;
+import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
+
+@EqualsAndHashCode(callSuper = true)
+@Entity
+@Data
+@Table(name = "driver")
+@DiscriminatorValue("DRIVER")
+@PrimaryKeyJoinColumn(name = "user_id")
+public class Driver extends User {
+    @NotNull
+    @OneToOne
+    @JoinColumn(name = "veh_id", nullable = false)
+    private Vehicle vehicle;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,119 @@
+package mk.ukim.finki.db.distributorapp.driver;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface DriverRepository extends JpaRepository<Driver, Long> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into driver(user_id, veh_id) " +
+                    "values (?1,?2)"
+    )
+    Integer create(
+            @NonNull Long usr_id,
+            @NonNull Integer veh_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update driver " +
+                    "set veh_id=?2 " +
+                    "where user_id=?1"
+    )
+    Integer edit(
+            @NonNull Long usr_id,
+            @NonNull Integer veh_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from driver where user_id=?1"
+    )
+    void delete(@NonNull Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select d.user_id as id,
+                           u.user_name as name,
+                           u.user_email as email,
+                           u.user_mobile as phone,
+                           u.user_image as image,
+                           d.veh_id as vehId
+                    from driver d
+                    join users u on d.user_id = u.user_id
+                    where d.user_id = :id
+                    """
+    )
+    DriverDto findDriverById(@NonNull @Param("id") Long id);
+
+    //    ---------------Dashboard queries------------------------------------------
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select del.del_id as deliveryId,
+                           u.user_name as driverName,
+                           del.del_date as deliveryDate,
+                           del.del_date_created as deliveryCreatedDate,
+                           del.d_status_id as deliveryStatus,
+                           ds.d_status_name as deliveryStatusName
+                    from delivery del
+                    join delivery_status ds on del.d_status_id = ds.d_status_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on v.veh_id = d.veh_id
+                    join users u on u.user_id = d.user_id
+                    where d.user_id = ?1 and del.d_status_id = 1
+                    """
+    )
+    List<DeliverySimpleDto> activeAssignedDeliveries(@NonNull Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select del.del_id as deliveryId,
+                           u.user_name as driverName,
+                           del.del_date as deliveryDate,
+                           del.del_date_created as deliveryCreatedDate,
+                           del.d_status_id as deliveryStatus,
+                           ds.d_status_name as deliveryStatusName
+                    from delivery del
+                    join delivery_status ds on del.d_status_id = ds.d_status_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on v.veh_id = d.veh_id
+                    join users u on u.user_id = d.user_id
+                    where d.user_id = ?1 and del.d_status_id not between 1 and 3
+                    """
+    )
+    List<DeliverySimpleDto> finishedAssignedDeliveries(@NonNull Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select del.del_id as deliveryId,
+                           u.user_name as driverName,
+                           del.del_date as deliveryDate,
+                           del.del_date_created as deliveryCreatedDate,
+                           del.d_status_id as deliveryStatus,
+                           ds.d_status_name as deliveryStatusName
+                    from delivery del
+                    join delivery_status ds on del.d_status_id = ds.d_status_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on v.veh_id = d.veh_id
+                    join users u on u.user_id = d.user_id
+                    where d.user_id = ?1 and del.d_status_id = 3
+                    """
+    )
+    List<DeliverySimpleDto> getOngoingDeliveries(@NonNull Long driverId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,29 @@
+package mk.ukim.finki.db.distributorapp.driver;
+
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
+import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
+
+import java.util.List;
+
+public interface DriverService {
+
+    DriverDto findById(Long id);
+
+    Integer create(DriverDto driverDto);
+
+    Integer edit(DriverDto driverDto);
+
+    void deleteById(Long id);
+
+    List<DeliverySimpleDto> getNewAssignedDeliveries(Long driverId);
+
+    List<DeliverySimpleDto> getFinishedAssignedDeliveries(Long driverId);
+
+    void startDelivery(DeliveryStartDto delivery);
+
+    List<DeliverySimpleDto> getOngoingDeliveries(Long driverId);
+
+    void endDelivery(DeliveryEndDto delivery);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/driver/DriverServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,86 @@
+package mk.ukim.finki.db.distributorapp.driver;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryEndDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryFullDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliverySimpleDto;
+import mk.ukim.finki.db.distributorapp.delivery.dto.DeliveryStartDto;
+import mk.ukim.finki.db.distributorapp.driver.dto.DriverDto;
+import mk.ukim.finki.db.distributorapp.delivery.DeliveryService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class DriverServiceImpl implements DriverService {
+    private final DriverRepository driverRepository;
+    private final DeliveryService deliveryService;
+
+    @Override
+    public DriverDto findById(Long id) {
+        return this.driverRepository.findDriverById(id);
+    }
+
+    @Override
+    public Integer create(DriverDto driverDto) {
+        return this.driverRepository.create(
+                driverDto.getId(),
+                driverDto.getVehId());
+    }
+
+    @Override
+    public Integer edit(DriverDto driverDto) {
+        return this.driverRepository.edit(
+                driverDto.getId(),
+                driverDto.getVehId()
+        );
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        this.driverRepository.deleteById(id);
+    }
+
+    @Override
+    public List<DeliverySimpleDto> getNewAssignedDeliveries(Long driverId) {
+        return this.driverRepository.activeAssignedDeliveries(driverId);
+    }
+
+    @Override
+    public List<DeliverySimpleDto> getFinishedAssignedDeliveries(Long driverId) {
+        return this.driverRepository.finishedAssignedDeliveries(driverId);
+    }
+
+    @Override
+    public List<DeliverySimpleDto> getOngoingDeliveries(Long driverId) {
+        return this.driverRepository.getOngoingDeliveries(driverId);
+    }
+
+    @Override
+    @Transactional
+    public void startDelivery(DeliveryStartDto delivery) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+        DeliveryFullDto deliveryDto = this.deliveryService.findDeliveryById(delivery.getId());
+        deliveryDto.setDelStartKm(delivery.getDelStartKm());
+        deliveryDto.setDelStartTime(LocalTime.now().format(formatter));
+        deliveryDto.setDelStatusId((short) 3);
+        this.deliveryService.edit(deliveryDto);
+    }
+
+    @Override
+    @Transactional
+    public void endDelivery(DeliveryEndDto delivery) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
+
+        DeliveryFullDto deliveryDto = this.deliveryService.findDeliveryById(delivery.getId());
+        deliveryDto.setDelEndKm(delivery.getDelEndKm());
+        deliveryDto.setDelEndTime(LocalTime.now().format(formatter));
+        deliveryDto.setDelStatusId((short) 4);
+        this.deliveryService.edit(deliveryDto);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/CreateDriverDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/CreateDriverDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/CreateDriverDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.db.distributorapp.driver.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CreateDriverDto {
+    private String name;
+    private String surname;
+    private String password;
+    private String repeatedPassword;
+    private String email;
+    private String mobile;
+    private String profileImage;
+    private Integer city;
+    private Integer vehicle;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/DriverDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/DriverDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/driver/dto/DriverDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp.driver.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DriverDto {
+    private Long id;
+    private String name;
+    private String email;
+    private String phone;
+    private String image;
+    private Integer vehId;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manager/Manager.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,21 @@
+package mk.ukim.finki.db.distributorapp.manager;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import mk.ukim.finki.db.distributorapp.users.User;
+import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
+
+@EqualsAndHashCode(callSuper = true)
+@Entity
+@Data
+@Table(name = "manager")
+@DiscriminatorValue("MANAGER")
+@PrimaryKeyJoinColumn(name = "user_id")
+public class Manager extends User {
+    @NotNull
+    @OneToOne
+    @JoinColumn(name = "wh_id", nullable = false, unique = true)
+    private Warehouse warehouse;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,40 @@
+package mk.ukim.finki.db.distributorapp.manager;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface ManagerRepository extends JpaRepository<Manager, Integer> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into manager(user_id, wh_id) " +
+                    "values (?1,?2)"
+    )
+    Integer create(
+            @NonNull Long id,
+            @NonNull Integer whId);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update manager " +
+                    "set wh_id=?2 " +
+                    "where user_id=?1"
+    )
+    Integer edit(
+            @NonNull Long id,
+            @NonNull Integer whId);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from manager where user_id=?1"
+    )
+    void delete(@NonNull Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.db.distributorapp.manager;
+
+import mk.ukim.finki.db.distributorapp.manager.dto.ManagerDto;
+
+public interface ManagerService {
+
+    Integer create(ManagerDto managerDto);
+
+    Integer edit(ManagerDto managerDto);
+
+    void deleteById(Long id);
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manager/ManagerServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,32 @@
+package mk.ukim.finki.db.distributorapp.manager;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.manager.dto.ManagerDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class ManagerServiceImpl implements ManagerService {
+    private final ManagerRepository managerRepository;
+
+    @Override
+    public Integer create(ManagerDto managerDto) {
+        return this.managerRepository.create(
+                managerDto.getId(),
+                managerDto.getWhId()
+        );
+    }
+
+    @Override
+    public Integer edit(ManagerDto managerDto) {
+        return this.managerRepository.edit(
+                managerDto.getId(),
+                managerDto.getWhId()
+        );
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        this.managerRepository.delete(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/CreateManagerDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/CreateManagerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/CreateManagerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.db.distributorapp.manager.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CreateManagerDto {
+    private String name;
+    private String surname;
+    private String password;
+    private String repeatedPassword;
+    private String email;
+    private String mobile;
+    private String profileImage;
+    private Integer city;
+    private Integer warehouseId;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/ManagerDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/ManagerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manager/dto/ManagerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.manager.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ManagerDto {
+    private Long id;
+    private String name;
+    private String email;
+    private String phone;
+    private String image;
+    private Integer whId;
+    private String whRegion;
+    private String whCity;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/Manufacturer.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/Manufacturer.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/Manufacturer.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,42 @@
+package mk.ukim.finki.db.distributorapp.manufacturer;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.article.Article;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "manufacturer")
+public class Manufacturer {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "man_id")
+    private Long manufacturerId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "man_name", nullable = false)
+    private String manufacturerName;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "man_adr", nullable = false)
+    private String manufacturerAddress;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "man_mobile", nullable = false)
+    private String manufacturerMobile;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "man_email", nullable = false)
+    private String manufacturerEmail;
+
+    @OneToMany(mappedBy = "manufacturer")
+    private List<Article> articles;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,65 @@
+package mk.ukim.finki.db.distributorapp.manufacturer;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface ManufacturerRepository extends JpaRepository<Manufacturer, Long> {
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select m.man_id as id,
+                           m.man_name as name,
+                           m.man_adr as address,
+                           m.man_mobile as phone,
+                           m.man_email as email
+                    from manufacturer m
+                    """
+    )
+    List<ManufacturerDto> listAll();
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into manufacturer(man_name, man_adr, man_mobile, man_email)
+                    values (?1,?2,?3,?4)
+                    """
+    )
+    Integer create(
+            @NonNull String name,
+            @NonNull String address,
+            @NonNull String mobile,
+            @NonNull String email);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    update manufacturer
+                    set man_name=?2,man_adr=?3,man_mobile=?4,man_email=?5
+                    where man_id=?1
+                    """
+    )
+    Integer edit(
+            @NonNull Long id,
+            @NonNull String name,
+            @NonNull String address,
+            @NonNull String mobile,
+            @NonNull String email);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from manufacturer where man_id=?1"
+    )
+    void delete(@NonNull Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,15 @@
+package mk.ukim.finki.db.distributorapp.manufacturer;
+
+import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
+
+import java.util.List;
+
+public interface ManufacturerService {
+    List<ManufacturerDto> getAllManufacturers();
+
+    Integer create(ManufacturerDto manufacturerDto);
+
+    Integer edit(ManufacturerDto manufacturerDto);
+
+    void deleteById(Long id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/ManufacturerServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,42 @@
+package mk.ukim.finki.db.distributorapp.manufacturer;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.manufacturer.dto.ManufacturerDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class ManufacturerServiceImpl implements ManufacturerService {
+    private final ManufacturerRepository manufacturerRepository;
+
+    @Override
+    public List<ManufacturerDto> getAllManufacturers() {
+        return this.manufacturerRepository.listAll();
+    }
+
+    @Override
+    public Integer create(ManufacturerDto manufacturerDto) {
+        return this.manufacturerRepository.create(
+                manufacturerDto.getName(),
+                manufacturerDto.getAddress(),
+                manufacturerDto.getPhone(),
+                manufacturerDto.getEmail());
+    }
+
+    @Override
+    public Integer edit(ManufacturerDto manufacturerDto) {
+        return this.manufacturerRepository.edit(
+                manufacturerDto.getId(),
+                manufacturerDto.getName(),
+                manufacturerDto.getAddress(),
+                manufacturerDto.getPhone(),
+                manufacturerDto.getEmail());
+    }
+
+    @Override
+    public void deleteById(Long id) {
+
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/dto/ManufacturerDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/dto/ManufacturerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/manufacturer/dto/ManufacturerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.db.distributorapp.manufacturer.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ManufacturerDto {
+    private Long id;
+    private String name;
+    private String address;
+    private String phone;
+    private String email;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/Orders.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/Orders.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/Orders.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,59 @@
+package mk.ukim.finki.db.distributorapp.order;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
+import mk.ukim.finki.db.distributorapp.customer.Customer;
+import mk.ukim.finki.db.distributorapp.delivery.Delivery;
+import mk.ukim.finki.db.distributorapp.orderStatus.OrderStatus;
+import mk.ukim.finki.db.distributorapp.proForma.ProForma;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "orders")
+public class Orders {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "ord_id", nullable = false)
+    private Long orderId;
+
+    @NotNull
+    @Column(name = "ord_date", nullable = false)
+    private LocalDate orderDate;
+
+    @NotNull
+    @Column(name = "ord_sum", nullable = false)
+    private Integer orderSum;
+
+    @Column(name = "ord_fulfillment_date")
+    private LocalDateTime orderFulfillmentDate;
+
+    @Column(name = "ord_comment")
+    private String orderComment;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "o_status_id", nullable = false)
+    private OrderStatus orderStatus;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "cust_id", nullable = false)
+    private Customer customer;
+
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "del_id", nullable = false)
+    private Delivery delivery;
+
+    @OneToOne
+    @JoinColumn(name = "pf_id", nullable = false, unique = true)
+    private ProForma proForma;
+
+    @OneToMany(mappedBy = "order")
+    private List<ArticleUnit> articleUnits;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,241 @@
+package mk.ukim.finki.db.distributorapp.order;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderManagerDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrdersDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+public interface OrdersRepository extends JpaRepository<Orders, Long> {
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select o.ord_id as id,
+                           o.ord_date as ordDate,
+                           o.ord_sum as ordSum,
+                           o.ord_fulfillment_date as ordFulfillmentDate,
+                           o.ord_comment as ordComment,
+                           o.o_status_id as oStatusId,
+                           os.o_status_name as statusName,
+                           o.cust_id as customerId,
+                           c.cust_company_name as customerName,
+                           u.user_mobile as customerPhone,
+                           u.user_email as customerEmail,
+                           o.del_id as deliveryId,
+                           d.user_id as driverId,
+                           u1.user_name as driverName,
+                           u1.user_mobile as driverPhone,
+                           u1.user_email as driverEmail,
+                           o.pf_id as pfId,
+                           pfs.pf_status_name as pfStatus
+                    from orders o
+                    join order_status os on o.o_status_id = os.o_status_id
+                    join customer c on c.user_id=o.cust_id
+                    join users u on c.user_id=u.user_id
+                    join delivery del on o.del_id = del.del_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on d.veh_id=v.veh_id
+                    join users u1 on d.user_id=u1.user_id
+                    join pro_forma pf on o.pf_id = pf.pf_id
+                    join pro_forma_status pfs on pfs.pf_status_id=pf.pf_status_id
+                    """
+    )
+    List<OrdersDto> listAll();
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select o.ord_id as id,
+                           o.ord_date as ordDate,
+                           o.ord_sum as ordSum,
+                           o.ord_fulfillment_date as ordFulfillmentDate,
+                           o.ord_comment as ordComment,
+                           o.o_status_id as oStatusId,
+                           os.o_status_name as statusName,
+                           o.cust_id as customerId,
+                           c.cust_company_name as customerName,
+                           u.user_mobile as customerPhone,
+                           u.user_email as customerEmail,
+                           del.del_id as deliveryId,
+                           d.user_id as driverId,
+                           u1.user_name as driverName,
+                           u1.user_mobile as driverPhone,
+                           u1.user_email as driverEmail,
+                           pf.pf_id as pfId,
+                           pfs.pf_status_name as pfStatus
+                    from orders o
+                    join order_status os on o.o_status_id = os.o_status_id
+                    join customer c on o.cust_id = c.user_id
+                    join users u on c.user_id = u.user_id
+                    join delivery del on o.del_id = del.del_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on d.veh_id=v.veh_id
+                    join users u1 on d.user_id=u1.user_id
+                    join pro_forma pf on o.pf_id = pf.pf_id
+                    join pro_forma_status pfs on pfs.pf_status_id=pf.pf_status_id
+                    where o.cust_id = ?1
+                    """
+    )
+    List<OrdersDto> findOrdersByCustomer(@NonNull Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select o.ord_id as id,
+                           o.ord_date as ordDate,
+                           o.ord_sum as ordSum,
+                           o.ord_fulfillment_date as ordFulfillmentDate,
+                           o.ord_comment as ordComment,
+                           o.o_status_id as oStatusId,
+                           o.cust_id as customerId,
+                           o.del_id as deliveryId,
+                           o.pf_id as pfId
+                    from orders o
+                    where o.cust_id = ?1
+                    """
+    )
+    List<OrderSimpleDto> findSimpleOrdersByCustomer(@NonNull Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = "select * from orders where ord_id=?1"
+    )
+    OrdersDto findOrderById(@NonNull Long id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into orders (ord_date, ord_sum, ord_fulfillment_date, ord_comment, o_status_id, cust_id, del_id, pf_id)
+                    values (?1,?2,?3,?4,?5,?6,?7,?8)
+                    """
+    )
+    Integer create(
+            @NonNull LocalDate ord_date,
+            @NonNull Integer ord_sum,
+            LocalDateTime ord_fulfillment_date,
+            String ord_comment,
+            @NonNull Short ord_status_id,
+            @NonNull Long cust_id,
+            Long del_id,
+            Long pf_id
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    update orders
+                    set ord_date=?2,ord_sum=?3,ord_fulfillment_date=?4,ord_comment=?5,o_status_id=?6,cust_id=?7,del_id=?8,pf_id=?9
+                    where ord_id=?1
+                    """
+    )
+    Integer edit(
+            @NonNull Long id,
+            @NonNull LocalDate ord_date,
+            @NonNull Integer ord_sum,
+            LocalDateTime ord_fulfillment_date,
+            String ord_comment,
+            @NonNull Short ord_status_id,
+            @NonNull Long cust_id,
+            @NonNull Long del_id,
+            @NonNull Long pf_id
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from orders where ord_id=?1"
+    )
+    void delete(@NonNull Long id);
+    //----------------------------------------------------------------------------------------------------------------------------------
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select o.ord_id as id,
+                           o.ord_date as ordDate,
+                           o.ord_sum as ordSum,
+                           o.ord_fulfillment_date as ordFulfillmentDate,
+                           o.ord_comment as ordComment,
+                           o.o_status_id as oStatusId,
+                           os.o_status_name as statusName,
+                           o.cust_id as customerId,
+                           c.cust_company_name as customerName,
+                           u.user_mobile as customerPhone,
+                           u.user_email as customerEmail,
+                           o.del_id as deliveryId,
+                           d.user_id as driverId,
+                           u1.user_name as driverName,
+                           u1.user_mobile as driverPhone,
+                           u1.user_email as driverEmail,
+                           o.pf_id as pfId,
+                           pfs.pf_status_name as pfStatus
+                    from orders o
+                    join order_status os on o.o_status_id = os.o_status_id
+                    join customer c on c.user_id=o.cust_id
+                    join users u on c.user_id=u.user_id
+                    join delivery del on o.del_id = del.del_id
+                    join vehicle v on del.veh_id = v.veh_id
+                    join driver d on d.veh_id=v.veh_id
+                    join users u1 on d.user_id=u1.user_id
+                    join pro_forma pf on o.pf_id = pf.pf_id
+                    join pro_forma_status pfs on pfs.pf_status_id=pf.pf_status_id
+                    where o.cust_id=:customer and o.o_status_id between 2 and 6
+                    """
+    )
+    List<OrdersDto> getCurrentOrdersByCustomer(@NonNull @Param("customer") Long customer_id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select o.ord_id as id,
+                           o.ord_date as ordDate,
+                           o.ord_sum as ordSum,
+                           o.ord_fulfillment_date as ordFulfillmentDate,
+                           c.cust_company_name as customerName,
+                           o.ord_comment as ordComment,
+                           o.o_status_id as oStatusId,
+                           o.cust_id as customerId,
+                           o.del_id as deliveryId,
+                           o.pf_id as pfId
+                    from warehouse w
+                        join manager m on w.wh_id= m.wh_id
+                        join article_unit au on au.wh_id = w.wh_id
+                        join orders o on au.ord_id = o.ord_id
+                        join customer c on o.cust_id = c.user_id
+                        join order_status os on os.o_status_id = o.o_status_id
+                    where m.user_id = ?1
+                    """
+    )
+    List<OrderManagerDto> getNewOrdersByManager(@NonNull Long manager_id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select o.ord_id as id,
+                           o.ord_date as ordDate,
+                           o.ord_sum as ordSum,
+                           o.ord_fulfillment_date as ordFulfillmentDate,
+                           o.ord_comment as ordComment,
+                           o.o_status_id as oStatusId,
+                           o.cust_id as customerId,
+                           o.del_id as deliveryId,
+                           o.pf_id as pfId
+                    from orders o
+                    where o.ord_id = ?1
+                    """
+    )
+    OrderSimpleDto findSimpleOrdersById(Long orderId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,29 @@
+package mk.ukim.finki.db.distributorapp.order;
+
+import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderManagerDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrdersDto;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface OrdersService {
+
+    List<OrderSimpleDto> findSimpleOrdersByCustomer(Long customerId);
+
+    OrdersDto findById(Long id);
+
+    @Transactional
+    Integer create(CreateOrderDto createOrderDto, String userEmail);
+
+    Integer edit(OrdersDto ordersDto);
+
+    void deleteById(Long id);
+
+    List<OrdersDto> findCurrentOrdersByCustomer(Long customerId);
+
+    List<OrderManagerDto> getNewOrdersByManager(Long managerId);
+
+    void addOrdersToDelivery(List<Long> orderIds, Long deliveryId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/OrdersServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,133 @@
+package mk.ukim.finki.db.distributorapp.order;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.customer.CustomerService;
+import mk.ukim.finki.db.distributorapp.customer.dto.CustomerDto;
+import mk.ukim.finki.db.distributorapp.order.dto.CreateOrderDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderManagerDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrderSimpleDto;
+import mk.ukim.finki.db.distributorapp.order.dto.OrdersDto;
+import mk.ukim.finki.db.distributorapp.proForma.ProFormaService;
+import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
+import mk.ukim.finki.db.distributorapp.users.UserService;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class OrdersServiceImpl implements OrdersService {
+    private final OrdersRepository ordersRepository;
+    private final UserService userService;
+    private final CustomerService customerService;
+    private final ProFormaService proFormaService;
+
+    @Override
+    public List<OrderSimpleDto> findSimpleOrdersByCustomer(Long customerId) {
+        return this.ordersRepository.findSimpleOrdersByCustomer(customerId);
+    }
+
+    @Override
+    public OrdersDto findById(Long id) {
+        return this.ordersRepository.findOrderById(id);
+    }
+
+    @Override
+    @Transactional
+    public Integer create(CreateOrderDto createOrderDto, String userEmail) {
+        UserDto user = this.userService.findUserDtoByEmail(userEmail);
+        CustomerDto customer = this.customerService.findCustomerById(user.getId());
+
+        OrdersDto order = new OrdersDto();
+
+        if (createOrderDto.isProForma()) {
+            ProFormaDto pf = new ProFormaDto();
+            pf.setPfDeadline(LocalDate.now().plusWeeks(1));
+            pf.setPfDateCreated(LocalDate.now());
+            pf.setStatusId((short) 1);
+            this.proFormaService.create(pf);
+            List<ProFormaDto> proFormaList = this.proFormaService.getAllProForma();
+            ProFormaDto createdProForma = proFormaList.get(proFormaList.size() - 1);
+            order.setPfId(createdProForma.getId());
+        }
+
+        order.setCustomerId(customer.getId());
+        order.setOrdDate(LocalDate.now());
+        order.setOrdFulfillmentDate(null);
+        order.setOStatusId((short) 1);
+        order.setDeliveryId(null);
+        order.setPfId(null);
+        order.setOrdComment(null);
+
+        Integer sum = createOrderDto.getOrderItems()
+                .stream()
+                .map(i -> i.getArticle().getPrice().multiply(BigDecimal.valueOf(i.getQuantity())))
+                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                .intValue();
+        order.setOrdSum(sum);
+
+        return this.ordersRepository.create(
+                order.getOrdDate(),
+                order.getOrdSum(),
+                order.getOrdFulfillmentDate(),
+                order.getOrdComment(),
+                order.getOStatusId(),
+                order.getCustomerId(),
+                order.getDeliveryId(),
+                order.getPfId()
+        );
+    }
+
+    @Override
+    public Integer edit(OrdersDto ordersDto) {
+        return this.ordersRepository.edit(
+                ordersDto.getId(),
+                ordersDto.getOrdDate(),
+                ordersDto.getOrdSum(),
+                ordersDto.getOrdFulfillmentDate(),
+                ordersDto.getOrdComment(),
+                ordersDto.getOStatusId(),
+                ordersDto.getCustomerId(),
+                ordersDto.getDeliveryId(),
+                ordersDto.getPfId()
+        );
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        this.ordersRepository.deleteById(id);
+    }
+
+    @Override
+    public List<OrdersDto> findCurrentOrdersByCustomer(Long customerId) {
+        return this.ordersRepository.getCurrentOrdersByCustomer(customerId);
+    }
+
+    @Override
+    public List<OrderManagerDto> getNewOrdersByManager(Long managerId) {
+        return this.ordersRepository.getNewOrdersByManager(managerId);
+    }
+
+    @Override
+    public void addOrdersToDelivery(List<Long> orderIds, Long deliveryId) {
+        for (Long i : orderIds) {
+            OrderSimpleDto order = this.ordersRepository.findSimpleOrdersById(i);
+            order.setDeliveryId(deliveryId);
+            this.ordersRepository.edit(
+                    order.getId(),
+                    order.getOrdDate().toLocalDate(),
+                    order.getOrdSum(),
+                    order.getOrdFulfillmentDate(),
+                    order.getOrdComment(),
+                    order.getOStatusId(),
+                    order.getCustomerId(),
+                    order.getDeliveryId(),
+                    order.getPfId()
+            );
+        }
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/dto/AndroidCreateOrderDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/dto/AndroidCreateOrderDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/dto/AndroidCreateOrderDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,18 @@
+package mk.ukim.finki.db.distributorapp.order.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AndroidCreateOrderDto {
+    Long articleId;
+    BigDecimal unitPrice;
+    Integer quantity;
+    String userEmail;
+    Boolean proForma;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/dto/CreateOrderDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/dto/CreateOrderDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/dto/CreateOrderDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,15 @@
+package mk.ukim.finki.db.distributorapp.order.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class CreateOrderDto {
+    private List<OrderItemDto> orderItems;
+    boolean proForma;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderItemDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderItemDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderItemDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,14 @@
+package mk.ukim.finki.db.distributorapp.order.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.db.distributorapp.article.dto.ArticleDto;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderItemDto {
+    private ArticleDto article;
+    private Integer quantity;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderManagerDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderManagerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderManagerDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp.order.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderManagerDto {
+    private Long id;
+    private java.sql.Date ordDate;
+    private Integer ordSum;
+    private LocalDateTime ordFulfillmentDate;
+    private String customerName;
+    private String ordComment;
+    private Short oStatusId;
+    private Long customerId;
+    private Long deliveryId;
+    private Long pfId;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderSimpleDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderSimpleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrderSimpleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,22 @@
+package mk.ukim.finki.db.distributorapp.order.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderSimpleDto {
+    private Long id;
+    private java.sql.Date ordDate;
+    private Integer ordSum;
+    private LocalDateTime ordFulfillmentDate;
+    private String ordComment;
+    private Short oStatusId;
+    private Long customerId;
+    private Long deliveryId;
+    private Long pfId;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrdersDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrdersDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/order/dto/OrdersDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,32 @@
+package mk.ukim.finki.db.distributorapp.order.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrdersDto {
+    private Long id;
+    private LocalDate ordDate;
+    private Integer ordSum;
+    private LocalDateTime ordFulfillmentDate;
+    private String ordComment;
+    private Short oStatusId;
+    private String statusName;
+    private Long customerId;
+    private String customerName;
+    private String customerPhone;
+    private String customerEmail;
+    private Long deliveryId;
+    private Long driverId;
+    private String driverName;
+    private String driverPhone;
+    private String driverEmail;
+    private Long pfId;
+    private String pfStatus;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatus.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatus.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatus.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,31 @@
+package mk.ukim.finki.db.distributorapp.orderStatus;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.order.Orders;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "order_status", schema = "IND0_185022")
+public class OrderStatus {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "o_status_id")
+    private Short orderStatusId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "o_status_name", nullable = false)
+    private String orderStatusName;
+
+    @NotNull
+    @Column(name = "o_status_desc", nullable = false)
+    private String orderStatusDescription;
+
+    @OneToMany(mappedBy = "orderStatus")
+    private List<Orders> orders;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,36 @@
+package mk.ukim.finki.db.distributorapp.orderStatus;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface OrderStatusRepository extends JpaRepository<OrderStatus, Short> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into order_status(o_status_name, o_status_desc) " +
+                    "values (?1,?2)"
+    )
+    Integer create(@NonNull String name, @NonNull String description);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update order_status " +
+                    "set o_status_name=?2,o_status_desc=?3 " +
+                    "where o_status_id=?1"
+    )
+    Integer edit(@NonNull Short id, @NonNull String name, @NonNull String description);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from order_status where o_status_id=?1"
+    )
+    void delete(@NonNull Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.orderStatus;
+
+import mk.ukim.finki.db.distributorapp.orderStatus.dto.OrderStatusDto;
+
+public interface OrderStatusService {
+
+    Integer create(OrderStatusDto orderStatusDto);
+
+    Integer edit(OrderStatusDto orderStatusDto);
+
+    void deleteById(Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/OrderStatusServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,33 @@
+package mk.ukim.finki.db.distributorapp.orderStatus;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.orderStatus.dto.OrderStatusDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class OrderStatusServiceImpl implements OrderStatusService {
+    private final OrderStatusRepository orderStatusRepository;
+
+    @Override
+    public Integer create(OrderStatusDto orderStatusDto) {
+        return this.orderStatusRepository.create(
+                orderStatusDto.getStatusName(),
+                orderStatusDto.getStatusDescription()
+        );
+    }
+
+    @Override
+    public Integer edit(OrderStatusDto orderStatusDto) {
+        return this.orderStatusRepository.edit(
+                orderStatusDto.getId(),
+                orderStatusDto.getStatusName(),
+                orderStatusDto.getStatusDescription()
+        );
+    }
+
+    @Override
+    public void deleteById(Short id) {
+        this.orderStatusRepository.deleteById(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/dto/OrderStatusDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/dto/OrderStatusDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/orderStatus/dto/OrderStatusDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.orderStatus.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class OrderStatusDto {
+    private Short id;
+    private String statusName;
+    private String statusDescription;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/price/Price.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/price/Price.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/price/Price.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,43 @@
+package mk.ukim.finki.db.distributorapp.price;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.article.Article;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
+import org.hibernate.annotations.ColumnDefault;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+@Entity
+@Data
+@Table(name = "price")
+public class Price {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "price_id")
+    private Integer priceId;
+
+    @NotNull
+    @Column(name = "price", nullable = false)
+    private BigDecimal price;
+
+    @NotNull
+    @ColumnDefault("CURRENT_TIMESTAMP")
+    @Column(name = "price_eff_date", nullable = false)
+    private LocalDateTime priceEffectiveDate;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "art_id", nullable = false)
+    private Article article;
+
+    @ManyToMany
+    @JoinTable(name = "unit_price",
+            joinColumns = @JoinColumn(name = "price_id"),
+            inverseJoinColumns = @JoinColumn(name = "unit_id"))
+    private Set<ArticleUnit> articleUnits = new LinkedHashSet<>();
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/price/PriceRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/price/PriceRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/price/PriceRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,46 @@
+package mk.ukim.finki.db.distributorapp.price;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+public interface PriceRepository extends JpaRepository<Price, Integer> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into price(price, price_eff_date, art_id) " +
+                    "values (?1,?2,?3)"
+    )
+    Integer create(
+            @NonNull BigDecimal price,
+            @NonNull LocalDateTime price_eff_date,
+            @NonNull Long art_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update price " +
+                    "set price=?2,price_eff_date=?3,art_id=?4 " +
+                    "where price_id=?1"
+    )
+    Integer edit(
+            @NonNull Integer id,
+            @NonNull BigDecimal price,
+            @NonNull LocalDateTime price_eff_date,
+            @NonNull Long art_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from price where price_id=?1"
+    )
+    void delete(@NonNull Integer id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/price/PriceService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/price/PriceService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/price/PriceService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+package mk.ukim.finki.db.distributorapp.price;
+
+import mk.ukim.finki.db.distributorapp.price.dto.PriceDto;
+
+public interface PriceService {
+
+    Integer create(PriceDto priceDto);
+
+    Integer edit(PriceDto priceDto);
+
+    void deleteById(Integer id);
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/price/PriceServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/price/PriceServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/price/PriceServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,35 @@
+package mk.ukim.finki.db.distributorapp.price;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.price.dto.PriceDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class PriceServiceImpl implements PriceService {
+    private final PriceRepository priceRepository;
+
+    @Override
+    public Integer create(PriceDto priceDto) {
+        return this.priceRepository.create(
+                priceDto.getPrice(),
+                priceDto.getDateEffective(),
+                priceDto.getArtId()
+        );
+    }
+
+    @Override
+    public Integer edit(PriceDto priceDto) {
+        return this.priceRepository.edit(
+                priceDto.getId(),
+                priceDto.getPrice(),
+                priceDto.getDateEffective(),
+                priceDto.getArtId()
+        );
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.priceRepository.delete(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/price/dto/PriceDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/price/dto/PriceDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/price/dto/PriceDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp.price.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+public class PriceDto {
+    private Integer id;
+    private BigDecimal price;
+    private LocalDateTime dateEffective;
+    private Long artId;
+    private String artName;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProForma.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProForma.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProForma.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,35 @@
+package mk.ukim.finki.db.distributorapp.proForma;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.proFormaStatus.ProFormaStatus;
+import mk.ukim.finki.db.distributorapp.order.Orders;
+
+import java.time.LocalDate;
+
+@Entity
+@Data
+@Table(name = "pro_forma")
+public class ProForma {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "pf_id")
+    private Long proFormaId;
+
+    @NotNull
+    @Column(name = "pf_deadline", nullable = false)
+    private LocalDate proFormaDeadline;
+
+    @NotNull
+    @Column(name = "pf_date_created", nullable = false)
+    private LocalDate proFormaDateCreated;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "pf_status_id", nullable = false)
+    private ProFormaStatus proFormaStatus;
+
+    @OneToOne(mappedBy = "proForma")
+    private Orders order;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,94 @@
+package mk.ukim.finki.db.distributorapp.proForma;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDate;
+import java.util.List;
+
+public interface ProFormaRepository extends JpaRepository<ProForma, Long> {
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select pf.pf_id as id,
+                           pf.pf_deadline as pfDeadline,
+                           pf.pf_date_created as pfDateCreated,
+                           pf.pf_status_id as statusId,
+                           pfs.pf_status_name as statusName,
+                           o.ord_id as ordId,
+                           o.cust_id as customerId,
+                           c.cust_company_name as customerName,
+                           u.user_email as customerEmail,
+                           u.user_mobile as customerPhone
+                    from pro_forma pf
+                    join pro_forma_status pfs on pf.pf_status_id = pfs.pf_status_id
+                    join orders o on pf.pf_id = o.pf_id
+                    join customer c on o.cust_id = c.user_id
+                    join users u on c.user_id = u.user_id
+                    """
+    )
+    List<ProFormaDto> listAll();
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into pro_forma(pf_deadline, pf_date_created, pf_status_id)
+                    values (?1,?2,?3)
+                    """
+    )
+    Integer create(
+            @NonNull LocalDate pf_deadline,
+            @NonNull LocalDate pf_create_date,
+            @NonNull Short pf_status_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update pro_forma " +
+                    "set pf_deadline=?2,pf_date_created=?3,pf_status_id=?4 " +
+                    "where pf_id=?1"
+    )
+    Integer edit(
+            @NonNull Long pf_id,
+            @NonNull LocalDate pf_deadline,
+            @NonNull LocalDate pf_create_date,
+            @NonNull Short pf_status_id);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from pro_forma where pf_id=?1"
+    )
+    void delete(@NonNull Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select pf.pf_id as id,
+                           pf_deadline as pfDeadline,
+                           pf_date_created as pfDateCreated,
+                           pfs.pf_status_id as statusId,
+                           pfs.pf_status_name as statusName,
+                           o.ord_id as ordId,
+                           c.user_id as customerId,
+                           c.cust_company_name as customerName,
+                           u.user_email as customerEmail,
+                           u.user_mobile as customerPhone
+                    from pro_forma pf
+                    join pro_forma_status pfs on pf.pf_status_id=pfs.pf_status_id
+                    join orders o on pf.pf_id = o.pf_id
+                    join customer c on o.cust_id = c.user_id
+                    join users u on c.user_id = u.user_id
+                    where c.user_id = ?1
+                    """
+    )
+    List<ProFormaDto> getCurrentProFormasByCustomer(Long customerId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.proForma;
+
+import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface ProFormaService {
+    @Transactional
+    List<ProFormaDto> getAllProForma();
+
+    Integer create(ProFormaDto proFormaDto);
+
+    Integer edit(ProFormaDto proFormaDto);
+
+    void deleteById(Long id);
+
+    List<ProFormaDto> getCurentProFormasByCustomer(Long customerId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proForma/ProFormaServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,49 @@
+package mk.ukim.finki.db.distributorapp.proForma;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.proForma.dto.ProFormaDto;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class ProFormaServiceImpl implements ProFormaService {
+    private final ProFormaRepository proFormaRepository;
+
+    @Override
+    @Transactional
+    public List<ProFormaDto> getAllProForma() {
+        return this.proFormaRepository.listAll();
+    }
+
+    @Override
+    public Integer create(ProFormaDto proFormaDto) {
+        return this.proFormaRepository.create(
+                proFormaDto.getPfDeadline(),
+                proFormaDto.getPfDateCreated(),
+                proFormaDto.getStatusId()
+        );
+    }
+
+    @Override
+    public Integer edit(ProFormaDto proFormaDto) {
+        return this.proFormaRepository.edit(
+                proFormaDto.getId(),
+                proFormaDto.getPfDeadline(),
+                proFormaDto.getPfDateCreated(),
+                proFormaDto.getStatusId()
+        );
+    }
+
+    @Override
+    public void deleteById(Long id) {
+        this.proFormaRepository.deleteById(id);
+    }
+
+    @Override
+    public List<ProFormaDto> getCurentProFormasByCustomer(Long customerId) {
+        return this.proFormaRepository.getCurrentProFormasByCustomer(customerId);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proForma/dto/ProFormaDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proForma/dto/ProFormaDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proForma/dto/ProFormaDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp.proForma.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProFormaDto {
+    private Long id;
+    private LocalDate pfDeadline;
+    private LocalDate pfDateCreated;
+    private Short statusId;
+    private String statusName;
+    private Long ordId;
+    private Long customerId;
+    private String customerName;
+    private String customerEmail;
+    private String customerPhone;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatus.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatus.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatus.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,31 @@
+package mk.ukim.finki.db.distributorapp.proFormaStatus;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.proForma.ProForma;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "pro_forma_status", schema = "IND0_185022")
+public class ProFormaStatus {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "pf_status_id")
+    private Short proFormaStatusId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "pf_status_name", nullable = false)
+    private String proFormaStatusName;
+
+    @NotNull
+    @Column(name = "pf_status_desc", nullable = false)
+    private String proFormaStatusDescription;
+
+    @OneToMany(mappedBy = "proFormaStatus")
+    private List<ProForma> pro_formas;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,36 @@
+package mk.ukim.finki.db.distributorapp.proFormaStatus;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface ProFormaStatusRepository extends JpaRepository<ProFormaStatus, Short> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into pro_forma_status(pf_status_name, pf_status_desc) " +
+                    "values (?1,?2)"
+    )
+    Integer create(@NonNull String name, @NonNull String description);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update pro_forma_status " +
+                    "set pf_status_name=?2,pf_status_desc=?3 " +
+                    "where pf_status_id=?1"
+    )
+    Integer edit(@NonNull Short id, @NonNull String name, @NonNull String description);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from pro_forma_status where pf_status_id=?1"
+    )
+    void delete(@NonNull Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.proFormaStatus;
+
+import mk.ukim.finki.db.distributorapp.proFormaStatus.dto.ProFormaStatusDto;
+
+public interface ProFormaStatusService {
+
+    Integer create(ProFormaStatusDto proFormaStatusDto);
+
+    Integer edit(ProFormaStatusDto proFormaStatusDto);
+
+    void deleteById(Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/ProFormaStatusServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,33 @@
+package mk.ukim.finki.db.distributorapp.proFormaStatus;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.proFormaStatus.dto.ProFormaStatusDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class ProFormaStatusServiceImpl implements ProFormaStatusService {
+    private final ProFormaStatusRepository proFormaStatusRepository;
+
+    @Override
+    public Integer create(ProFormaStatusDto proFormaStatusDto) {
+        return this.proFormaStatusRepository.create(
+                proFormaStatusDto.getStatusName(),
+                proFormaStatusDto.getStatusDescription()
+        );
+    }
+
+    @Override
+    public Integer edit(ProFormaStatusDto proFormaStatusDto) {
+        return this.proFormaStatusRepository.edit(
+                proFormaStatusDto.getId(),
+                proFormaStatusDto.getStatusName(),
+                proFormaStatusDto.getStatusDescription()
+        );
+    }
+
+    @Override
+    public void deleteById(Short id) {
+        this.proFormaStatusRepository.deleteById(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/dto/ProFormaStatusDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/dto/ProFormaStatusDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/proFormaStatus/dto/ProFormaStatusDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.proFormaStatus.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class ProFormaStatusDto {
+    private Short id;
+    private String statusName;
+    private String statusDescription;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/region/Region.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/region/Region.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/region/Region.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,28 @@
+package mk.ukim.finki.db.distributorapp.region;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.city.City;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "region")
+public class Region {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "region_id", nullable = false)
+    private Integer regionId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "region_name", nullable = false)
+    private String regionName;
+
+    @OneToMany(mappedBy = "region")
+    private List<City> cities;
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/region/RegionRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/region/RegionRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/region/RegionRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,54 @@
+package mk.ukim.finki.db.distributorapp.region;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.region.dto.RegionDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface RegionRepository extends JpaRepository<Region, Integer> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into region(region_name) " +
+                    "values (?1)"
+    )
+    Integer create(
+            @NonNull String name);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update region " +
+                    "set region_name=?2 " +
+                    "where region_id=?1"
+    )
+    Integer edit(
+            @NonNull Integer id,
+            @NonNull String name);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from region " +
+                    "where region_id=?1"
+    )
+    void deleteById(@NonNull Integer id);
+
+//    -------------------------------------------------------------------------
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select r.region_id as id, r.region_name as name
+                    from region r join city c on r.region_id = c.region_id
+                    where c.city_id = :city
+                    """
+    )
+    RegionDto getRegionByCityId(@NonNull @Param("city") Integer cityId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/region/RegionService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/region/RegionService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/region/RegionService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.region;
+
+import mk.ukim.finki.db.distributorapp.region.dto.RegionDto;
+
+public interface RegionService {
+
+    Integer create(RegionDto regionDto);
+
+    Integer edit(RegionDto regionDto);
+
+    void deleteById(Integer id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/region/RegionServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/region/RegionServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/region/RegionServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,31 @@
+package mk.ukim.finki.db.distributorapp.region;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.region.dto.RegionDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class RegionServiceImpl implements RegionService {
+    private final RegionRepository regionRepository;
+
+    @Override
+    public Integer create(RegionDto regionDto) {
+        return this.regionRepository.create(
+                regionDto.getName()
+        );
+    }
+
+    @Override
+    public Integer edit(RegionDto regionDto) {
+        return this.regionRepository.edit(
+                regionDto.getId(),
+                regionDto.getName()
+        );
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.regionRepository.deleteById(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/region/dto/RegionDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/region/dto/RegionDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/region/dto/RegionDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.db.distributorapp.region.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class RegionDto {
+    public Integer id;
+    public String name;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/token/Token.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,42 @@
+package mk.ukim.finki.db.distributorapp.token;
+
+
+import jakarta.persistence.*;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.User;
+
+import java.time.LocalDateTime;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Entity
+@Table(name = "token_")
+public class Token {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "t_id")
+    private Long tokenId;
+
+    @Column(name = "t_value", unique = true, nullable = false)
+    private String tokenValue;
+
+    @Column(name = "t_date")
+    private LocalDateTime createdDate;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "t_type")
+    private TokenType tokenType;
+
+    @Column(name = "t_expiry")
+    private LocalDateTime tokenExpiryDate;
+
+    @Column(name = "t_validated_at")
+    private LocalDateTime tokenValidatedAt;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "t_user", referencedColumnName = "user_id", nullable = false, unique = true)
+    private User user;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/token/TokenRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/token/TokenRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/token/TokenRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,58 @@
+package mk.ukim.finki.db.distributorapp.token;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.token.dto.TokenDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+
+public interface TokenRepository extends JpaRepository<Token, Long> {
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select
+                    from token
+                    where t_value = ?1
+                    """
+    )
+    TokenDto findTokenByValue(@NonNull String token);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into token(t_value, t_type, t_expiry, t_user)
+                    values (:value, :type, :expiry, :user)
+                    """
+    )
+    Integer create(
+            @NonNull @Param("value") String t_value,
+            @NonNull @Param("expiry") LocalDateTime t_expiry,
+            @NonNull @Param("user") Long user_id,
+            @NonNull @Param("type") String t_type
+    );
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    update token
+                    set t_expiry = :expiry, t_user = :user, t_value = :value, t_type = :type, t_validated_at = :validated_at
+                    where t_id = :id
+                    """
+    )
+    Integer edit(
+            @NonNull @Param("id") Long t_id,
+            @NonNull @Param("value") String t_value,
+            @NonNull @Param("expiry") LocalDateTime t_expiry,
+            @NonNull @Param("user") Long user_id,
+            @NonNull @Param("validated_at") LocalDateTime validated_at,
+            @NonNull @Param("type") String t_type
+    );
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/token/TokenType.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/token/TokenType.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/token/TokenType.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,5 @@
+package mk.ukim.finki.db.distributorapp.token;
+
+public enum TokenType {
+    TOKEN_VERIFICATION, TOKEN_RESET
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/token/dto/TokenDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/token/dto/TokenDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/token/dto/TokenDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.db.distributorapp.token.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TokenDto {
+    Long t_id;
+    String t_value;
+    LocalDateTime t_date;
+    String t_type;
+    LocalDateTime t_expiry;
+    LocalDateTime t_validated_at;
+    Long user_id;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPrice.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPrice.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPrice.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,25 @@
+package mk.ukim.finki.db.distributorapp.unitPrice;
+
+import jakarta.persistence.*;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
+import mk.ukim.finki.db.distributorapp.price.Price;
+
+@Data
+@Entity
+@Table(name = "unit_price", schema = "IND0_185022")
+public class UnitPrice {
+    @EmbeddedId
+    private UnitPriceId id;
+
+    @MapsId("unitId")
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "unit_id", nullable = false)
+    private ArticleUnit unit;
+
+    @MapsId("priceId")
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "price_id", nullable = false)
+    private Price price;
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceId.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceId.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceId.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp.unitPrice;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Embeddable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Embeddable
+@NoArgsConstructor
+@AllArgsConstructor
+@EqualsAndHashCode
+public class UnitPriceId implements Serializable {
+    @Column(name = "unit_id", nullable = false)
+    private Long unitId;
+    @Column(name = "price_id", nullable = false)
+    private Long priceId;
+
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/UnitPriceRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,24 @@
+package mk.ukim.finki.db.distributorapp.unitPrice;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface UnitPriceRepository extends JpaRepository<UnitPrice, UnitPriceId> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = """
+                    insert into unit_price(unit_id, price_id)
+                    values (:unitId, :priceId)
+                    """
+    )
+    Integer create(
+            @Param("unitId") @NonNull Long unitId,
+            @Param("priceId") @NonNull Long priceId
+    );
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/dto/UnitPriceDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/dto/UnitPriceDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/unitPrice/dto/UnitPriceDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.db.distributorapp.unitPrice.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class UnitPriceDto {
+    private Long unitId;
+    private Long priceId;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/Role.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/Role.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/Role.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import org.springframework.security.core.GrantedAuthority;
+
+public enum Role implements GrantedAuthority {
+    ROLE_CUSTOMER, ROLE_MANAGER, ROLE_DRIVER, ROLE_ADMIN;
+
+    @Override
+    public String getAuthority() {
+        return "";
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/User.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/User.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/User.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,140 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import mk.ukim.finki.db.distributorapp.city.City;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import mk.ukim.finki.db.distributorapp.token.Token;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Entity
+@AllArgsConstructor
+@NoArgsConstructor
+@Inheritance(strategy = InheritanceType.JOINED)
+@DiscriminatorColumn(
+        name = "clazz_",
+        discriminatorType = DiscriminatorType.STRING
+)
+@Data
+@Table(name = "users")
+public class User implements UserDetails {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "user_id")
+    private Long userId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_name", nullable = false)
+    private String userName;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_surname", nullable = false)
+    private String userSurname;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_pass", nullable = false)
+    private String userPassword;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_email", nullable = false)
+    private String userEmail;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_mobile", nullable = false)
+    private String userMobile;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "user_salt", nullable = false)
+    private String userSalt;
+
+    @NotNull
+    @Column(name = "user_active", nullable = false)
+    private Boolean userActive;
+
+    @Size(max = 255)
+    @Column(name = "user_image")
+    private String userImage;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "user_role")
+    private Role userRole;
+
+    @Column(name = "clazz_", insertable = false, updatable = false)
+    private String clazz_;
+
+    @OneToMany(mappedBy = "user")
+    private List<Token> tokens;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "city_id", nullable = false)
+    private City city;
+
+    public User(UsersLoadingDto dto) {
+        this.userRole = Role.valueOf(dto.getUserRole());
+        this.userId = dto.getUserId();
+        this.userName = dto.getUserName();
+        this.userSurname = dto.getUserSurname();
+        this.userPassword = dto.getUserPassword();
+        this.userEmail = dto.getUserEmail();
+        this.userMobile = dto.getUserMobile();
+        this.userSalt = dto.getUserSalt();
+        this.userActive = dto.getUserActive();
+        this.userImage = dto.getUserImage();
+        this.tokens = null;
+        this.city = null;
+    }
+
+    @Override
+    public String getUsername() {
+        return userEmail;
+    }
+
+    @Override
+    public String getPassword() {
+        return userPassword;
+    }
+
+    @Override
+    public Collection<? extends GrantedAuthority> getAuthorities() {
+        List<GrantedAuthority> authorities = new ArrayList<>();
+        authorities.add(new SimpleGrantedAuthority(this.getUserRole().name()));
+        return authorities;
+    }
+
+    @Override
+    public boolean isAccountNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isAccountNonLocked() {
+        return true;
+    }
+
+    @Override
+    public boolean isCredentialsNonExpired() {
+        return true;
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return userActive;
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/UserRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,126 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface UserRepository extends JpaRepository<User, Long> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into users(user_name,user_surname,user_pass,user_salt,user_email,user_mobile,user_active,user_image,city_id,user_role,clazz_) " +
+                    "values (:name,:sur,:pass,:salt,:email,:mob,:active,:img,:cty,:role,:clazz_)"
+    )
+    Integer create(
+            @NonNull @Param("name") String name,
+            @NonNull @Param("sur") String surname,
+            @NonNull @Param("pass") String password,
+            @NonNull @Param("email") String email,
+            @NonNull @Param("mob") String mobile,
+            @NonNull @Param("salt") String salt,
+            @NonNull @Param("active") Boolean active,
+            @Param("img") String image,
+            @NonNull @Param("cty") Integer city_id,
+            @NonNull @Param("role") String role,
+            @NonNull @Param("clazz_") String clazz_);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update users " +
+                    "set user_name=:name,user_surname=:sur,user_pass=:pass,user_email=:email,user_mobile=:mob,user_salt=:salt,user_active=:active,user_image=:img,city_id=:cty,user_role=:role,clazz_=:clazz_ " +
+                    "where user_id=:id"
+    )
+    Integer edit(
+            @NonNull @Param("id") Long id,
+            @NonNull @Param("name") String name,
+            @NonNull @Param("sur") String surname,
+            @NonNull @Param("pass") String password,
+            @NonNull @Param("email") String email,
+            @NonNull @Param("mob") String mobile,
+            @NonNull @Param("salt") String salt,
+            @NonNull @Param("active") Boolean active,
+            @NonNull @Param("img") String image,
+            @NonNull @Param("cty") Integer city_id,
+            @NonNull @Param("role") String role,
+            @NonNull @Param("clazz_") String clazz_);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from users where user_id=:id"
+    )
+    void delete(@NonNull @Param("id") Long id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select user_id as userId,
+                           user_name as userName,
+                           user_surname as userSurname,
+                           user_pass as userPassword,
+                           user_email as userEmail,
+                           user_mobile as userMobile,
+                           user_salt as userSalt,
+                           user_active as userActive,
+                           user_image as userImage,
+                           user_role as userRole,
+                           clazz_
+                    from users
+                    where user_email = ?1
+                    """
+    )
+    UsersLoadingDto findUsersByUserEmailIgnoreCaseDto(String email);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select u.user_id as id,
+                           u.user_name as firstName,
+                           u.user_surname as lastName,
+                           u.user_email as email,
+                           u.user_mobile as phone,
+                           u.user_image as image,
+                           u.city_id as cityId,
+                           c.city_name as cityName,
+                           r.region_name as regionName,
+                           u.user_role as role,
+                           clazz_ as clazz_,
+                           u.user_active as userActive
+                    from users u
+                    join city c on u.city_id = c.city_id
+                    join region r on c.region_id = r.region_id
+                    where user_email = ?1
+                    """
+    )
+    UserDto findUserDtoByEmail(String userEmail);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select u.user_id as userId,
+                           u.user_name as userName,
+                           u.user_surname as userSurname,
+                           u.user_pass as userPassword,
+                           u.user_email as userEmail,
+                           u.user_mobile as userMobile,
+                           u.user_salt as userSalt,
+                           u.user_active as userActive,
+                           u.user_image as userImage,
+                           u.user_role as userRole,
+                           u.clazz_ as clazz_
+                    from users u
+                    join token t on u.user_id=t.t_user
+                    where t.t_value = :token
+                    """
+    )
+    UsersLoadingDto findUserByResetToken(@NonNull @Param("token") String token);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/UserService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,16 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+
+public interface UserService {
+    Integer edit(UserDto userDto);
+
+    void deleteUserById(Long id);
+
+    UsersLoadingDto findUserByResetToken(String token);
+
+    UserDto findUserDtoByEmail(String userEmail);
+
+    UsersLoadingDto findFullUserDtoByEmail(String userEmail);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/UserServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,52 @@
+package mk.ukim.finki.db.distributorapp.users;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.users.dto.UserDto;
+import mk.ukim.finki.db.distributorapp.users.dto.UsersLoadingDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class UserServiceImpl implements UserService {
+
+    private final UserRepository userRepository;
+
+    @Override
+    public Integer edit(UserDto userDto) {
+        UsersLoadingDto user = this.userRepository.findUsersByUserEmailIgnoreCaseDto(userDto.getEmail());
+        return this.userRepository.edit(
+                userDto.getId(),
+                userDto.getFirstName(),
+                userDto.getLastName(),
+                user.getUserPassword(),
+                userDto.getEmail(),
+                userDto.getPhone(),
+                user.getUserSalt(),
+                userDto.getUserActive(),
+                userDto.getImage(),
+                userDto.getCityId(),
+                userDto.getRole(),
+                userDto.getClazz_()
+        );
+    }
+
+    @Override
+    public UsersLoadingDto findUserByResetToken(String token) {
+        return this.userRepository.findUserByResetToken(token);
+    }
+
+    @Override
+    public UserDto findUserDtoByEmail(String userEmail) {
+        return this.userRepository.findUserDtoByEmail(userEmail);
+    }
+
+    @Override
+    public UsersLoadingDto findFullUserDtoByEmail(String userEmail) {
+        return this.userRepository.findUsersByUserEmailIgnoreCaseDto(userEmail);
+    }
+
+    @Override
+    public void deleteUserById(Long id) {
+        this.userRepository.delete(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UserDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UserDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UserDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,23 @@
+package mk.ukim.finki.db.distributorapp.users.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UserDto {
+    private Long id;
+    private String firstName;
+    private String lastName;
+    private String email;
+    private String phone;
+    private String image;
+    private Integer cityId;
+    private String cityName;
+    private String regionName;
+    private String role;
+    private String clazz_;
+    Boolean userActive;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UsersLoadingDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UsersLoadingDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/users/dto/UsersLoadingDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,20 @@
+package mk.ukim.finki.db.distributorapp.users.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class UsersLoadingDto {
+    Long userId;
+    String userName;
+    String userSurname;
+    String userPassword;
+    String userEmail;
+    String userMobile;
+    String userSalt;
+    Boolean userActive;
+    String userImage;
+    String userRole;
+    String clazz_;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/vehicle/Vehicle.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,65 @@
+package mk.ukim.finki.db.distributorapp.vehicle;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.delivery.Delivery;
+import mk.ukim.finki.db.distributorapp.driver.Driver;
+import mk.ukim.finki.db.distributorapp.warehouse.Warehouse;
+
+import java.util.Date;
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "vehicle")
+public class Vehicle {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "veh_id")
+    private Integer vehicleId;
+
+    @NotNull
+    @Column(name = "veh_carry_weight", nullable = false)
+    private Integer vehicleCarryWeight;
+
+    @NotNull
+    @Column(name = "veh_service_interval", nullable = false)
+    private Short vehicleServiceInterval;
+
+    @NotNull
+    @Column(name = "veh_kilometers", nullable = false)
+    private Integer vehicleKilometers;
+
+    @Column(name = "veh_last_service")
+    private Date vehicleLastService;
+
+    @Column(name = "veh_last_service_km")
+    private Integer vehicleLastServiceKm;
+
+    @Size(max = 8)
+    @NotNull
+    @Column(name = "veh_plate", nullable = false, length = 8)
+    private String vehiclePlate;
+
+    @Size(max = 17)
+    @NotNull
+    @Column(name = "veh_vin", nullable = false, length = 17)
+    private String vehicleVin;
+
+    @NotNull
+    @Column(name = "veh_reg_date", nullable = false)
+    private Date vehicleRegDate;
+
+    @NotNull
+    @ManyToOne(fetch = FetchType.LAZY, optional = false)
+    @JoinColumn(name = "wh_id", nullable = false)
+    private Warehouse warehouse;
+
+    @OneToOne(mappedBy = "vehicle")
+    private Driver driver;
+
+    @OneToMany(mappedBy = "vehicle")
+    private List<Delivery> deliveries;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,110 @@
+package mk.ukim.finki.db.distributorapp.vehicle;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+public interface VehicleRepository extends JpaRepository<Vehicle, Integer> {
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select veh_id as id,
+                           wh_id as warehouseId,
+                           veh_plate as plateNumber
+                    from vehicle
+                    where wh_id = ?1
+                    """
+    )
+    List<VehicleBasicDto> findAllByWarehouseDto(@NonNull Integer warehouseId);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into vehicle(veh_carry_weight, veh_service_interval, veh_kilometers, veh_last_service, veh_last_service_km, veh_plate, veh_vin, veh_reg_date, wh_id) " +
+                    "values (?1,?2,?3,?4,?5,?6,?7,?8,?9)"
+    )
+    Integer create(
+            @NonNull Integer vehicleCarryWeight,
+            @NonNull Short vehicleServiceInterval,
+            @NonNull Integer vehicleKilometers,
+            @NonNull Date vehicleLastService,
+            @NonNull Integer vehicleLastServiceKm,
+            @NonNull String vehiclePlate,
+            @NonNull String vehicleVIN,
+            @NonNull Date vehicleRegDate,
+            @NonNull Integer whId);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update vehicle " +
+                    "set veh_carry_weight=?2,veh_service_interval=?3,veh_kilometers=?4," +
+                    "veh_last_service=?5,veh_last_service_km=?6,veh_plate=?7,veh_vin=?8,veh_reg_date=?9,wh_id=?10 " +
+                    "where veh_id=?1"
+    )
+    Integer edit(
+            @NonNull Integer id,
+            @NonNull Integer vehicleCarryWeight,
+            @NonNull Short vehicleServiceInterval,
+            @NonNull Integer vehicleKilometers,
+            @NonNull Date vehicleLastService,
+            @NonNull Integer vehicleLastServiceKm,
+            @NonNull String vehiclePlate,
+            @NonNull String vehicleVIN,
+            @NonNull Date vehicleRegDate,
+            @NonNull Integer whId);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from vehicle where veh_id=?1"
+    )
+    void delete(@NonNull Integer id);
+
+    //----------------------------------------------------------------------------------------------------------------------
+    @Query(
+            nativeQuery = true,
+            value = """
+                     select v.veh_id as id,
+                            v.veh_carry_weight as carryWeight,
+                            v.veh_service_interval as serviceInterval,
+                            v.veh_kilometers as kilometers,
+                            v.veh_last_service as lastServiceDate,
+                            v.veh_last_service_km as lastServiceKm,
+                            v.veh_plate as plate,
+                            v.veh_vin as vin,
+                            v.veh_reg_date as registrationDate,
+                            w.wh_id as whId,
+                            c.city_name as city,
+                            r.region_name as region,
+                            d.user_id as driverId,
+                            u1.user_name as driverName,
+                            u1.user_email as driverEmail,
+                            u1.user_mobile as driverPhone,
+                            u1.user_image as driverImg
+                     from warehouse w
+                     join city c on w.city_id = c.city_id
+                     join region r on c.region_id = r.region_id
+                     join manager m on w.wh_id = m.wh_id
+                     join users u on m.user_id = u.user_id
+                     join vehicle v on w.wh_id=v.wh_id
+                     join driver d on d.veh_id=v.veh_id
+                     join users u1 on d.user_id=u1.user_id
+                     where m.user_id = :manager
+                     group by v.veh_id, v.veh_carry_weight, v.veh_service_interval, v.veh_kilometers, v.veh_last_service, v.veh_last_service_km, v.veh_plate, v.veh_vin, v.veh_reg_date, w.wh_id, c.city_name, r.region_name, d.user_id, u1.user_name, u1.user_email, u1.user_mobile, u1.user_image
+                     order by v.veh_reg_date
+                    """
+    )
+    List<VehicleDto> getVehiclesByManager(@NonNull @Param("manager") Long managerId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,19 @@
+package mk.ukim.finki.db.distributorapp.vehicle;
+
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
+
+import java.util.List;
+
+public interface VehicleService {
+
+    List<VehicleBasicDto> getVehiclesByWarehouse(Integer warehouseId);
+
+    Integer create(VehicleDto vehicleDto);
+
+    Integer edit(VehicleDto vehicleDto);
+
+    void deleteById(Integer id);
+
+    List<VehicleDto> getVehiclesByManager(Long managerId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/vehicle/VehicleServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,62 @@
+package mk.ukim.finki.db.distributorapp.vehicle;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleBasicDto;
+import mk.ukim.finki.db.distributorapp.vehicle.dto.VehicleDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class VehicleServiceImpl implements VehicleService {
+
+    private final VehicleRepository vehicleRepository;
+
+    @Override
+    public List<VehicleBasicDto> getVehiclesByWarehouse(Integer warehouseId) {
+        return this.vehicleRepository.findAllByWarehouseDto(warehouseId);
+    }
+
+    @Override
+    public Integer create(VehicleDto vehicleDto) {
+        return this.vehicleRepository.create(
+                vehicleDto.getCarryWeight(),
+                vehicleDto.getServiceInterval(),
+                vehicleDto.getKilometers(),
+                vehicleDto.getLastServiceDate(),
+                vehicleDto.getLastServiceKm(),
+                vehicleDto.getPlate(),
+                vehicleDto.getVin(),
+                vehicleDto.getRegistrationDate(),
+                vehicleDto.getWhId());
+    }
+
+    @Override
+    public Integer edit(VehicleDto vehicleDto) {
+
+        return this.vehicleRepository.edit(
+                vehicleDto.getId(),
+                vehicleDto.getCarryWeight(),
+                vehicleDto.getServiceInterval(),
+                vehicleDto.getKilometers(),
+                vehicleDto.getLastServiceDate(),
+                vehicleDto.getLastServiceKm(),
+                vehicleDto.getPlate(),
+                vehicleDto.getVin(),
+                vehicleDto.getRegistrationDate(),
+                vehicleDto.getWhId()
+        );
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.vehicleRepository.delete(id);
+    }
+    //------------------------------------------------------------------------------------------------------------------
+
+    @Override
+    public List<VehicleDto> getVehiclesByManager(Long managerId) {
+        return this.vehicleRepository.getVehiclesByManager(managerId);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleBasicDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleBasicDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleBasicDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.vehicle.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class VehicleBasicDto {
+    private Integer id;
+    private Integer warehouseId;
+    private String plateNumber;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/vehicle/dto/VehicleDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,28 @@
+package mk.ukim.finki.db.distributorapp.vehicle.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@AllArgsConstructor
+public class VehicleDto {
+    private Integer id;
+    private Integer carryWeight;
+    private Short serviceInterval;
+    private Integer kilometers;
+    private Date lastServiceDate;
+    private Integer lastServiceKm;
+    private String plate;
+    private String vin;
+    private Date registrationDate;
+    private Integer whId;
+    private String city;
+    private String region;
+    private Long driverId;
+    private String driverName;
+    private String driverEmail;
+    private String driverPhone;
+    private String driverImg;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/warehouse/Warehouse.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/warehouse/Warehouse.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/warehouse/Warehouse.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,40 @@
+package mk.ukim.finki.db.distributorapp.warehouse;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.articleUnit.ArticleUnit;
+import mk.ukim.finki.db.distributorapp.city.City;
+import mk.ukim.finki.db.distributorapp.manager.Manager;
+import mk.ukim.finki.db.distributorapp.vehicle.Vehicle;
+
+import java.util.List;
+
+@Entity
+@Data
+@Table(name = "warehouse")
+public class Warehouse {
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "wh_id")
+    private Integer warehouseId;
+
+    @Size(max = 255)
+    @NotNull
+    @Column(name = "wh_adr", nullable = false)
+    private String warehouseAddress;
+
+    @OneToOne
+    @JoinColumn(name = "city_id", unique = true, nullable = false)
+    private City city;
+
+    @OneToOne(mappedBy = "warehouse")
+    private Manager manager;
+
+    @OneToMany(mappedBy = "warehouse")
+    private List<Vehicle> vehicles;
+
+    @OneToMany(mappedBy = "warehouse")
+    private List<ArticleUnit> articleUnits;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,89 @@
+package mk.ukim.finki.db.distributorapp.warehouse;
+
+import lombok.NonNull;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseInventoryDto;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface WarehouseRepository extends JpaRepository<Warehouse, Integer> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into warehouse(wh_adr, city_id) " +
+                    "values (?1,?2)"
+    )
+    Integer create(
+            @NonNull String whAddress,
+            @NonNull Integer city);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update warehouse " +
+                    "set wh_adr = ?2,city_id = ?3 " +
+                    "where wh_id = ?1"
+    )
+    Integer edit(
+            @NonNull Integer id,
+            @NonNull String whAddress,
+            @NonNull Integer city);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from warehouse where wh_id = ?1"
+    )
+    void delete(@NonNull Integer id);
+    //-------------------------------------------------------------------------------------------------------------------
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                    select a.art_name as articleName,
+                           man.man_name as manufacturerName,
+                           count(au.unit_id) as totalUnits
+                    from warehouse w
+                        join manager m on m.wh_id = w.wh_id
+                        join article_unit au on au.wh_id = w.wh_id
+                        join unit_price up on au.unit_id = up.unit_id
+                        join price p on p.price_id=up.price_id
+                        join article a on p.art_id=a.art_id
+                        join manufacturer man on a.man_id = man.man_id
+                    where m.user_id = :manager
+                    group by a.art_name, man.man_name
+                    order by totalUnits
+                    """
+    )
+    List<WarehouseInventoryDto> getInventoryByManager(@NonNull @Param("manager") Long manager_id);
+
+    @Query(
+            nativeQuery = true,
+            value = """
+                     with reg as (
+                         select r.*
+                         from city c1 join region r on c1.region_id = r.region_id
+                         where c1.city_id = :city
+                     )
+                     select w.wh_id as id,
+                            w.wh_adr as address,
+                            c.city_id as cityId,
+                            c.city_name as cityName,
+                            r1.region_id as regionId,
+                            r1.region_name as regionName
+                     from warehouse w
+                     join city c on c.city_id = w.city_id
+                     join reg r1 on r1.region_id = c.region_id
+                     where c.region_id = r1.region_id
+                    """
+    )
+    WarehouseDto findWarehouseDtoByCityId(@NonNull @Param("city") Integer cityId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,24 @@
+package mk.ukim.finki.db.distributorapp.warehouse;
+
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseInventoryDto;
+
+import java.util.List;
+
+public interface WarehouseService {
+
+    WarehouseDto findById(Integer id);
+
+    WarehouseDto findByCityId(Integer id);
+
+    Integer create(WarehouseDto warehouseDto);
+
+    Integer edit(WarehouseDto warehouseDto);
+
+    void deleteById(Integer id);
+
+    List<WarehouseInventoryDto> getInventoryByManager(Long managerId);
+
+
+    WarehouseDto findByUserId(Integer cityId);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/warehouse/WarehouseServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,64 @@
+package mk.ukim.finki.db.distributorapp.warehouse;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseDto;
+import mk.ukim.finki.db.distributorapp.warehouse.dto.WarehouseInventoryDto;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class WarehouseServiceImpl implements WarehouseService {
+    private final WarehouseRepository warehouseRepository;
+
+    @Override
+    public WarehouseDto findById(Integer id) {
+        Warehouse wh = this.warehouseRepository.findById(id).get();
+        return new WarehouseDto(
+                wh.getWarehouseId(),
+                wh.getWarehouseAddress(),
+                wh.getCity().getCityId(),
+                wh.getCity().getCityName(),
+                wh.getCity().getRegion().getRegionId(),
+                wh.getCity().getRegion().getRegionName()
+        );
+    }
+
+    @Override
+    public WarehouseDto findByCityId(Integer id) {
+        return this.warehouseRepository.findWarehouseDtoByCityId(id);
+    }
+
+    @Override
+    public Integer create(WarehouseDto warehouseDto) {
+        return this.warehouseRepository.create(
+                warehouseDto.getAddress(),
+                warehouseDto.getCityId()
+        );
+    }
+
+    @Override
+    public Integer edit(WarehouseDto warehouseDto) {
+        return this.warehouseRepository.edit(
+                warehouseDto.getId(),
+                warehouseDto.getAddress(),
+                warehouseDto.getCityId()
+        );
+    }
+
+    @Override
+    public void deleteById(Integer id) {
+        this.warehouseRepository.findById(id);
+    }
+
+    @Override
+    public List<WarehouseInventoryDto> getInventoryByManager(Long managerId) {
+        return this.warehouseRepository.getInventoryByManager(managerId);
+    }
+
+    @Override
+    public WarehouseDto findByUserId(Integer cityId) {
+        return this.warehouseRepository.findWarehouseDtoByCityId(cityId);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,17 @@
+package mk.ukim.finki.db.distributorapp.warehouse.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class WarehouseDto {
+    private Integer id;
+    private String address;
+    private Integer cityId;
+    private String cityName;
+    private Integer regionId;
+    private String regionName;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseInventoryDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseInventoryDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/warehouse/dto/WarehouseInventoryDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.warehouse.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class WarehouseInventoryDto {
+    String articleName;
+    String manufacturerName;
+    Long totalUnits;
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/weekday/Weekday.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,28 @@
+package mk.ukim.finki.db.distributorapp.weekday;
+
+import jakarta.persistence.*;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import mk.ukim.finki.db.distributorapp.customerWeekday.CustomerWeekday;
+
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+@Data
+@Entity
+@Table(name = "weekday")
+public class Weekday {
+    @Id
+    @Column(name = "day_id", nullable = false)
+    private Short weekdayId;
+
+    @Size(max = 20)
+    @NotNull
+    @Column(name = "day_name", nullable = false, length = 20)
+    private String dayName;
+
+    @OneToMany(mappedBy = "day")
+    private Set<CustomerWeekday> customerWeekdays = new LinkedHashSet<>();
+    // ? Set<CustomerWeekday> or List<CustomerWeekday>
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayRepository.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayRepository.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,37 @@
+package mk.ukim.finki.db.distributorapp.weekday;
+
+import lombok.NonNull;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface WeekdayRepository extends JpaRepository<Weekday, Short> {
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "insert into weekday(day_id,day_name) " +
+                    "values (?1,?2)"
+    )
+    Integer create(@NonNull String dayName);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "update weekday " +
+                    "set day_name=?2 " +
+                    "where day_id=?1"
+    )
+    Integer edit(@NonNull Short id, @NonNull String dayName);
+
+    @Modifying
+    @Transactional
+    @Query(
+            nativeQuery = true,
+            value = "delete from weekday " +
+                    "where day_id=?1"
+    )
+    void deleteById(@NonNull Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayService.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayService.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,12 @@
+package mk.ukim.finki.db.distributorapp.weekday;
+
+import mk.ukim.finki.db.distributorapp.weekday.dto.WeekdayDto;
+
+public interface WeekdayService {
+
+    Integer create(WeekdayDto weekdayDto);
+
+    Integer edit(WeekdayDto weekdayDto);
+
+    void deleteById(Short id);
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayServiceImpl.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/weekday/WeekdayServiceImpl.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,31 @@
+package mk.ukim.finki.db.distributorapp.weekday;
+
+import lombok.RequiredArgsConstructor;
+import mk.ukim.finki.db.distributorapp.weekday.dto.WeekdayDto;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class WeekdayServiceImpl implements WeekdayService {
+    private final WeekdayRepository weekdayRepository;
+
+    @Override
+    public Integer create(WeekdayDto weekdayDto) {
+        return this.weekdayRepository.create(
+                weekdayDto.getDayName()
+        );
+    }
+
+    @Override
+    public Integer edit(WeekdayDto weekdayDto) {
+        return this.weekdayRepository.edit(
+                weekdayDto.getId(),
+                weekdayDto.getDayName()
+        );
+    }
+
+    @Override
+    public void deleteById(Short id) {
+        this.weekdayRepository.deleteById(id);
+    }
+}
Index: src/main/java/mk/ukim/finki/db/distributorapp/weekday/dto/WeekdayDto.java
===================================================================
--- src/main/java/mk/ukim/finki/db/distributorapp/weekday/dto/WeekdayDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/java/mk/ukim/finki/db/distributorapp/weekday/dto/WeekdayDto.java	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,11 @@
+package mk.ukim.finki.db.distributorapp.weekday.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class WeekdayDto {
+    private Short id;
+    private String dayName;
+}
Index: src/main/resources/application-prod.properties
===================================================================
--- src/main/resources/application-prod.properties	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/application-prod.properties	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,43 @@
+server.port=8443
+
+## -------------------POSTGRESQL & JPA-------------------
+spring.datasource.url=${DB_URL}
+spring.datasource.username=${DB_USERNAME}
+spring.datasource.password=${DB_PASSWORD}
+
+spring.datasource.hikari.connectionTimeout=20000
+spring.datasource.hikari.maximumPoolSize=5
+
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+
+spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
+spring.jpa.show-sql=true
+
+spring.datasource.hikari.schema=IND0_185022
+
+spring.jpa.properties.hibernate.format_sql=true
+spring.jpa.properties.hibernate.use_sql_comments=true
+spring.datasource.driver-class-name=org.postgresql.Driver
+
+## -------------------HTTPS Configuration-------------------
+server.ssl.key-store=classpath:keystore.p12
+server.ssl.key-store-password=${KS_PASSWORD}
+server.ssl.key-store-type=PKCS12
+server.ssl.key-alias=${KEY_ALIAS}
+server.ssl.enabled=true
+
+## -------------------JWT Configuration-------------------
+jwt.secret=${JWT_SECRET}
+jwt.validity=3600000
+
+## -------------------Email properties-------------------
+spring.mail.host=smtp.gmail.com
+spring.mail.port=587
+spring.mail.username=${SMTP_USERNAME}
+spring.mail.password=${SMTP_PASSWORD}
+spring.mail.properties.mail.smtp.auth=true
+spring.mail.properties.mail.smtp.starttls.enable=true
+
+## Logging/Debugging:
+logging.level.org.springframework.jdbc=DEBUG
+logging.level.org.hibernate.SQL=DEBUG
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/application.properties	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,3 @@
+spring.application.name=DistributorApp
+
+spring.profiles.active=prod
Index: src/main/resources/templates/all-drivers.html
===================================================================
--- src/main/resources/templates/all-drivers.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/all-drivers.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>
Index: src/main/resources/templates/all-managers.html
===================================================================
--- src/main/resources/templates/all-managers.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/all-managers.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>
Index: src/main/resources/templates/authentication/access_denied.html
===================================================================
--- src/main/resources/templates/authentication/access_denied.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/authentication/access_denied.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+Error
+</body>
+</html>
Index: src/main/resources/templates/authentication/changePass.html
===================================================================
--- src/main/resources/templates/authentication/changePass.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/authentication/changePass.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Change Password</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div class="change-password-container">
+    <h1 class="text-center mb-4">Change Password</h1>
+    <form method="POST" th:action="@{/rest/auth/changePass}">
+        <div class="form-group">
+            <label for="oldPassword" class="form-label">Old Password</label>
+            <input type="password" class="form-control" id="oldPassword" name="oldPassword" required>
+        </div>
+
+        <div class="form-group">
+            <label for="newPassword" class="form-label">New Password</label>
+            <input type="password" class="form-control" id="newPassword" name="newPassword" required>
+        </div>
+
+        <div class="form-group">
+            <label for="confirmPassword" class="form-label">Confirm Password</label>
+            <input type="password" class="form-control" id="confirmPassword" name="confirmPassword" required>
+        </div>
+
+        <button type="submit" class="btn btn-primary">Change Password</button>
+    </form>
+
+    <div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div>
+
+    <div th:if="${success}" class="alert alert-success mt-3" th:text="${success}"></div>
+</div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/authentication/login.html
===================================================================
--- src/main/resources/templates/authentication/login.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/authentication/login.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Login</title>
+    <link rel="stylesheet" th:href="@{/css/style.css}">
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/header :: header}"></div>
+<main>
+    <div class="container">
+        <form class="form-signin mt-xl-5" method="post" th:action="@{/auth/login}">
+            <h2 class="form-signin-heading">Sign in</h2>
+            <p>
+                <!--                <label for="username" class="sr-only">Email</label>-->
+                <label>
+                    <input type="email" name="email" placeholder="Email" required>
+                </label>
+            </p>
+            <p>
+                <!--                <label for="password" class="sr-only">Password</label>-->
+                <label>
+                    <input type="password" name="password" placeholder="Password" required>
+                </label>
+            </p>
+
+            <div th:if="${param.error}" th:text="${param.error}" class="text-danger">
+                <p style="color: red;">Invalid username or password</p>
+            </div>
+
+            <div class="row">
+                <div class="col-md-3">
+                    <button id="submit" class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-3">
+                    <a href="/reset-password/request" class="btn btn-lg btn-block btn-light">Change your password</a>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-3">
+                    <a href="/auth/register" class="btn btn-lg btn-block btn-light">Register here</a>
+                </div>
+            </div>
+        </form>
+    </div>
+</main>
+<div th:replace="~{fragments/footer :: footer}"></div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/authentication/register.html
===================================================================
--- src/main/resources/templates/authentication/register.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/authentication/register.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,134 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Register</title>
+    <link rel="stylesheet" th:href="@{/css/style.css}">
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/header :: header}"></div>
+<main>
+    <div class="container mb-4">
+        <form class="form-signin mt-xl-5" th:action="@{/auth/register}" method="post">
+            <h2 class="form-signin-heading">Register as a Customer</h2>
+            <div class="container">
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="email" class="sr-only">Email: </label>
+                            <input type="email" id="email" name="email" class="form-control"
+                                   placeholder="Email" required="" autofocus="">
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="compName" class="sr-only">Company Name:</label>
+                            <input type="text" id="compName" name="compName" class="form-control"
+                            placeholder="Company Name" required="" autofocus="">
+                        </div>
+                    </div>
+
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="password" class="sr-only">Password: </label>
+                            <input type="password" id="password" name="password" class="form-control"
+                                   placeholder="Password" required="" autofocus="">
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="edb" class="sr-only">EDB: </label>
+                            <input type="text" id="edb" name="edb" class="form-control"
+                                   placeholder="Email" required="" autofocus="">
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
+                            <input type="password" id="repeatedPassword" name="repeatedPassword" class="form-control"
+                                   placeholder="Repeat Password" required="" autofocus="">
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="address" class="sr-only">Address: </label>
+                            <input type="text" id="address" name="address" class="form-control"
+                                   placeholder="Address" required="" autofocus="">
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="name" class="sr-only">First Name: </label>
+                            <input type="text" id="name" name="name" class="form-control"
+                                   placeholder="First Name" required="" autofocus="">
+                        </div>
+                    </div>
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="repImage" class="sr-only">Representative Image: </label>
+                            <input type="file" id="repImage" name="repImage" class="form-control" accept="image/*">
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="surname" class="sr-only">Last Name: </label>
+                            <input type="text" id="surname" name="surname" class="form-control"
+                                   placeholder="Last Name" required="" autofocus="">
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="mobile" class="sr-only">Mobile: </label>
+                            <input type="tel" id="mobile" name="mobile" class="form-control"
+                                   placeholder="Mobile" required="" autofocus="">
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="profileImage" class="sr-only">Profile Picture: </label>
+                            <input type="file" id="profileImage" name="profileImage" class="form-control" accept="image/*">
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <label for="city" class="sr-only">City the company is located in: </label>
+                            <select id="city" name="city" required class="form-control">
+                                <option value="" disabled selected>Select your city</option>
+                                <option th:each="city : ${cities}"
+                                        th:value="${city.getId()}"
+                                        th:text="${city.getName()}">
+                                </option>
+                            </select>
+                        </div>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-6">
+                        <div class="form-group">
+                            <button type="submit" class="btn btn-primary mt-3">Register</button>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+</main>
+<div th:replace="~{fragments/footer :: footer}"></div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/authentication/reset-password-request.html
===================================================================
--- src/main/resources/templates/authentication/reset-password-request.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/authentication/reset-password-request.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Reset Password</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        body {
+            background-color: #f8f9fa;
+        }
+        .reset-password-container {
+            max-width: 500px;
+            margin: 50px auto;
+            padding: 20px;
+            background: #fff;
+            border-radius: 8px;
+            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+        }
+        .btn-primary {
+            width: 100%;
+            padding: 10px;
+        }
+    </style>
+</head>
+<body>
+<div class="reset-password-container">
+    <h1 class="text-center mb-4">Reset Password</h1>
+    <form th:action="@{/rest/auth/reset-password-request}" method="post">
+        <div class="form-group">
+            <label for="email" class="form-label">Email</label>
+            <input type="email" class="form-control" id="email" name="email" required>
+        </div>
+
+        <div class="form-group">
+            <button type="submit" class="btn btn-primary">Submit</button>
+            <a href="/static" class="btn btn-secondary mt-2 w-100">Cancel</a>
+        </div>
+    </form>
+    <div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div>
+</div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/authentication/reset-password.html
===================================================================
--- src/main/resources/templates/authentication/reset-password.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/authentication/reset-password.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,51 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Reset Password</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        body {
+            background-color: #f8f9fa;
+        }
+        .reset-password-container {
+            max-width: 500px;
+            margin: 50px auto;
+            padding: 20px;
+            background: #fff;
+            border-radius: 8px;
+            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+        }
+        .btn-primary {
+            width: 100%;
+            padding: 10px;
+        }
+    </style>
+</head>
+<body>
+<div class="reset-password-container">
+    <h1 class="text-center mb-4">Reset Password</h1>
+    <form th:action="@{/reset-password}" method="post">
+        <input type="hidden" name="token" th:value="${token}">
+
+        <div class="form-group">
+            <label for="newPassword" class="form-label">New Password</label>
+            <input type="password" class="form-control" id="newPassword"
+                   name="newPassword" placeholder="New Password" required>
+        </div>
+
+        <div class="form-group">
+            <label for="confirmPassword" class="form-label">Confirm Password</label>
+            <input type="password" class="form-control" id="confirmPassword"
+                   name="confirmPassword" placeholder="Confirm Password" required>
+        </div>
+
+        <button type="submit" class="btn btn-primary">Reset Password</button>
+    </form>
+
+    <div th:if="${error}" class="alert alert-danger mt-3" th:text="${error}"></div>
+
+    <div th:if="${success}" class="alert alert-success mt-3" th:text="${success}"></div>
+</div>
+</body>
+</html>
Index: src/main/resources/templates/create-delivery.html
===================================================================
--- src/main/resources/templates/create-delivery.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/create-delivery.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Create Delivery</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        .scrollable-table {
+            height: 300px;
+            overflow-y: auto;
+        }
+    </style>
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+<div class="container mt-4">
+    <h1>Create Delivery from Undelivered Orders</h1>
+
+    <form th:action="@{/manager/create-delivery}" method="post" th:object="${newDelivery}">
+        <div class="row">
+            <div class="col-md-8">
+                <h2>Undelivered Orders</h2>
+                <div class="scrollable-table">
+                    <table class="table table-striped">
+                        <thead>
+                        <tr>
+                            <th>Select</th>
+                            <th>Order ID</th>
+                            <th>Order Date</th>
+                            <th>Order Sum</th>
+                            <th>Customer Name</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr th:each="order : ${newOrders}">
+                            <td>
+                                <input type="checkbox" name="orderIds" th:field="*{orders}" th:value="${order.id}"/>
+                            </td>
+                            <td th:text="${order.id}"></td>
+                            <td th:text="${order.ordDate}"></td>
+                            <td th:text="${order.ordSum}"></td>
+                            <td th:text="${order.customerName}"></td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <div class="col-md-4">
+                <div class="mb-3">
+                    <label for="deliveryDate" class="form-label">Delivery Date:</label>
+                    <input type="date" id="deliveryDate" name="deliveryDate" class="form-control" th:field="*{delDate}" required>
+                </div>
+                <h2>Select Vehicle</h2>
+                <div class="scrollable-table">
+                    <table class="table table-striped">
+                        <thead>
+                        <tr>
+                            <th>Select</th>
+                            <th>Plate</th>
+                            <th>Load Capacity</th>
+                            <th>Driver name</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr th:each="vehicle : ${vehicles}">
+                            <td>
+                                <input type="radio" name="vehicleId" th:value="${vehicle.id}" th:field="*{vehId}"/>
+                            </td>
+                            <td th:text="${vehicle.getPlate()}"></td>
+                            <td th:text="${vehicle.getCarryWeight()}"></td>
+                            <td th:text="${vehicle.getDriverName()}"></td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+
+        <!-- Submit Button -->
+        <div class="mt-3">
+            <button type="submit" class="btn btn-primary">Create Delivery</button>
+        </div>
+    </form>
+</div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/create-driver.html
===================================================================
--- src/main/resources/templates/create-driver.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/create-driver.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Create a Driver</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+<div class="container mb-4">
+    <form class="form-signin mt-xl-5" th:action="@{/admin/create-driver}" method="post" th:object="${driver}">
+        <h2 class="form-signin-heading">Create a Driver</h2>
+        <div class="container">
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="email" class="sr-only">Email: </label>
+                        <input type="email" id="email" name="email" class="form-control"
+                               placeholder="Email address" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="password" class="sr-only">Password:</label>
+                        <input type="password" id="password" name="password" class="form-control"
+                               placeholder="Password" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
+                        <input type="password" id="repeatedPassword" name="repeatedPassword" class="form-control"
+                               placeholder="Repeat Password" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="name" class="sr-only">First Name: </label>
+                        <input type="text" id="name" name="name" class="form-control"
+                               placeholder="First Name" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="surname" class="sr-only">Last Name: </label>
+                        <input type="text" id="surname" name="surname" class="form-control"
+                               placeholder="Last Name" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="mobile" class="sr-only">Mobile: </label>
+                        <input type="tel" id="mobile" name="mobile" class="form-control"
+                               placeholder="Mobile" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="profileImage" class="sr-only">Profile Picture: </label>
+                        <input type="file" id="profileImage" name="profileImage" class="form-control" accept="image/*">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="city" class="sr-only">City the company is located in: </label>
+                        <select id="city" name="city" required class="form-control">
+                            <option value="" disabled selected>Select your city</option>
+                            <option th:each="city : ${cities}"
+                                    th:value="${city.getId()}"
+                                    th:text="${city.getName()}">
+                            </option>
+                        </select>
+                    </div>
+                </div>
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="vehicle" class="sr-only">Assign a vehicle to the driver: </label>
+                        <select id="vehicle" name="vehicle" required class="form-control">
+                            <option value="" disabled selected>Choose a vehicle</option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <button type="submit" class="btn btn-primary mt-3">Submit</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+</div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+<script>
+    document.addEventListener("DOMContentLoaded", function () {
+        var citySelect = document.getElementById("city");
+        var vehicleSelect = document.getElementById("vehicle");
+
+        if (citySelect) {
+            citySelect.addEventListener("change", function () {
+                let selectedCityId = this.value;
+                console.log("City changed, value:", selectedCityId);
+
+                // Clear current vehicle options
+                vehicleSelect.innerHTML = '<option value="">Select a vehicle</option>';
+
+                // Only fetch if a valid city is selected
+                if (selectedCityId) {
+                    fetch("/admin/vehicle-by-city?cityId=" + selectedCityId)
+                        .then(response => {
+                            if (!response.ok) {
+                                throw new Error("Network response was not ok " + response.statusText);
+                            }
+                            return response.json();
+                        })
+                        .then(data => {
+                            console.log("Fetched vehicles:", data);
+                            // Populate the vehicles dropdown
+                            data.forEach(function (vehicle) {
+                                // Adjust property names as needed – here we assume:
+                                // - vehicle.id: the vehicle's unique id
+                                // - vehicle.name: the vehicle's display name (or plate)
+                                var option = document.createElement("option");
+                                option.value = vehicle.id;
+                                option.text = vehicle.plateNumber;  // or use another property like vehicle.plate if available
+                                vehicleSelect.appendChild(option);
+                            });
+                        })
+                        .catch(error => {
+                            console.error("Fetch error:", error);
+                        });
+                }
+            });
+        }
+    });
+</script>
+</body>
+</html>
Index: src/main/resources/templates/create-manager.html
===================================================================
--- src/main/resources/templates/create-manager.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/create-manager.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,136 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Create a Manager</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+<div class="container mb-4">
+    <form class="form-signin mt-xl-5" th:action="@{/admin/create-manager}" method="post" th:object="${manager}">
+        <h2 class="form-signin-heading">Create a Manager</h2>
+        <div class="container">
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="email" class="sr-only">Email: </label>
+                        <input type="email" id="email" name="email" class="form-control"
+                               placeholder="Email address" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="password" class="sr-only">Password:</label>
+                        <input type="password" id="password" name="password" class="form-control"
+                               placeholder="Password" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="repeatedPassword" class="sr-only">Repeat Password: </label>
+                        <input type="password" id="repeatedPassword" name="repeatedPassword" class="form-control"
+                               placeholder="Repeat Password" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="name" class="sr-only">First Name: </label>
+                        <input type="text" id="name" name="name" class="form-control"
+                               placeholder="First Name" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="surname" class="sr-only">Last Name: </label>
+                        <input type="text" id="surname" name="surname" class="form-control"
+                               placeholder="Last Name" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="mobile" class="sr-only">Mobile: </label>
+                        <input type="tel" id="mobile" name="mobile" class="form-control"
+                               placeholder="Mobile" required="" autofocus="">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="profileImage" class="sr-only">Profile Picture: </label>
+                        <input type="file" id="profileImage" name="profileImage" class="form-control" accept="image/*">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <label for="city" class="sr-only">City the company is located in: </label>
+                        <select id="city" name="city" required class="form-control">
+                            <option value="" disabled selected>Select your city</option>
+                            <option th:each="city:${cities}"
+                                    th:value="${city.getId()}"
+                                    th:text="${city.getName()}">
+                            </option>
+                        </select>
+                        <label for="warehouse"> Warehouse:</label>
+                        <input id="warehouse" type="text" name="warehouse" class="form-control" readonly/>
+                        <input type="hidden" id="warehouseId" name="warehouse">
+                    </div>
+                </div>
+            </div>
+            <div class="row">
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <button type="submit" class="btn btn-primary mt-3">Submit</button>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+</div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+<script>
+    document.addEventListener("DOMContentLoaded", function () {
+        var citySelect = document.getElementById("city");
+        var warehouseField = document.getElementById("warehouse");
+        var warehouseId = document.getElementById("warehouseId");
+
+        if (citySelect) {
+            citySelect.addEventListener("change", function () {
+                let selectedCityId = this.value;
+                console.log("City changed, value:", selectedCityId);
+
+                fetch("/admin/warehouse-by-city?cityId=" + selectedCityId)
+                    .then(response => {
+                        if (!response.ok) {
+                            throw new Error("Network response was not ok " + response.statusText);
+                        }
+                        return response.json();
+                    })
+                    .then(data => {
+                        console.log("Fetched warehouse:", data);
+                        warehouseField.value = data.address || "";
+                        warehouseId.value = data.id;
+                    })
+                    .catch(error => {
+                        console.error("Fetch error:", error);
+                    });
+            });
+        }
+    });
+</script>
+
+</body>
+</html>
Index: src/main/resources/templates/create-order.html
===================================================================
--- src/main/resources/templates/create-order.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/create-order.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,195 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Place an Order</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        .scrollable-cards {
+            max-height: 400px;
+            overflow-y: auto;
+        }
+    </style>
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+<div class="container mt-4">
+    <h1>Place Your Order</h1>
+
+    <div class="row mb-3">
+        <div class="col-md-4">
+            <label for="filterCategory" class="form-label">Category</label>
+            <select id="filterCategory" class="form-select">
+                <option value="">All</option>
+                <option th:each="cat : ${categories}"
+                        th:value="${cat.id}"
+                        th:text="${cat.name}">Category</option>
+            </select>
+        </div>
+        <div class="col-md-4">
+            <label for="filterManufacturer" class="form-label">Manufacturer</label>
+            <select id="filterManufacturer" class="form-select">
+                <option value="">All</option>
+                <option th:each="manu : ${manufacturers}"
+                        th:value="${manu.id}"
+                        th:text="${manu.name}">Manufacturer</option>
+            </select>
+        </div>
+        <div class="col-md-4">
+            <label for="filterSearch" class="form-label">Article Name</label>
+            <input type="text" id="filterSearch" class="form-control" placeholder="Search article">
+        </div>
+    </div>
+
+    <div class="scrollable-cards row row-cols-1 row-cols-md-2 row-cols-lg-3 g-3" id="articleContainer">
+        <div class="col" th:each="art : ${articles}"
+             th:attr="data-category=${art.categoryId}, data-manufacturer=${art.manufacturerId}, data-article-name=${art.name}, data-manufacturer-name=${art.manufacturer}">
+            <div class="card h-100">
+                <img th:src="@{${art.image}}" class="card-img-top" alt="Article Image" onerror="this.style.display='none'">
+                <div class="card-body">
+                    <h5 class="card-title" th:text="${art.name}">Article Name</h5>
+                    <p class="card-text">
+                        Manufacturer: <span th:text="${art.manufacturer}">Manufacturer</span><br>
+                        Price: $<span th:text="${art.price}">0.00</span><br>
+                        In Stock: <span th:text="${art.quantity}">0</span>
+                    </p>
+                </div>
+                <div class="card-footer">
+                    <button type="button" class="btn btn-primary btn-sm add-article"
+                            th:data-article-id="${art.id}"
+                            th:data-article-name="${art.name}"
+                            th:data-unit-price="${art.price}"
+                            th:data-available="${art.quantity}">
+                        Add to Order
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <h3 class="mt-4">Order Summary</h3>
+    <table class="table table-bordered" id="orderSummaryTable">
+        <thead>
+        <tr>
+            <th>Article</th>
+            <th>Unit Price</th>
+            <th>Manufacturer</th>
+            <th>Quantity</th>
+            <th>Line Total</th>
+            <th>Action</th>
+        </tr>
+        </thead>
+        <tbody>
+        </tbody>
+    </table>
+    <div class="mb-3">
+        <label for="totalSum" class="form-label">Total Sum:</label>
+        <span id="totalSum">0.00</span>
+    </div>
+    <div class="mb-3 form-check">
+        <input type="checkbox" class="form-check-input" id="proForma" name="proForma">
+        <label class="form-check-label" for="proForma">Request Pro Forma</label>
+    </div>
+
+    <form id="orderForm" th:action="@{/customer/create-order}" method="post">
+        <input type="hidden" id="orderItems" name="orderItems">
+        <button type="submit" class="btn btn-success">Place Order</button>
+    </form>
+</div>
+
+<div th:replace="~{fragments/footer :: footer}"></div>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+<script>
+    const orderItems = [];
+
+    function updateOrderSummary() {
+        const tbody = document.querySelector('#orderSummaryTable tbody');
+        tbody.innerHTML = '';
+
+        let totalSum = 0;
+        orderItems.forEach((item, index) => {
+            const row = document.createElement('tr');
+            row.innerHTML = `
+        <td>${item.articleName}</td>
+        <td>${item.unitPrice.toFixed(2)}</td>
+        <td>${item.manufacturerName}</td>
+        <td>${item.quantity}</td>
+        <td>${(item.unitPrice * item.quantity).toFixed(2)}</td>
+        <td><button type="button" class="btn btn-danger btn-sm" data-index="${index}">Remove</button></td>
+      `;
+            tbody.appendChild(row);
+            totalSum += item.unitPrice * item.quantity;
+        });
+        document.getElementById('totalSum').textContent = totalSum.toFixed(2);
+        document.getElementById('orderItems').value = JSON.stringify(orderItems);
+    }
+
+    document.querySelectorAll('.add-article').forEach(function(button) {
+        button.addEventListener('click', function() {
+            const articleId = this.getAttribute('data-article-id');
+            const articleName = this.getAttribute('data-article-name');
+            const manufacturerName = this.getAttribute('data-manufacturer-name');
+            const unitPrice = parseFloat(this.getAttribute('data-unit-price'));
+            const available = parseInt(this.getAttribute('data-available'), 10);
+
+            let quantity = prompt("Enter quantity for " + articleName, "1");
+            quantity = parseInt(quantity, 10);
+            if (isNaN(quantity) || quantity <= 0) {
+                alert("Invalid quantity. Item not added.");
+                return;
+            }
+            if (quantity > available) {
+                alert("Quantity exceeds available stock.");
+                return;
+            }
+
+            const orderItem = {
+                articleId: articleId,
+                articleName: articleName,
+                manufacturerName: manufacturerName,
+                unitPrice: unitPrice,
+                quantity: quantity
+            };
+            orderItems.push(orderItem);
+            updateOrderSummary();
+        });
+    });
+
+    document.getElementById('orderSummaryTable').addEventListener('click', function(event) {
+        if (event.target.matches('button')) {
+            const index = event.target.getAttribute('data-index');
+            orderItems.splice(index, 1);
+            updateOrderSummary();
+        }
+    });
+
+    function filterArticles() {
+        const categoryFilter = document.getElementById('filterCategory').value;
+        const manufacturerFilter = document.getElementById('filterManufacturer').value;
+        const searchFilter = document.getElementById('filterSearch').value.toLowerCase();
+
+        document.querySelectorAll('#articleContainer > .col').forEach(function(card) {
+            const cardCategory = card.getAttribute('data-category');
+            const cardManufacturer = card.getAttribute('data-manufacturer');
+            const cardArticleName = card.getAttribute('data-article-name').toLowerCase();
+
+            let matches = true;
+            if (categoryFilter && cardCategory !== categoryFilter) {
+                matches = false;
+            }
+            if (manufacturerFilter && cardManufacturer !== manufacturerFilter) {
+                matches = false;
+            }
+            if (searchFilter && !cardArticleName.includes(searchFilter)) {
+                matches = false;
+            }
+            card.style.display = matches ? 'block' : 'none';
+        });
+    }
+
+    document.getElementById('filterCategory').addEventListener('change', filterArticles);
+    document.getElementById('filterManufacturer').addEventListener('change', filterArticles);
+    document.getElementById('filterSearch').addEventListener('keyup', filterArticles);
+</script>
+</body>
+</html>
Index: src/main/resources/templates/create-warehouse.html
===================================================================
--- src/main/resources/templates/create-warehouse.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/create-warehouse.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Create Warehouse</title>
+  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/edit-driver.html
===================================================================
--- src/main/resources/templates/edit-driver.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/edit-driver.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/edit-manager.html
===================================================================
--- src/main/resources/templates/edit-manager.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/edit-manager.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+</body>
+</html>
Index: src/main/resources/templates/edit-warehouse.html
===================================================================
--- src/main/resources/templates/edit-warehouse.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/edit-warehouse.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Edit Warehouse</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/fragments/footer.html
===================================================================
--- src/main/resources/templates/fragments/footer.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/fragments/footer.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,3 @@
+<footer>
+    <p>&copy; 2024 Distributor App</p>
+</footer>
Index: src/main/resources/templates/fragments/header.html
===================================================================
--- src/main/resources/templates/fragments/header.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/fragments/header.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,41 @@
+<header>
+    <nav>
+        <ul>
+            <li><a th:href="@{/}">Home</a></li>
+
+            <!--Customer-Specific Navigation-->
+            <li th:if="${userType == 'Customer'}">
+                <a th:href="@{/customer/orders}">My Orders</a>
+            </li>
+            <li th:if="${userType == 'Customer'}">
+                <a>Account details</a>
+            </li>
+
+            <!--Manager-Specific Navigation-->
+            <li th:if="${userType == 'Manager'}">
+                <a>Assign Deliveries</a>
+            </li>
+            <li th:if="${userType == 'Manager'}">
+                <a>Monitor Progress</a>
+            </li>
+
+            <!--Driver-Specific Navigation-->
+            <li th:if="${userType == 'Driver'}">
+                <a>Assigned Deliveries</a>
+            </li>
+            <li th:if="${userType == 'Driver'}">
+                <a>My Schedule</a>
+            </li>
+
+            <li th:if="${#authorization.expression('isAuthenticated()')}">
+                <a th:href="@{/logout}">Logout</a>
+            </li>
+            <li th:if="${#authorization.expression('!isAuthenticated()')}">
+                <a th:href="@{/login}">Login</a>
+            </li>
+            <li th:if="${#authorization.expression('!isAuthenticated()')}">
+                <a th:href="@{/register}">Register</a>
+            </li>
+        </ul>
+    </nav>
+</header>
Index: src/main/resources/templates/fragments/messages.html
===================================================================
--- src/main/resources/templates/fragments/messages.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/fragments/messages.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,6 @@
+<div th:if="${message}" class="alert alert-info">
+  <p th:text="${message}"></p>
+</div>
+<div th:if="${error}" class="alert alert-danger">
+  <p th:text="${error}"></p>
+</div>
Index: src/main/resources/templates/fragments/navbar.html
===================================================================
--- src/main/resources/templates/fragments/navbar.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/fragments/navbar.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org"
+      xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<nav th:fragment="navbar" class="navbar navbar-expand-lg navbar-light bg-light">
+    <div class="container-fluid">
+        <a class="navbar-brand" th:href="@{/}">Distributor App</a>
+        <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
+                data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false"
+                aria-label="Toggle navigation">
+            <span class="navbar-toggler-icon"></span>
+        </button>
+        <div class="collapse navbar-collapse" id="navbarNav">
+            <ul class="navbar-nav me-auto">
+                <!--    Links for authenticated users:    -->
+                <li class="nav-item" sec:authorize="isAuthenticated()">
+                    <a class="nav-link" href="/">Profile</a>
+                </li>
+
+                <!--    Links for specific roles:    -->
+                <!--    CUSTOMER    -->
+                <li class="nav-item" sec:authorize="hasRole('CUSTOMER')">
+                    <a class="nav-link" href="/customer/dashboard">Home</a>
+                </li>
+                <li class="nav-item" sec:authorize="hasRole('CUSTOMER')">
+                    <a class="nav-link" href="/customer/create-order">Create an order</a>
+                </li>
+                <!--    MANAGER    -->
+                <li class="nav-item" sec:authorize="hasRole('MANAGER')">
+                    <a class="nav-link" href="/manager/dashboard">Home</a>
+                </li>
+                <li class="nav-item" sec:authorize="hasRole('MANAGER')">
+                    <a class="nav-link" href="/manager/create-delivery">Create a delivery</a>
+                </li>
+                <!--    DRIVER    -->
+                <li class="nav-item" sec:authorize="hasRole('DRIVER')">
+                    <a class="nav-link" href="/driver/dashboard">Home</a>
+                </li>
+                <!--                <li class="nav-item" sec:authorize="hasRole('ADMIN')">-->
+                <!--                    <a class="nav-link" href="/home/admin">Admin Dashboard</a>-->
+                <!--                </li>-->
+                <li class="nav-item" sec:authorize="hasRole('ADMIN')">
+                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
+                       data-bs-toggle="dropdown" aria-expanded="false">Create</a>
+                    <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
+                        <li><a class="dropdown-item" href="/admin/create-driver">Create a Driver</a></li>
+                        <li><a class="dropdown-item" href="/admin/create-manager">Create a Manager</a></li>
+                    </ul>
+                </li>
+            </ul>
+
+            <!--    Login/Logout Links:    -->
+            <ul class="navbar-nav ms-auto">
+                <li class="nav-item" sec:authorize="!isAuthenticated()">
+                    <a class="nav-link" href="/auth/login">Login</a>
+                </li>
+                <li class="nav-item" sec:authorize="isAuthenticated()">
+                    <form th:action="@{/auth/logout}" method="post">
+                        <button type="submit" class="nav-link btn btn-primary">Logout</button>
+                    </form>
+                </li>
+            </ul>
+        </div>
+    </div>
+</nav>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/home/admin.html
===================================================================
--- src/main/resources/templates/home/admin.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/home/admin.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+<div class="container mt-4">
+    <h1>Welcome to the Home Page</h1>
+    <p th:text="'Welcome Admin!'"></p>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/home/customer.html
===================================================================
--- src/main/resources/templates/home/customer.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/home/customer.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Customer Home</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+<div class="container mt-4">
+    <h1 th:text="'Here is your dashboard '+${customer.getCompName()}" class="mb-4"></h1>
+    <div class="row">
+        <div class="col-md-6">
+            <h2>Your Current Orders</h2>
+            <table class="table table-striped">
+                <thead>
+                <tr>
+                    <th>Order Date</th>
+                    <th>Order Sum</th>
+                    <th>Order Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="order : ${currentOrders}">
+                    <td th:text="${order.getOrdDate()}"></td>
+                    <td th:text="${order.getOrdSum()}"></td>
+                    <td th:text="${order.getStatusName()}"></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+
+        <div class="col-md-6">
+            <h2>Your Current Deliveries</h2>
+            <table class="table table-striped">
+                <thead>
+                <tr>
+                    <th>Delivery Date</th>
+                    <th>Driver Name</th>
+                    <th>Delivery Status</th>
+                </tr>
+                </thead>
+                <tbody>
+                <tr th:each="delivery : ${currentDeliveries}">
+                    <td th:text="${delivery.getDelDate()}"></td>
+                    <td th:text="${delivery.getDriverName()}"></td>
+                    <td th:text="${delivery.getDelStatus()}"></td>
+                </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/home/driver.html
===================================================================
--- src/main/resources/templates/home/driver.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/home/driver.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,166 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Driver Home</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        .scrollable-table {
+            max-height: 300px;
+            overflow-y: auto;
+        }
+    </style>
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+<div class="container mt-4">
+    <h1 th:text="'Here is your dashboard '+${user.getFirstName()}" class="mb-4"></h1>
+
+    <div class="row">
+        <div class="col-md-6">
+            <h2>New Deliveries</h2>
+            <div class="scrollable-table">
+                <table class="table table-striped">
+                    <thead>
+                    <tr>
+                        <th>Delivery ID</th>
+                        <th>Driver Name</th>
+                        <th>Delivery Date</th>
+                        <th>Action</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr th:each="delivery : ${newDeliveries}">
+                        <td th:text="${delivery.deliveryId}">1</td>
+                        <td th:text="${delivery.driverName}">Driver Name</td>
+                        <td th:text="${delivery.deliveryDate}">2025-02-14</td>
+                        <td>
+                            <button type="button"
+                                    class="btn btn-primary btn-sm start-delivery-btn"
+                                    data-bs-toggle="modal"
+                                    data-bs-target="#startDeliveryModal"
+                                    th:attr="data-delivery-id=${delivery.deliveryId},
+                                    data-driver-name=${delivery.driverName},
+                                    data-delivery-date=${delivery.deliveryDate}">
+                                Start Delivery
+                            </button>
+
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+
+        <div class="col-md-6">
+            <h2>Ongoing Deliveries</h2>
+            <div class="scrollable-table">
+                <table class="table table-striped">
+                    <thead>
+                    <tr>
+                        <th>Delivery ID</th>
+                        <th>Driver Name</th>
+                        <th>Delivery Date</th>
+                        <th>Action</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr th:each="delivery : ${ongoingDeliveries}">
+                        <td th:text="${delivery.deliveryId}">1</td>
+                        <td th:text="${delivery.driverName}">Driver Name</td>
+                        <td th:text="${delivery.deliveryDate}">2025-02-14</td>
+                        <td>
+                            <button type="button"
+                                    class="btn btn-danger btn-sm end-delivery-btn"
+                                    data-bs-toggle="modal"
+                                    data-bs-target="#endDeliveryModal"
+                                    th:attr="data-delivery-id=${delivery.deliveryId}">
+                                End Delivery
+                            </button>
+                        </td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="modal fade" id="startDeliveryModal" tabindex="-1" aria-labelledby="startDeliveryModalLabel"
+     aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <form th:action="@{/driver/start-delivery}" method="post" th:object="${startDelivery}">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="startDeliveryModalLabel">Enter Delivery Details</h5>
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                </div>
+                <div class="modal-body">
+                    <!-- Hidden input for the delivery ID -->
+                    <input type="hidden" name="deliveryId" th:field="*{id}" id="modalDeliveryId"/>
+
+                    <!-- Odometer Reading at Start (maps to delStartKm) -->
+                    <div class="mb-3">
+                        <label for="delStartKm" class="form-label">Odometer Start (Km)</label>
+                        <input type="number" name="delStartKm" id="delStartKm" class="form-control" required>
+                    </div>
+
+                    <div class="mb-3">
+                        <p id="modalDeliveryInfo"></p>
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
+                    <button type="submit" class="btn btn-primary">Start Delivery</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+
+<div class="modal fade" id="endDeliveryModal" tabindex="-1" aria-labelledby="endDeliveryModalLabel" aria-hidden="true">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <form th:action="@{/driver/end-delivery}" method="post" th:object="${endDelivery}">
+                <div class="modal-header">
+                    <h5 class="modal-title" id="endDeliveryModalLabel">Finish Delivery</h5>
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+                </div>
+                <div class="modal-body">
+                    <input type="hidden" th:field="*{id}" id="endDeliveryId" />
+
+                    <div class="mb-3">
+                        <label for="delEndKm" class="form-label">Odometer End (Km)</label>
+                        <input type="number" th:field="*{delEndKm}" id="delEndKm" class="form-control" required>
+                    </div>
+
+                </div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
+                    <button type="submit" class="btn btn-primary">Finish Delivery</button>
+                </div>
+            </form>
+        </div>
+    </div>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+<script>
+    document.querySelectorAll('.start-delivery-btn').forEach(function (button) {
+        button.addEventListener('click', function () {
+            const deliveryId = this.getAttribute('data-delivery-id');
+            const driverName = this.getAttribute('data-driver-name');
+            const deliveryDate = this.getAttribute('data-delivery-date');
+            document.getElementById('modalDeliveryId').value = deliveryId;
+            document.getElementById('modalDeliveryInfo').textContent =
+                "Delivery Date: " + deliveryDate + " | Driver: " + driverName;
+        });
+    });
+    document.querySelectorAll('.end-delivery-btn').forEach(function(button) {
+        button.addEventListener('click', function() {
+            document.getElementById('endDeliveryId').value = this.getAttribute('data-delivery-id');
+        });
+    });
+</script>
+</body>
+</html>
Index: src/main/resources/templates/home/manager.html
===================================================================
--- src/main/resources/templates/home/manager.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/home/manager.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,113 @@
+<!DOCTYPE html>
+<html lang="en" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <meta charset="UTF-8">
+    <title>Manager Home</title>
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet">
+    <style>
+        .scrollable-table {
+            max-height: 300px;
+            overflow-y: auto;
+        }
+    </style>
+</head>
+<body>
+<div th:replace="~{fragments/navbar :: navbar}"></div>
+
+<div class="container mt-4">
+    <h1 th:text="'Here is your dashboard '+${user.getFirstName()}"></h1>
+    <div class="row">
+        <div class="col-md-6">
+            <h2> Current inventory</h2>
+            <div class="scrollable-table">
+                <table class="table table-striped">
+                    <thead>
+                    <tr>
+                        <th>Article</th>
+                        <th>Manufacturer</th>
+                        <th>Quantity</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr th:each="inventory : ${currentInventory}">
+                        <td th:text="${inventory.getArticleName()}"></td>
+                        <td th:text="${inventory.getManufacturerName()}"></td>
+                        <td th:text="${inventory.getTotalUnits()}"></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+        <div class="col-md-6">
+            <h2>Vehicle Status</h2>
+            <div class="scrollable-table">
+                <table class="table table-striped">
+                    <thead>
+                    <tr>
+                        <th>Vehicle plate</th>
+                        <th>Registration Date</th>
+                        <th>Driver Name</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr th:each="vehicle : ${vehicleStatus}">
+                        <td th:text="${vehicle.getPlate()}"></td>
+                        <td th:text="${vehicle.getRegistrationDate()}"></td>
+                        <td th:text="${vehicle.getDriverName()}"></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+
+    <div class="row mt-4">
+        <div class="col-md-6">
+            <h2>New Orders</h2>
+            <div class="scrollable-table">
+                <table class="table table-striped">
+                    <thead>
+                    <tr>
+                        <th>Customer</th>
+                        <th>Order Date</th>
+                        <th>Order Sum</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr th:each="order : ${newOrders}">
+                        <td th:text="${order.getCustomerName()}"></td>
+                        <td th:text="${order.getOrdDate()}"></td>
+                        <td th:text="${order.getOrdSum()}"></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+
+        <div class="col-md-6">
+            <h2>Current Deliveries</h2>
+            <div class="scrollable-table">
+                <table class="table table-striped">
+                    <thead>
+                    <tr>
+                        <th>Delivery Driver</th>
+                        <th>Delivery Start Time</th>
+                        <th>Delivery Status</th>
+                    </tr>
+                    </thead>
+                    <tbody>
+                    <tr th:each="delivery : ${currentDeliveries}">
+                        <td th:text="${delivery.getDriverName()}"></td>
+                        <td th:text="${delivery.getDelStartTime()}"></td>
+                        <td th:text="${delivery.getDelStatus()}"></td>
+                    </tr>
+                    </tbody>
+                </table>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js"></script>
+</body>
+</html>
Index: src/main/resources/templates/start-delivery-1.html
===================================================================
--- src/main/resources/templates/start-delivery-1.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
+++ src/main/resources/templates/start-delivery-1.html	(revision 78718cb1d196e1fa46ab48a5b037ec14798b12cf)
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+
+</body>
+</html>
