From 00ac560bd616cd5aeb18c6ed9087cd35ac2c7003 Mon Sep 17 00:00:00 2001
From: Levi <levipalm95@gmail.com>
Date: Wed, 1 Sep 2021 16:30:08 +0200
Subject: [PATCH 01/48] Create sv-SE.js

---
 src/languages/sv-SE.js | 110 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)
 create mode 100644 src/languages/sv-SE.js

diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
new file mode 100644
index 0000000..666851f
--- /dev/null
+++ b/src/languages/sv-SE.js
@@ -0,0 +1,110 @@
+export default {
+    languageName: "Swedish",
+    checkEverySecond: "Uppdatera var {0} sekund.",
+    "Avg.": "Genomsnitt ",
+    retriesDescription: "Max antal försök innan tjänsten markeras som nere och en notis skickas",
+    ignoreTLSError: "Ignorera TLS/SSL-fel för webbsidor med HTTPS",
+    upsideDownModeDescription: "Vänd upp och ner på statusen. Om tjänsten är nåbar visas den som NERE.",
+    maxRedirectDescription: "Max antal omdirigeringar att följa. Välj 0 för att avaktivera omdirigeringar.",
+    acceptedStatusCodesDescription: "Välj statuskoder som räknas som lyckade.",
+    passwordNotMatchMsg: "Det bekräftade lösenorder stämmer ej överens.",
+    notificationDescription: "Vänligen lägg till en notistjänst till övervakaren.",
+    keywordDescription: "Sök efter nyckelord i ren HTML eller JSON-svar. Sökningen är skiftkänslig.",
+    pauseDashboardHome: "Pausa",
+    deleteMonitorMsg: "Är du säker på att du vill ta bort den här övervakningen?",
+    deleteNotificationMsg: "Är du säker på att du vill ta bort den här notisen för alla övervakare?",
+    resoverserverDescription: "Cloudflare är den förvalda servern. Du kan byta resolver när som helst.",
+    rrtypeDescription: "Välj den RR-typ du vill övervaka",
+    pauseMonitorMsg: "Är du säker på att du vill pausa?",
+    Settings: "Inställningar",
+    Dashboard: "Infopanel",
+    "New Update": "Ny uppdatering",
+    Language: "Språk",
+    Appearance: "Utseende",
+    Theme: "Tema",
+    General: "Allmänt",
+    Version: "Version",
+    "Check Update On GitHub": "Sök efter uppdatering på GitHub",
+    List: "Lista",
+    Add: "Lägg till",
+    "Add New Monitor": "Lägg Till Ny Övervakare",
+    "Quick Stats": "Snabbstatistik",
+    Up: "Uppe",
+    Down: "Nere",
+    Pending: "Pågående",
+    Unknown: "Okänt",
+    Pause: "Paus",
+    Name: "Namn",
+    Status: "Status",
+    DateTime: "DatumTid",
+    Message: "Meddelande",
+    "No important events": "Inga viktiga händelser",
+    Resume: "Återuppta",
+    Edit: "Redigera",
+    Delete: "Ta bort",
+    Current: "Nuvarande",
+    Uptime: "Drifttid",
+    "Cert Exp.": "Certifikatsutgång",
+    days: "dagar",
+    day: "dag",
+    "-day": "-dag",
+    hour: "timme",
+    "-hour": "-timme",
+    Response: "Svar",
+    Ping: "Ping",
+    "Monitor Type": "Övervakningstyp",
+    Keyword: "Nyckelord",
+    "Friendly Name": "Vänligt Namn",
+    URL: "URL",
+    Hostname: "Värdnamn",
+    Port: "Port",
+    "Heartbeat Interval": "Hjärtslagsintervall",
+    Retries: "Försök",
+    Advanced: "Avancerat",
+    "Upside Down Mode": "Upp och ner-läge",
+    "Max. Redirects": "Max antal omdirigeringar",
+    "Accepted Status Codes": "Tillåtna statuskoder",
+    Save: "Spara",
+    Notifications: "Notiser",
+    "Not available, please setup.": "Ej tillgänglig, vänligen konfigurera.",
+    "Setup Notification": "Konfigurera Notis",
+    Light: "Ljust",
+    Dark: "Mörkt",
+    Auto: "Automatisk",
+    "Theme - Heartbeat Bar": "Tema - Heartbeat Bar",
+    Normal: "Normal",
+    Bottom: "Botten",
+    None: "Ingen",
+    Timezone: "Tidszon",
+    "Search Engine Visibility": "Synlighet på Sökmotorer",
+    "Allow indexing": "Tillåt indexering",
+    "Discourage search engines from indexing site": "Hindra sökmotorer från att indexera sidan",
+    "Change Password": "Byt Lösenord",
+    "Current Password": "Nuvarande Lösenord",
+    "New Password": "Nytt Lösenord",
+    "Repeat New Password": "Upprepa Nytt Lösenord",
+    "Update Password": "Uppdatera Lösenord",
+    "Disable Auth": "Avaktivera Autentisering",
+    "Enable Auth": "Aktivera Autentisering",
+    Logout: "Logga ut",
+    Leave: "Lämna",
+    "I understand, please disable": "Jag förstår, vänligen avaktivera",
+    Confirm: "Bekräfta",
+    Yes: "Ja",
+    No: "Nej",
+    Username: "Användarnamn",
+    Password: "Lösenord",
+    "Remember me": "Kom ihåg mig",
+    Login: "Logga in",
+    "No Monitors, please": "Inga Övervakare, tack",
+    "add one": "lägg till en",
+    "Notification Type": "Notistyp",
+    Email: "Email",
+    Test: "Test",
+    "Certificate Info": "Certifikatsinfo",
+    "Resolver Server": "Resolverserver",
+    "Resource Record Type": "RR-typ",
+    "Last Result": "Senaste resultat",
+    "Create your admin account": "Skapa ditt administratörskonto",
+    "Repeat Password": "Upprepa Lösenord"
+}

From ed5c75282c2c874d31771ed5397cae1ae1d42dee Mon Sep 17 00:00:00 2001
From: Levi <levipalm95@gmail.com>
Date: Wed, 1 Sep 2021 16:38:05 +0200
Subject: [PATCH 02/48] Update main.js

---
 src/main.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/main.js b/src/main.js
index e0f59da..3c261d8 100644
--- a/src/main.js
+++ b/src/main.js
@@ -29,6 +29,7 @@ import deDE from "./languages/de-DE";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
+import svSE from "./languages/sv-SE";
 
 const routes = [
     {
@@ -98,6 +99,7 @@ const languageList = {
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,
+    "sv-SE": svSE,
 };
 
 const i18n = createI18n({

From dce2ba8f9f8b9002924ee0c08aaa0b6303a9c45c Mon Sep 17 00:00:00 2001
From: Levi <levipalm95@gmail.com>
Date: Wed, 1 Sep 2021 16:41:51 +0200
Subject: [PATCH 03/48] Update sv-SE.js

---
 src/languages/sv-SE.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
index 666851f..068f5d5 100644
--- a/src/languages/sv-SE.js
+++ b/src/languages/sv-SE.js
@@ -7,7 +7,7 @@ export default {
     upsideDownModeDescription: "Vänd upp och ner på statusen. Om tjänsten är nåbar visas den som NERE.",
     maxRedirectDescription: "Max antal omdirigeringar att följa. Välj 0 för att avaktivera omdirigeringar.",
     acceptedStatusCodesDescription: "Välj statuskoder som räknas som lyckade.",
-    passwordNotMatchMsg: "Det bekräftade lösenorder stämmer ej överens.",
+    passwordNotMatchMsg: "Det bekräftade lösenordet stämmer ej överens.",
     notificationDescription: "Vänligen lägg till en notistjänst till övervakaren.",
     keywordDescription: "Sök efter nyckelord i ren HTML eller JSON-svar. Sökningen är skiftkänslig.",
     pauseDashboardHome: "Pausa",

From 4aae402b36d239860164f53b5b1fd09011297ea6 Mon Sep 17 00:00:00 2001
From: dhfhfk <dhfhfk1203@gmail.com>
Date: Thu, 2 Sep 2021 00:29:01 +0900
Subject: [PATCH 04/48] Update main.js

---
 src/main.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/main.js b/src/main.js
index e0f59da..9aab000 100644
--- a/src/main.js
+++ b/src/main.js
@@ -29,6 +29,7 @@ import deDE from "./languages/de-DE";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
+import koKR from "./languages/ko-KR";
 
 const routes = [
     {
@@ -98,6 +99,7 @@ const languageList = {
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,
+    "ko-KR": koKR,
 };
 
 const i18n = createI18n({

From 1c4e5b79be47040287250c99e8d1d656542bd8df Mon Sep 17 00:00:00 2001
From: dhfhfk <dhfhfk1203@gmail.com>
Date: Thu, 2 Sep 2021 00:30:08 +0900
Subject: [PATCH 05/48] Create ko-KR.js

---
 src/languages/ko-KR.js | 110 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)
 create mode 100644 src/languages/ko-KR.js

diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
new file mode 100644
index 0000000..ff4a793
--- /dev/null
+++ b/src/languages/ko-KR.js
@@ -0,0 +1,110 @@
+export default {
+    languageName: '한국어',
+    checkEverySecond: '{0} 초마다 체크해요.',
+    'Avg.': '평균 ',
+    retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수',
+    ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기',
+    upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 DOWN으로 표시할 거에요.',
+    maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.',
+    acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.',
+    passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.',
+    notificationDescription: '모니터링에 알림을 설정할 수 있어요.',
+    keywordDescription: 'Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.',
+    pauseDashboardHome: '일시 정지',
+    deleteMonitorMsg: '정말 이 모니터링을 삭제할까요?',
+    deleteNotificationMsg: '정말 이 알림을 모든 모니터링에서 삭제할까요?',
+    resoverserverDescription: 'Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.',
+    rrtypeDescription: '모니터링할 RR-Type을 선택해요.',
+    pauseMonitorMsg: '정말 이 모니터링을 일시 정지 할까요?',
+    Settings: '설정',
+    Dashboard: '대시보드',
+    'New Update': '새로운 업데이트',
+    Language: '언어',
+    Appearance: '외형',
+    Theme: '테마',
+    General: '일반',
+    Version: '버전',
+    'Check Update On GitHub': '깃허브에서 업데이트 확인',
+    List: '목록',
+    Add: '추가',
+    'Add New Monitor': '새로운 모니터링 추가하기',
+    'Quick Stats': '간단한 정보',
+    Up: '온라인',
+    Down: '오프라인',
+    Pending: '대기 중',
+    Unknown: '알 수 없음',
+    Pause: '일시 정지',
+    Name: '이름',
+    Status: '상태',
+    DateTime: '날짜',
+    Message: '메시지',
+    'No important events': '중요 이벤트 없음',
+    Resume: '재개',
+    Edit: '수정',
+    Delete: '삭제',
+    Current: '현재',
+    Uptime: '업타임',
+    'Cert Exp.': '인증서 만료',
+    days: '일',
+    day: '일',
+    '-day': '-일',
+    hour: '시간',
+    '-hour': '-시간',
+    Response: '응답',
+    Ping: '핑',
+    'Monitor Type': '모니터링 종류',
+    Keyword: '키워드',
+    'Friendly Name': '이름',
+    URL: 'URL',
+    Hostname: '호스트네임',
+    Port: '포트',
+    'Heartbeat Interval': '하트비트 주기',
+    Retries: '재시도',
+    Advanced: '고급',
+    'Upside Down Mode': '상태 반전 모드',
+    'Max. Redirects': '최대 리다이렉트',
+    'Accepted Status Codes': '응답 성공 상태 코드',
+    Save: '저장',
+    Notifications: '알림',
+    'Not available, please setup.': '존재하지 않아요, 새로운거 하나 만드는건 어때요?',
+    'Setup Notification': '알림 설정',
+    Light: '라이트',
+    Dark: '다크',
+    Auto: '자동',
+    'Theme - Heartbeat Bar': '테마 - 하트비트 바',
+    Normal: '기본값',
+    Bottom: '가운데',
+    None: '제거',
+    Timezone: '시간대',
+    'Search Engine Visibility': '검색 엔진 활성화',
+    'Allow indexing': '인덱싱 허용',
+    'Discourage search engines from indexing site': '검색 엔진 인덱싱 거부',
+    'Change Password': '비밀번호 변경',
+    'Current Password': '기존 비밀번호',
+    'New Password': '새로운 비밀번호',
+    'Repeat New Password': '새로운 비밀번호 재입력',
+    'Update Password': '비밀번호 변경',
+    'Disable Auth': '인증 끄기',
+    'Enable Auth': '인증 켜기',
+    Logout: '로그아웃',
+    Leave: '나가기',
+    'I understand, please disable': '기능에 대해 이해했어요.',
+    Confirm: '확인',
+    Yes: '확인',
+    No: '취소',
+    Username: '이름',
+    Password: '비밀번호',
+    'Remember me': '비밀번호 기억하기',
+    Login: '로그인',
+    'No Monitors, please': '모니터링이 없어요,',
+    'add one': '하나 추가해봐요',
+    'Notification Type': '알림 종류',
+    Email: '이메일',
+    Test: '테스트',
+    'Certificate Info': '인증서 정보',
+    'Resolver Server': 'Resolver 서버',
+    'Resource Record Type': '자원 레코드 유형',
+    'Last Result': '최근 결과',
+    'Create your admin account': '관리자 계정 만들기',
+    'Repeat Password': '비밀번호 재입력'
+};
\ No newline at end of file

From 0cc5053f142efc883ff626b0ccb7d5d03a8c739b Mon Sep 17 00:00:00 2001
From: dhfhfk <dhfhfk1203@gmail.com>
Date: Thu, 2 Sep 2021 00:35:50 +0900
Subject: [PATCH 06/48] Update ko-KR.js

---
 src/languages/ko-KR.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index ff4a793..91f8f9b 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -4,7 +4,7 @@ export default {
     'Avg.': '평균 ',
     retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수',
     ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기',
-    upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 DOWN으로 표시할 거에요.',
+    upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.',
     maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.',
     acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.',
     passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.',

From 2d408732db087d8044690b67f5de828c187b6d6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EC=98=A4=EB=A1=9C=EB=9D=BC?=
 <68490827+dhfhfk@users.noreply.github.com>
Date: Thu, 2 Sep 2021 01:01:18 +0900
Subject: [PATCH 07/48] Update main.js

Prevent conflict with #304 (Added Swedish Language)
---
 src/main.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/main.js b/src/main.js
index 9aab000..435caf2 100644
--- a/src/main.js
+++ b/src/main.js
@@ -29,6 +29,7 @@ import deDE from "./languages/de-DE";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
+import svSE from "./languages/sv-SE";
 import koKR from "./languages/ko-KR";
 
 const routes = [
@@ -99,6 +100,7 @@ const languageList = {
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,
+    "sv-SE": svSE,
     "ko-KR": koKR,
 };
 

From eeb00a55113b5d2a63feab07a57b43ccdad1ebd1 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 01:56:02 +0800
Subject: [PATCH 08/48] fix data type

---
 src/pages/Dashboard.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Dashboard.vue b/src/pages/Dashboard.vue
index b9c82e0..1cf237c 100644
--- a/src/pages/Dashboard.vue
+++ b/src/pages/Dashboard.vue
@@ -5,7 +5,7 @@
                 <div>
                     <router-link to="/add" class="btn btn-primary mb-3"><font-awesome-icon icon="plus" /> {{ $t("Add New Monitor") }}</router-link>
                 </div>
-                <MonitorList scrollbar="true" />
+                <MonitorList :scrollbar="true" />
             </div>
 
             <div class="col-12 col-md-7 col-xl-8 mb-3">

From e1f378ee6c8ede64f6de654e9c913e6292b4f162 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 02:11:44 +0800
Subject: [PATCH 09/48] Update README.md

---
 README.md | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/README.md b/README.md
index 45a1a33..925b879 100644
--- a/README.md
+++ b/README.md
@@ -66,6 +66,10 @@ I will mark requests/issues to the next milestone.
 
 https://github.com/louislam/uptime-kuma/milestones
 
+Project Plan:
+
+https://github.com/louislam/uptime-kuma/projects/1
+
 ## 🖼 More Screenshots
 
 Dark Mode:

From a2cf7f394e52f0fae9e9fbf11d6ae348baaf2613 Mon Sep 17 00:00:00 2001
From: DX37 <asusx2@mail.ru>
Date: Thu, 2 Sep 2021 01:37:01 +0700
Subject: [PATCH 10/48] Add Russian translation

---
 src/languages/ru-RU.js | 110 +++++++++++++++++++++++++++++++++++++++++
 src/main.js            |   2 +
 2 files changed, 112 insertions(+)
 create mode 100644 src/languages/ru-RU.js

diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
new file mode 100644
index 0000000..c9de686
--- /dev/null
+++ b/src/languages/ru-RU.js
@@ -0,0 +1,110 @@
+export default {
+    languageName: "Русский",
+    checkEverySecond: "Проверять каждые {0} секунд.",
+    "Avg.": "Средн. ",
+    retriesDescription: "Максимальное количество попыток перед пометкой сервиса как недоступного и отправкой уведомления",
+    ignoreTLSError: "Игнорировать ошибку TLS/SSL для HTTPS сайтов",
+    upsideDownModeDescription: "Реверс статуса сервиса. Если сервис доступен, то он помечается как НЕДОСТУПНЫЙ.",
+    maxRedirectDescription: "Максимальное количество перенаправлений. Поставьте 0, чтобы отключить перенаправления.",
+    acceptedStatusCodesDescription: "Выберите коды статусов, которые должны считаться за успешный ответ.",
+    passwordNotMatchMsg: "Повтор пароля не совпадает.",
+    notificationDescription: "Привяжите уведомления к мониторам.",
+    keywordDescription: "Поиск слова в чистом HTML или в JSON-ответе (чувствительно к регистру)",
+    pauseDashboardHome: "Пауза",
+    deleteMonitorMsg: "Вы действительно хотите удалить данный монитор?",
+    deleteNotificationMsg: "Вы действительно хотите удалить это уведомление для всех мониторов?",
+    resoverserverDescription: "Cloudflare является сервером по умолчанию. Вы всегда можете сменить данный сервер.",
+    rrtypeDescription: "Выберите тип ресурсной записи, который вы хотите отслеживать",
+    pauseMonitorMsg: "Вы действительно хотите поставить на паузу?",
+    Settings: "Настройки",
+    Dashboard: "Панель",
+    "New Update": "Обновление",
+    Language: "Язык",
+    Appearance: "Внешний вид",
+    Theme: "Тема",
+    General: "Общее",
+    Version: "Версия",
+    "Check Update On GitHub": "Проверить обновления на GitHub",
+    List: "Список",
+    Add: "Добавить",
+    "Add New Monitor": "Новый монитор",
+    "Quick Stats": "Статистика",
+    Up: "Доступно",
+    Down: "Недоступно",
+    Pending: "Ожидание",
+    Unknown: "Неизвестно",
+    Pause: "Пауза",
+    Name: "Имя",
+    Status: "Статус",
+    DateTime: "Дата и время",
+    Message: "Сообщение",
+    "No important events": "Важных событий нет",
+    Resume: "Возобновить",
+    Edit: "Изменить",
+    Delete: "Удалить",
+    Current: "Текущий",
+    Uptime: "Аптайм",
+    "Cert Exp.": "Сертификат просрочен",
+    days: "дней",
+    day: "день",
+    "-day": " дней",
+    hour: "час",
+    "-hour": " часа",
+    Response: "Ответ",
+    Ping: "Пинг",
+    "Monitor Type": "Тип монитора",
+    Keyword: "Слово",
+    "Friendly Name": "Имя",
+    URL: "URL",
+    Hostname: "Имя хоста",
+    Port: "Порт",
+    "Heartbeat Interval": "Частота опроса",
+    Retries: "Попыток",
+    Advanced: "Дополнительно",
+    "Upside Down Mode": "Режим реверса статуса",
+    "Max. Redirects": "Макс. перенаправлений",
+    "Accepted Status Codes": "Допустимые коды статуса",
+    Save: "Сохранить",
+    Notifications: "Уведомления",
+    "Not available, please setup.": "Доступных уведомлений нет, необходима настройка.",
+    "Setup Notification": "Настроить уведомления",
+    Light: "Светлая",
+    Dark: "Тёмная",
+    Auto: "Авто",
+    "Theme - Heartbeat Bar": "Тема - Полоса частоты опроса",
+    Normal: "Обычный",
+    Bottom: "Снизу",
+    None: "Отсутствует",
+    Timezone: "Часовой пояс",
+    "Search Engine Visibility": "Видимость поисковым движком",
+    "Allow indexing": "Разрешить индексирование",
+    "Discourage search engines from indexing site": "Не позволять индексировать сайт",
+    "Change Password": "Сменить пароль",
+    "Current Password": "Текущий пароль",
+    "New Password": "Новый пароль",
+    "Repeat New Password": "Повтор нового пароля",
+    "Update Password": "Обновить пароль",
+    "Disable Auth": "Отключить авторизацию",
+    "Enable Auth": "Включить авторизацию",
+    Logout: "Выйти",
+    Leave: "Отмена",
+    "I understand, please disable": "Я понимаю, всё равно отключить",
+    Confirm: "Подтвердить",
+    Yes: "Да",
+    No: "Нет",
+    Username: "Логин",
+    Password: "Пароль",
+    "Remember me": "Запомнить меня",
+    Login: "Вход в систему",
+    "No Monitors, please": "Мониторов нет, пожалуйста",
+    "add one": "создайте новый",
+    "Notification Type": "Тип уведомления",
+    Email: "Почта",
+    Test: "Проверка",
+    "Certificate Info": "Информация о сертификате",
+    "Resolver Server": "DNS сервер",
+    "Resource Record Type": "Тип ресурсной записи",
+    "Last Result": "Последний результат",
+    "Create your admin account": "Создайте аккаунт администратора",
+    "Repeat Password": "Повторите пароль"
+}
diff --git a/src/main.js b/src/main.js
index 435caf2..fe35d38 100644
--- a/src/main.js
+++ b/src/main.js
@@ -31,6 +31,7 @@ import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
 import svSE from "./languages/sv-SE";
 import koKR from "./languages/ko-KR";
+import ruRU from "./languages/ru-RU";
 
 const routes = [
     {
@@ -102,6 +103,7 @@ const languageList = {
     "da-DK": daDK,
     "sv-SE": svSE,
     "ko-KR": koKR,
+    "ru-RU": ruRU,
 };
 
 const i18n = createI18n({

From e7929f461d878af218d70c86bfbe694b84ee450f Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <adam.stachowicz@fingo.info>
Date: Wed, 1 Sep 2021 20:53:12 +0200
Subject: [PATCH 11/48] Update dependencies

---
 package.json | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/package.json b/package.json
index f279351..23b8e6d 100644
--- a/package.json
+++ b/package.json
@@ -54,19 +54,19 @@
         "express": "^4.17.1",
         "express-basic-auth": "^1.2.0",
         "form-data": "^4.0.0",
-        "http-graceful-shutdown": "^3.1.3",
+        "http-graceful-shutdown": "^3.1.4",
         "jsonwebtoken": "^8.5.1",
         "nodemailer": "^6.6.3",
         "password-hash": "^1.2.2",
         "prom-client": "^13.2.0",
         "prometheus-api-metrics": "^3.2.0",
         "redbean-node": "0.1.2",
-        "socket.io": "^4.1.3",
-        "socket.io-client": "^4.1.3",
+        "socket.io": "^4.2.0",
+        "socket.io-client": "^4.2.0",
         "sqlite3": "github:mapbox/node-sqlite3#593c9d",
         "tcp-ping": "^0.1.1",
         "v-pagination-3": "^0.1.6",
-        "vue": "^3.2.2",
+        "vue": "^3.2.6",
         "vue-chart-3": "^0.5.7",
         "vue-confirm-dialog": "^1.0.2",
         "vue-i18n": "^9.1.7",
@@ -76,18 +76,18 @@
     },
     "devDependencies": {
         "@babel/eslint-parser": "^7.15.0",
-        "@types/bootstrap": "^5.1.1",
-        "@vitejs/plugin-legacy": "^1.5.1",
-        "@vitejs/plugin-vue": "^1.4.0",
-        "@vue/compiler-sfc": "^3.2.2",
-        "core-js": "^3.16.1",
+        "@types/bootstrap": "^5.1.2",
+        "@vitejs/plugin-legacy": "^1.5.2",
+        "@vitejs/plugin-vue": "^1.6.0",
+        "@vue/compiler-sfc": "^3.2.6",
+        "core-js": "^3.17.0",
         "dns2": "^2.0.1",
         "eslint": "^7.32.0",
-        "eslint-plugin-vue": "^7.16.0",
-        "sass": "^1.37.5",
+        "eslint-plugin-vue": "^7.17.0",
+        "sass": "^1.38.2",
         "stylelint": "^13.13.1",
         "stylelint-config-standard": "^22.0.0",
-        "typescript": "^4.3.5",
-        "vite": "^2.4.4"
+        "typescript": "^4.4.2",
+        "vite": "^2.5.3"
     }
 }

From 7a109689d96a4ffdeee99776a0c44671e88be4f7 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <adam.stachowicz@fingo.info>
Date: Wed, 1 Sep 2021 21:17:50 +0200
Subject: [PATCH 12/48] Make `Resp. Time (ms)` and `N/A` i18n

---
 src/components/PingChart.vue | 2 +-
 src/components/Uptime.vue    | 2 +-
 src/languages/en.js          | 4 +++-
 src/pages/Details.vue        | 4 ++--
 4 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/components/PingChart.vue b/src/components/PingChart.vue
index 8f53ea7..0baa988 100644
--- a/src/components/PingChart.vue
+++ b/src/components/PingChart.vue
@@ -85,7 +85,7 @@ export default {
                     y: {
                         title: {
                             display: true,
-                            text: "Resp. Time (ms)",
+                            text: this.$t("respTime"),
                         },
                         offset: false,
                         grid: {
diff --git a/src/components/Uptime.vue b/src/components/Uptime.vue
index b1f3a01..a4bf22f 100644
--- a/src/components/Uptime.vue
+++ b/src/components/Uptime.vue
@@ -22,7 +22,7 @@ export default {
                 return Math.round(this.$root.uptimeList[key] * 10000) / 100 + "%";
             }
 
-            return "N/A"
+            return this.$t("notAvailableShort")
         },
 
         color() {
diff --git a/src/languages/en.js b/src/languages/en.js
index 2781ba8..f0e4ae9 100644
--- a/src/languages/en.js
+++ b/src/languages/en.js
@@ -106,5 +106,7 @@ export default {
     "Resource Record Type": "Resource Record Type",
     "Last Result": "Last Result",
     "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password"
+    "Repeat Password": "Repeat Password",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/pages/Details.vue b/src/pages/Details.vue
index 44cac81..badcc68 100644
--- a/src/pages/Details.vue
+++ b/src/pages/Details.vue
@@ -238,7 +238,7 @@ export default {
                 return this.lastHeartBeat.ping;
             }
 
-            return "N/A"
+            return this.$t("notAvailableShort")
         },
 
         avgPing() {
@@ -246,7 +246,7 @@ export default {
                 return this.$root.avgPingList[this.monitor.id];
             }
 
-            return "N/A"
+            return this.$t("notAvailableShort")
         },
 
         importantHeartBeatList() {

From 9116654a33077da96a8de658ef0eeafbd073cf08 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 15:21:46 +0800
Subject: [PATCH 13/48] update language files and run eslint on these

---
 src/languages/da-DK.js |   4 +-
 src/languages/de-DE.js |   4 +-
 src/languages/fr.js    |   4 +-
 src/languages/ja.js    |   4 +-
 src/languages/ko-KR.js | 220 +++++++++++++++++++++--------------------
 src/languages/ru-RU.js |   4 +-
 src/languages/sv-SE.js |   4 +-
 src/languages/zh-HK.js |  10 +-
 8 files changed, 135 insertions(+), 119 deletions(-)

diff --git a/src/languages/da-DK.js b/src/languages/da-DK.js
index 245ba5b..713eecf 100644
--- a/src/languages/da-DK.js
+++ b/src/languages/da-DK.js
@@ -106,5 +106,7 @@ export default {
     pauseMonitorMsg: "Er du sikker på, at du vil pause Overvågeren?",
     "Create your admin account": "Opret din administratorkonto",
     "Repeat Password": "Gentag adgangskoden",
-    "Resource Record Type": "Resource Record Type"
+    "Resource Record Type": "Resource Record Type",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 7a8cb52..7febaad 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -106,5 +106,7 @@ export default {
     pauseMonitorMsg: "Bist du sicher das du den Monitor pausieren möchtest?",
     "Create your admin account": "Erstelle dein Admin Konto",
     "Repeat Password": "Wiederhole das Passwort",
-    "Resource Record Type": "Resource Record Type"
+    "Resource Record Type": "Resource Record Type",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/languages/fr.js b/src/languages/fr.js
index ac7aa8a..694f4d2 100644
--- a/src/languages/fr.js
+++ b/src/languages/fr.js
@@ -106,5 +106,7 @@ export default {
     pauseMonitorMsg: "Are you sure want to pause?",
     "Last Result": "Last Result",
     "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password"
+    "Repeat Password": "Repeat Password",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/languages/ja.js b/src/languages/ja.js
index e32e53d..23de640 100644
--- a/src/languages/ja.js
+++ b/src/languages/ja.js
@@ -106,5 +106,7 @@ export default {
     "Resource Record Type": "DNSレコード設定",
     "Last Result": "最終結果",
     "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password"
+    "Repeat Password": "Repeat Password",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index 91f8f9b..f913bbb 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -1,110 +1,112 @@
 export default {
-    languageName: '한국어',
-    checkEverySecond: '{0} 초마다 체크해요.',
-    'Avg.': '평균 ',
-    retriesDescription: '서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수',
-    ignoreTLSError: 'HTTPS 웹사이트에서 TLS/SSL 에러 무시하기',
-    upsideDownModeDescription: '서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.',
-    maxRedirectDescription: '최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.',
-    acceptedStatusCodesDescription: '응답 성공으로 간주할 상태 코드를 정해요.',
-    passwordNotMatchMsg: '비밀번호 재입력이 일치하지 않아요.',
-    notificationDescription: '모니터링에 알림을 설정할 수 있어요.',
-    keywordDescription: 'Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.',
-    pauseDashboardHome: '일시 정지',
-    deleteMonitorMsg: '정말 이 모니터링을 삭제할까요?',
-    deleteNotificationMsg: '정말 이 알림을 모든 모니터링에서 삭제할까요?',
-    resoverserverDescription: 'Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.',
-    rrtypeDescription: '모니터링할 RR-Type을 선택해요.',
-    pauseMonitorMsg: '정말 이 모니터링을 일시 정지 할까요?',
-    Settings: '설정',
-    Dashboard: '대시보드',
-    'New Update': '새로운 업데이트',
-    Language: '언어',
-    Appearance: '외형',
-    Theme: '테마',
-    General: '일반',
-    Version: '버전',
-    'Check Update On GitHub': '깃허브에서 업데이트 확인',
-    List: '목록',
-    Add: '추가',
-    'Add New Monitor': '새로운 모니터링 추가하기',
-    'Quick Stats': '간단한 정보',
-    Up: '온라인',
-    Down: '오프라인',
-    Pending: '대기 중',
-    Unknown: '알 수 없음',
-    Pause: '일시 정지',
-    Name: '이름',
-    Status: '상태',
-    DateTime: '날짜',
-    Message: '메시지',
-    'No important events': '중요 이벤트 없음',
-    Resume: '재개',
-    Edit: '수정',
-    Delete: '삭제',
-    Current: '현재',
-    Uptime: '업타임',
-    'Cert Exp.': '인증서 만료',
-    days: '일',
-    day: '일',
-    '-day': '-일',
-    hour: '시간',
-    '-hour': '-시간',
-    Response: '응답',
-    Ping: '핑',
-    'Monitor Type': '모니터링 종류',
-    Keyword: '키워드',
-    'Friendly Name': '이름',
-    URL: 'URL',
-    Hostname: '호스트네임',
-    Port: '포트',
-    'Heartbeat Interval': '하트비트 주기',
-    Retries: '재시도',
-    Advanced: '고급',
-    'Upside Down Mode': '상태 반전 모드',
-    'Max. Redirects': '최대 리다이렉트',
-    'Accepted Status Codes': '응답 성공 상태 코드',
-    Save: '저장',
-    Notifications: '알림',
-    'Not available, please setup.': '존재하지 않아요, 새로운거 하나 만드는건 어때요?',
-    'Setup Notification': '알림 설정',
-    Light: '라이트',
-    Dark: '다크',
-    Auto: '자동',
-    'Theme - Heartbeat Bar': '테마 - 하트비트 바',
-    Normal: '기본값',
-    Bottom: '가운데',
-    None: '제거',
-    Timezone: '시간대',
-    'Search Engine Visibility': '검색 엔진 활성화',
-    'Allow indexing': '인덱싱 허용',
-    'Discourage search engines from indexing site': '검색 엔진 인덱싱 거부',
-    'Change Password': '비밀번호 변경',
-    'Current Password': '기존 비밀번호',
-    'New Password': '새로운 비밀번호',
-    'Repeat New Password': '새로운 비밀번호 재입력',
-    'Update Password': '비밀번호 변경',
-    'Disable Auth': '인증 끄기',
-    'Enable Auth': '인증 켜기',
-    Logout: '로그아웃',
-    Leave: '나가기',
-    'I understand, please disable': '기능에 대해 이해했어요.',
-    Confirm: '확인',
-    Yes: '확인',
-    No: '취소',
-    Username: '이름',
-    Password: '비밀번호',
-    'Remember me': '비밀번호 기억하기',
-    Login: '로그인',
-    'No Monitors, please': '모니터링이 없어요,',
-    'add one': '하나 추가해봐요',
-    'Notification Type': '알림 종류',
-    Email: '이메일',
-    Test: '테스트',
-    'Certificate Info': '인증서 정보',
-    'Resolver Server': 'Resolver 서버',
-    'Resource Record Type': '자원 레코드 유형',
-    'Last Result': '최근 결과',
-    'Create your admin account': '관리자 계정 만들기',
-    'Repeat Password': '비밀번호 재입력'
-};
\ No newline at end of file
+    languageName: "한국어",
+    checkEverySecond: "{0} 초마다 체크해요.",
+    "Avg.": "평균 ",
+    retriesDescription: "서비스가 중단된 후 알림을 보내기 전 최대 재시도 횟수",
+    ignoreTLSError: "HTTPS 웹사이트에서 TLS/SSL 에러 무시하기",
+    upsideDownModeDescription: "서버 상태를 반대로 표시해요. 서버가 작동하면 오프라인으로 표시할 거에요.",
+    maxRedirectDescription: "최대 리다이렉트 횟수에요. 0을 입력하면 리다이렉트를 꺼요.",
+    acceptedStatusCodesDescription: "응답 성공으로 간주할 상태 코드를 정해요.",
+    passwordNotMatchMsg: "비밀번호 재입력이 일치하지 않아요.",
+    notificationDescription: "모니터링에 알림을 설정할 수 있어요.",
+    keywordDescription: "Html 이나 JSON에서 대소문자를 구분해 키워드를 검색해요.",
+    pauseDashboardHome: "일시 정지",
+    deleteMonitorMsg: "정말 이 모니터링을 삭제할까요?",
+    deleteNotificationMsg: "정말 이 알림을 모든 모니터링에서 삭제할까요?",
+    resoverserverDescription: "Cloudflare가 기본 서버에요, 원한다면 언제나 다른 resolver 서버로 변경할 수 있어요.",
+    rrtypeDescription: "모니터링할 RR-Type을 선택해요.",
+    pauseMonitorMsg: "정말 이 모니터링을 일시 정지 할까요?",
+    Settings: "설정",
+    Dashboard: "대시보드",
+    "New Update": "새로운 업데이트",
+    Language: "언어",
+    Appearance: "외형",
+    Theme: "테마",
+    General: "일반",
+    Version: "버전",
+    "Check Update On GitHub": "깃허브에서 업데이트 확인",
+    List: "목록",
+    Add: "추가",
+    "Add New Monitor": "새로운 모니터링 추가하기",
+    "Quick Stats": "간단한 정보",
+    Up: "온라인",
+    Down: "오프라인",
+    Pending: "대기 중",
+    Unknown: "알 수 없음",
+    Pause: "일시 정지",
+    Name: "이름",
+    Status: "상태",
+    DateTime: "날짜",
+    Message: "메시지",
+    "No important events": "중요 이벤트 없음",
+    Resume: "재개",
+    Edit: "수정",
+    Delete: "삭제",
+    Current: "현재",
+    Uptime: "업타임",
+    "Cert Exp.": "인증서 만료",
+    days: "일",
+    day: "일",
+    "-day": "-일",
+    hour: "시간",
+    "-hour": "-시간",
+    Response: "응답",
+    Ping: "핑",
+    "Monitor Type": "모니터링 종류",
+    Keyword: "키워드",
+    "Friendly Name": "이름",
+    URL: "URL",
+    Hostname: "호스트네임",
+    Port: "포트",
+    "Heartbeat Interval": "하트비트 주기",
+    Retries: "재시도",
+    Advanced: "고급",
+    "Upside Down Mode": "상태 반전 모드",
+    "Max. Redirects": "최대 리다이렉트",
+    "Accepted Status Codes": "응답 성공 상태 코드",
+    Save: "저장",
+    Notifications: "알림",
+    "Not available, please setup.": "존재하지 않아요, 새로운거 하나 만드는건 어때요?",
+    "Setup Notification": "알림 설정",
+    Light: "라이트",
+    Dark: "다크",
+    Auto: "자동",
+    "Theme - Heartbeat Bar": "테마 - 하트비트 바",
+    Normal: "기본값",
+    Bottom: "가운데",
+    None: "제거",
+    Timezone: "시간대",
+    "Search Engine Visibility": "검색 엔진 활성화",
+    "Allow indexing": "인덱싱 허용",
+    "Discourage search engines from indexing site": "검색 엔진 인덱싱 거부",
+    "Change Password": "비밀번호 변경",
+    "Current Password": "기존 비밀번호",
+    "New Password": "새로운 비밀번호",
+    "Repeat New Password": "새로운 비밀번호 재입력",
+    "Update Password": "비밀번호 변경",
+    "Disable Auth": "인증 끄기",
+    "Enable Auth": "인증 켜기",
+    Logout: "로그아웃",
+    Leave: "나가기",
+    "I understand, please disable": "기능에 대해 이해했어요.",
+    Confirm: "확인",
+    Yes: "확인",
+    No: "취소",
+    Username: "이름",
+    Password: "비밀번호",
+    "Remember me": "비밀번호 기억하기",
+    Login: "로그인",
+    "No Monitors, please": "모니터링이 없어요,",
+    "add one": "하나 추가해봐요",
+    "Notification Type": "알림 종류",
+    Email: "이메일",
+    Test: "테스트",
+    "Certificate Info": "인증서 정보",
+    "Resolver Server": "Resolver 서버",
+    "Resource Record Type": "자원 레코드 유형",
+    "Last Result": "최근 결과",
+    "Create your admin account": "관리자 계정 만들기",
+    "Repeat Password": "비밀번호 재입력",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
+}
diff --git a/src/languages/ru-RU.js b/src/languages/ru-RU.js
index c9de686..f42f9c2 100644
--- a/src/languages/ru-RU.js
+++ b/src/languages/ru-RU.js
@@ -106,5 +106,7 @@ export default {
     "Resource Record Type": "Тип ресурсной записи",
     "Last Result": "Последний результат",
     "Create your admin account": "Создайте аккаунт администратора",
-    "Repeat Password": "Повторите пароль"
+    "Repeat Password": "Повторите пароль",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/languages/sv-SE.js b/src/languages/sv-SE.js
index 068f5d5..5029688 100644
--- a/src/languages/sv-SE.js
+++ b/src/languages/sv-SE.js
@@ -106,5 +106,7 @@ export default {
     "Resource Record Type": "RR-typ",
     "Last Result": "Senaste resultat",
     "Create your admin account": "Skapa ditt administratörskonto",
-    "Repeat Password": "Upprepa Lösenord"
+    "Repeat Password": "Upprepa Lösenord",
+    respTime: "Resp. Time (ms)",
+    notAvailableShort: "N/A"
 }
diff --git a/src/languages/zh-HK.js b/src/languages/zh-HK.js
index 12ebb79..4bcc502 100644
--- a/src/languages/zh-HK.js
+++ b/src/languages/zh-HK.js
@@ -103,8 +103,10 @@ export default {
     "Resource Record Type": "DNS 記錄類型",
     resoverserverDescription: "預設值為 Cloudflare DNS 伺服器,你可以轉用其他 DNS 伺服器。",
     rrtypeDescription: "請選擇 DNS 記錄類型",
-    pauseMonitorMsg: "Are you sure want to pause?",
-    "Last Result": "Last Result",
-    "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password"
+    pauseMonitorMsg: "是否確定暫停?",
+    "Last Result": "最後結果",
+    "Create your admin account": "製作你的管理員帳號",
+    "Repeat Password": "重複密碼",
+    respTime: "反應時間 (ms)",
+    notAvailableShort: "N/A"
 }

From a0f372e946adb196d38d1246f2f5bbeceb7455ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?= <jinqilin721@163.com>
Date: Thu, 2 Sep 2021 15:34:46 +0800
Subject: [PATCH 14/48] Chinese Translation (from zh-CN.js)

---
 src/languages/zh-CN.js | 112 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)
 create mode 100644 src/languages/zh-CN.js

diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
new file mode 100644
index 0000000..b67f1d5
--- /dev/null
+++ b/src/languages/zh-CN.js
@@ -0,0 +1,112 @@
+export default {
+    languageName: "简体中文",
+    checkEverySecond: "检测频率 {0} 秒",
+    "Avg.": "平均 ",
+    retriesDescription: "最大重试次数",
+    ignoreTLSError: "忽略HTTPS站点的证书错误",
+    upsideDownModeDescription: "反向状态监控",
+    maxRedirectDescription: "最大重定向次数,设置为 0 禁止重定向",
+    acceptedStatusCodesDescription: "选择被视为成功响应的状态码",
+    passwordNotMatchMsg: "两次密码输入不一致",
+    notificationDescription: "请先设置一个消息通知",
+    keywordDescription: "检测响应内容中的关键字,区分大小写",
+    pauseDashboardHome: "Pause",
+    deleteMonitorMsg: "确定要删除此监控吗?",
+    deleteNotificationMsg: "确定要删除此消息通知吗?这将对所有监控生效。",
+    resoverserverDescription: "默认服务器 Cloudflare,可以修改为任意你想要使用的DNS服务器",
+    rrtypeDescription: "选择您要监控的资源记录类型",
+    pauseMonitorMsg: "确定要暂停吗?",
+    Settings: "设置",
+    Dashboard: "仪表盘",
+    "New Update": "有新版本更新",
+    Language: "语言",
+    Appearance: "外观设置",
+    Theme: "主题",
+    General: "基本设置",
+    Version: "Version",
+    "Check Update On GitHub": "检查更新",
+    List: "列表",
+    Add: "添加",
+    "Add New Monitor": "添加新的监控",
+    "Quick Stats": "状态速览",
+    Up: "正常",
+    Down: "故障",
+    Pending: "检测失败",
+    Unknown: "未知",
+    Pause: "暂停",
+    Name: "名称",
+    Status: "状态",
+    DateTime: "时间",
+    Message: "事件",
+    "No important events": "暂无重要事件",
+    Resume: "恢复",
+    Edit: "修改",
+    Delete: "删除",
+    Current: "当前",
+    Uptime: "可用率",
+    "Cert Exp.": "证书过期",
+    days: "天",
+    day: "天",
+    "-day": " 天",
+    hour: "小时",
+    "-hour": " 小时",
+    Response: "响应",
+    Ping: "Ping",
+    "Monitor Type": "监控类型",
+    Keyword: "关键字",
+    "Friendly Name": "名称",
+    URL: "网址",
+    Hostname: "主机名",
+    Port: "端口号",
+    "Heartbeat Interval": "心跳间隔",
+    Retries: "重试次数",
+    Advanced: "高级选项",
+    "Upside Down Mode": "反向监控",
+    "Max. Redirects": "重定向次数",
+    "Accepted Status Codes": "有效状态码",
+    Save: "保存",
+    Notifications: "消息通知",
+    "Not available, please setup.": "不可用,请设置",
+    "Setup Notification": "设置通知",
+    Light: "明亮",
+    Dark: "黑暗",
+    Auto: "自动",
+    "Theme - Heartbeat Bar": "心跳状态显示",
+    Normal: "正常显示",
+    Bottom: "靠下显示",
+    None: "不显示",
+    Timezone: "时区",
+    "Search Engine Visibility": "搜索引擎设置",
+    "Allow indexing": "允许索引",
+    "Discourage search engines from indexing site": "阻止搜索引擎索引网站",
+    "Change Password": "修改密码",
+    "Current Password": "当前密码",
+    "New Password": "新密码",
+    "Repeat New Password": "重复新密码",
+    "Update Password": "更新密码",
+    "Disable Auth": "禁用身份验证",
+    "Enable Auth": "启用身份验证",
+    Logout: "退出",
+    Leave: "离开",
+    "I understand, please disable": "我已经了解,继续禁用",
+    Confirm: "确认",
+    Yes: "是的",
+    No: "不是",
+    Username: "用户名",
+    Password: "密码",
+    "Remember me": "请记住我",
+    Login: "登录",
+    "No Monitors, please": "没有监控,",
+    "add one": "添加一个",
+    "Notification Type": "消息类型",
+    Email: "邮件",
+    Test: "测试一下",
+    "Certificate Info": "证书信息",
+    "Resolver Server": "解析服务器",
+    "Resource Record Type": "资源记录类型",
+    "Last Result": "Last Result",
+    "Create your admin account": "创建管理员账号",
+    "Repeat Password": "重复密码",
+    respTime: "响应时间 (ms)",
+    notAvailableShort: "N/A"
+}

From 99725aabe74f088d9fe57e2b6a3d703fd3c07a24 Mon Sep 17 00:00:00 2001
From: Jelle Posthuma <jelle@beyonit.nl>
Date: Thu, 2 Sep 2021 11:10:54 +0200
Subject: [PATCH 15/48] Add Dutch/Nederlands language (nl_NL)

---
 src/languages/nl_NL.js | 112 +++++++++++++++++++++++++++++++++++++++++
 src/main.js            |   2 +
 2 files changed, 114 insertions(+)
 create mode 100644 src/languages/nl_NL.js

diff --git a/src/languages/nl_NL.js b/src/languages/nl_NL.js
new file mode 100644
index 0000000..b26c17e
--- /dev/null
+++ b/src/languages/nl_NL.js
@@ -0,0 +1,112 @@
+export default {
+    languageName: "Nederlands",
+    checkEverySecond: "Controleer elke {0} seconden.",
+    "Avg.": "Gem. ",
+    retriesDescription: "Maximum aantal nieuwe pogingen voordat de service wordt gemarkeerd als niet beschikbaar en er een melding wordt verzonden",
+    ignoreTLSError: "Negeer TLS/SSL-fout voor HTTPS-websites",
+    upsideDownModeDescription: "Draai de status om. Als de service bereikbaar is, is deze OFFLINE.",
+    maxRedirectDescription: "Maximaal aantal te volgen omleidingen. Stel in op 0 om omleidingen uit te schakelen.",
+    acceptedStatusCodesDescription: "Selecteer statuscodes die als een succesvol antwoord worden beschouwd.",
+    passwordNotMatchMsg: "Het herhaalwachtwoord komt niet overeen.",
+    notificationDescription: "Wijs a.u.b. een melding toe aan de monitor(s) om het te laten werken.",
+    keywordDescription: "Zoek trefwoord in gewone html of JSON-response en het is hoofdlettergevoelig",
+    pauseDashboardHome: "Gepauzeerd",
+    deleteMonitorMsg: "Weet u zeker dat u deze monitor wilt verwijderen?",
+    deleteNotificationMsg: "Weet u zeker dat u deze melding voor alle monitoren wilt verwijderen?",
+    resoverserverDescription: "Cloudflare is de standaardserver, u kunt de resolver server op elk moment wijzigen.",
+    rrtypeDescription: "Selecteer het RR-type dat u wilt monitoren",
+    pauseMonitorMsg: "Weet je zeker dat je wilt pauzeren?",
+    Settings: "Instellingen",
+    Dashboard: "Dashboard",
+    "New Update": "Nieuwe update",
+    Language: "Taal",
+    Appearance: "Weergave",
+    Theme: "Thema",
+    General: "Algemeen",
+    Version: "Versie",
+    "Check Update On GitHub": "Controleer update op GitHub",
+    List: "Lijst",
+    Add: "Toevoegen",
+    "Add New Monitor": "Nieuwe monitor toevoegen",
+    "Quick Stats": "Snelle statistieken",
+    Up: "Online",
+    Down: "Offline",
+    Pending: "In afwachting",
+    Unknown: "Onbekend",
+    Pause: "Pauze",
+    Name: "Naam",
+    Status: "Status",
+    DateTime: "Datum Tijd",
+    Message: "Bericht",
+    "No important events": "Geen belangrijke gebeurtenissen",
+    Resume: "Hervat",
+    Edit: "Wijzigen",
+    Delete: "Verwijderen",
+    Current: "Huidig",
+    Uptime: "Uptime",
+    "Cert Exp.": "Cert. verl.",
+    days: "dagen",
+    day: "dag",
+    "-day": "-dag",
+    hour: "uur",
+    "-hour": "-uur",
+    Response: "Antwoord",
+    Ping: "Ping",
+    "Monitor Type": "Monitortype:",
+    Keyword: "Trefwoord",
+    "Friendly Name": "Vriendelijke naam",
+    URL: "URL",
+    Hostname: "Hostnaam",
+    Port: "Poort",
+    "Heartbeat Interval": "Hartslaginterval",
+    Retries: "Pogingen",
+    Advanced: "Geavanceerd",
+    "Upside Down Mode": "Ondersteboven modus",
+    "Max. Redirects": "Max. Omleidingen",
+    "Accepted Status Codes": "Geaccepteerde statuscodes",
+    Save: "Opslaan",
+    Notifications: "Meldingen",
+    "Not available, please setup.": "Niet beschikbaar, stel a.u.b. in.",
+    "Setup Notification": "Melding instellen",
+    Light: "Licht",
+    Dark: "Donker",
+    Auto: "Auto",
+    "Theme - Heartbeat Bar": "Thema - Hartslagbalk",
+    Normal: "Normaal",
+    Bottom: "Onderkant",
+    None: "Geen",
+    Timezone: "Tijdzone",
+    "Search Engine Visibility": "Zichtbaarheid voor zoekmachines",
+    "Allow indexing": "Indexering toestaan",
+    "Discourage search engines from indexing site": "Ontmoedig zoekmachines om de site te indexeren",
+    "Change Password": "Verander wachtwoord",
+    "Current Password": "Huidig ​​wachtwoord",
+    "New Password": "Nieuw wachtwoord",
+    "Repeat New Password": "Herhaal nieuw wachtwoord",
+    "Update Password": "Vernieuw wachtwoord",
+    "Disable Auth": "Autorisatie uitschakelen",
+    "Enable Auth": "Autorisatie inschakelen",
+    Logout: "Uitloggen",
+    Leave: "Vertrekken",
+    "I understand, please disable": "Ik begrijp het, schakel a.u.b. uit",
+    Confirm: "Bevestigen",
+    Yes: "Ja",
+    No: "Nee",
+    Username: "Gebruikersnaam",
+    Password: "Wachtwoord",
+    "Remember me": "Wachtwoord onthouden",
+    Login: "Inloggen",
+    "No Monitors, please": "Geen monitoren, ",
+    "add one": "voeg een toe",
+    "Notification Type": "Melding type",
+    Email: "E-mail",
+    Test: "Testen",
+    "Certificate Info": "Certificaat informatie",
+    "Resolver Server": "Resolver Server",
+    "Resource Record Type": "Type bronrecord",
+    "Last Result": "Laatste resultaat",
+    "Create your admin account": "Maak uw beheerdersaccount aan",
+    "Repeat Password": "Herhaal wachtwoord",
+    respTime: "resp. tijd (ms)",
+    notAvailableShort: "N.v.t."
+}
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
index fe35d38..b20db3e 100644
--- a/src/main.js
+++ b/src/main.js
@@ -26,6 +26,7 @@ import { appName } from "./util.ts";
 import en from "./languages/en";
 import zhHK from "./languages/zh-HK";
 import deDE from "./languages/de-DE";
+import nlNL from "./languages/nl-NL";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
@@ -98,6 +99,7 @@ const languageList = {
     en,
     "zh-HK": zhHK,
     "de-DE": deDE,
+    "nl-NL": nlNL,
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,

From 941788db49bc1643f6b2e0cfa301da779abb483a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?= <jinqilin721@163.com>
Date: Thu, 2 Sep 2021 18:33:09 +0800
Subject: [PATCH 16/48] Chinese Translation (from zh-CN.js)

---
 src/main.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/main.js b/src/main.js
index fe35d38..fba4b91 100644
--- a/src/main.js
+++ b/src/main.js
@@ -32,6 +32,7 @@ import daDK from "./languages/da-DK";
 import svSE from "./languages/sv-SE";
 import koKR from "./languages/ko-KR";
 import ruRU from "./languages/ru-RU";
+import zhCN from "./languages/zh-CN";
 
 const routes = [
     {
@@ -104,6 +105,7 @@ const languageList = {
     "sv-SE": svSE,
     "ko-KR": koKR,
     "ru-RU": ruRU,
+    "zh-CN": zhCN,
 };
 
 const i18n = createI18n({

From b88b357b55022cc17b202529d4227d82bc91f23a Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 20:18:27 +0800
Subject: [PATCH 17/48] add support for https

---
 server/server.js | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/server/server.js b/server/server.js
index d4fe668..ecdd650 100644
--- a/server/server.js
+++ b/server/server.js
@@ -6,6 +6,7 @@ const { sleep, debug, TimeLogger, getRandomInt } = require("../src/util");
 console.log("Importing Node libraries")
 const fs = require("fs");
 const http = require("http");
+const https = require("https");
 
 console.log("Importing 3rd-party libraries")
 debug("Importing express");
@@ -45,9 +46,21 @@ console.info("Version: " + checkVersion.version);
 const hostname = process.env.HOST || args.host;
 const port = parseInt(process.env.PORT || args.port || 3001);
 
+// SSL
+const sslKey = process.env.SSL_KEY || args.ssl_key || undefined;
+const sslCert = process.env.SSL_CERT || args.ssl_cert || undefined;
+
 console.log("Creating express and socket.io instance")
 const app = express();
-const server = http.createServer(app);
+
+let server;
+
+if (sslKey && sslCert) {
+    https.createServer(app);
+} else {
+    http.createServer(app);
+}
+
 const io = new Server(server);
 app.use(express.json())
 

From c74986647ef4b262fde05c7076571efd7e5496e6 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 20:27:18 +0800
Subject: [PATCH 18/48] allow changing data dir

---
 server/database.js |  5 +++--
 server/server.js   | 10 ++++++++--
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/server/database.js b/server/database.js
index c0a53a9..f9414ad 100644
--- a/server/database.js
+++ b/server/database.js
@@ -5,7 +5,8 @@ const { setSetting, setting } = require("./util-server");
 class Database {
 
     static templatePath = "./db/kuma.db"
-    static path = "./data/kuma.db";
+    static dataDir = "./data/";
+    static path = this.dataDir + "kuma.db";
     static latestVersion = 8;
     static noReject = true;
     static sqliteInstance = null;
@@ -56,7 +57,7 @@ class Database {
             console.info("Database patch is needed")
 
             console.info("Backup the db")
-            const backupPath = "./data/kuma.db.bak" + version;
+            const backupPath = this.dataDir + "kuma.db.bak" + version;
             fs.copyFileSync(Database.path, backupPath);
 
             const shmPath = Database.path + "-shm";
diff --git a/server/server.js b/server/server.js
index ecdd650..a87f37c 100644
--- a/server/server.js
+++ b/server/server.js
@@ -50,15 +50,21 @@ const port = parseInt(process.env.PORT || args.port || 3001);
 const sslKey = process.env.SSL_KEY || args.ssl_key || undefined;
 const sslCert = process.env.SSL_CERT || args.ssl_cert || undefined;
 
+// Data Directory (must be end with "/")
+Database.dataDir = process.env.DATA_DIR || process.env.data_dir || "./data/";
+console.log(`Data Dir: ${Database.dataDir}`);
+
 console.log("Creating express and socket.io instance")
 const app = express();
 
 let server;
 
 if (sslKey && sslCert) {
-    https.createServer(app);
+    console.log("Server Type: HTTPS");
+    server = https.createServer(app);
 } else {
-    http.createServer(app);
+    console.log("Server Type: HTTP");
+    server = http.createServer(app);
 }
 
 const io = new Server(server);

From 3ee13bddd1e063d445fc34afb59d5665be3f417d Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 20:36:52 +0800
Subject: [PATCH 19/48] dash style for args

---
 server/server.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/server/server.js b/server/server.js
index a87f37c..7ca6ce0 100644
--- a/server/server.js
+++ b/server/server.js
@@ -47,11 +47,11 @@ const hostname = process.env.HOST || args.host;
 const port = parseInt(process.env.PORT || args.port || 3001);
 
 // SSL
-const sslKey = process.env.SSL_KEY || args.ssl_key || undefined;
-const sslCert = process.env.SSL_CERT || args.ssl_cert || undefined;
+const sslKey = process.env.SSL_KEY || args["ssl-key"] || undefined;
+const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
 
 // Data Directory (must be end with "/")
-Database.dataDir = process.env.DATA_DIR || process.env.data_dir || "./data/";
+Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
 console.log(`Data Dir: ${Database.dataDir}`);
 
 console.log("Creating express and socket.io instance")

From b604807cfe90c01ac8a0ca96c1e0892edc6c6997 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 20:42:55 +0800
Subject: [PATCH 20/48] create data dir if not exists

---
 server/database.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/server/database.js b/server/database.js
index f9414ad..6db61ea 100644
--- a/server/database.js
+++ b/server/database.js
@@ -12,6 +12,10 @@ class Database {
     static sqliteInstance = null;
 
     static async connect() {
+        if (! fs.existsSync(this.dataDir)) {
+            fs.mkdirSync(this.dataDir, { recursive: true });
+        }
+
         const acquireConnectionTimeout = 120 * 1000;
 
         R.setup("sqlite", {

From 6e3e2fc85c8a05426a95660c59276cc7a30b995c Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 21:08:00 +0800
Subject: [PATCH 21/48] fix db path

---
 server/database.js | 4 ++--
 server/server.js   | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/server/database.js b/server/database.js
index 6db61ea..c4e1bce 100644
--- a/server/database.js
+++ b/server/database.js
@@ -5,8 +5,8 @@ const { setSetting, setting } = require("./util-server");
 class Database {
 
     static templatePath = "./db/kuma.db"
-    static dataDir = "./data/";
-    static path = this.dataDir + "kuma.db";
+    static dataDir;
+    static path;
     static latestVersion = 8;
     static noReject = true;
     static sqliteInstance = null;
diff --git a/server/server.js b/server/server.js
index 7ca6ce0..3c0d281 100644
--- a/server/server.js
+++ b/server/server.js
@@ -52,6 +52,7 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
 
 // Data Directory (must be end with "/")
 Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
+Database.path = Database.dataDir + "kuma.db";
 console.log(`Data Dir: ${Database.dataDir}`);
 
 console.log("Creating express and socket.io instance")

From 582e14098d2aa74c96f309cdb22b192c14196be0 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 21:10:18 +0800
Subject: [PATCH 22/48] create data dir before copy

---
 server/database.js | 4 ----
 server/server.js   | 3 +++
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/server/database.js b/server/database.js
index c4e1bce..77c4da7 100644
--- a/server/database.js
+++ b/server/database.js
@@ -12,10 +12,6 @@ class Database {
     static sqliteInstance = null;
 
     static async connect() {
-        if (! fs.existsSync(this.dataDir)) {
-            fs.mkdirSync(this.dataDir, { recursive: true });
-        }
-
         const acquireConnectionTimeout = 120 * 1000;
 
         R.setup("sqlite", {
diff --git a/server/server.js b/server/server.js
index 3c0d281..42a1767 100644
--- a/server/server.js
+++ b/server/server.js
@@ -53,6 +53,9 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
 // Data Directory (must be end with "/")
 Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
 Database.path = Database.dataDir + "kuma.db";
+if (! fs.existsSync(this.dataDir)) {
+    fs.mkdirSync(this.dataDir, { recursive: true });
+}
 console.log(`Data Dir: ${Database.dataDir}`);
 
 console.log("Creating express and socket.io instance")

From b30b1d3a5201c2a8977c30833fb3080844cbcc6e Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 21:11:20 +0800
Subject: [PATCH 23/48] create data dir before copy

---
 server/server.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/server.js b/server/server.js
index 42a1767..eb3e508 100644
--- a/server/server.js
+++ b/server/server.js
@@ -53,8 +53,8 @@ const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
 // Data Directory (must be end with "/")
 Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
 Database.path = Database.dataDir + "kuma.db";
-if (! fs.existsSync(this.dataDir)) {
-    fs.mkdirSync(this.dataDir, { recursive: true });
+if (! fs.existsSync(Database.dataDir)) {
+    fs.mkdirSync(Database.dataDir, { recursive: true });
 }
 console.log(`Data Dir: ${Database.dataDir}`);
 

From 51cf2ff6f95aa0a87eb931675a43f6ebd55c3989 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 21:13:59 +0800
Subject: [PATCH 24/48] add missing cert parameters

---
 server/server.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/server/server.js b/server/server.js
index eb3e508..a195c6d 100644
--- a/server/server.js
+++ b/server/server.js
@@ -65,7 +65,10 @@ let server;
 
 if (sslKey && sslCert) {
     console.log("Server Type: HTTPS");
-    server = https.createServer(app);
+    server = https.createServer({
+        key: sslKey,
+        cert: sslCert
+    }, app);
 } else {
     console.log("Server Type: HTTP");
     server = http.createServer(app);

From f23ecef636c9f8c5c62b51d63d889e1c59b4b91e Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 21:16:04 +0800
Subject: [PATCH 25/48] add missing cert parameters

---
 server/server.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/server.js b/server/server.js
index a195c6d..39191de 100644
--- a/server/server.js
+++ b/server/server.js
@@ -66,8 +66,8 @@ let server;
 if (sslKey && sslCert) {
     console.log("Server Type: HTTPS");
     server = https.createServer({
-        key: sslKey,
-        cert: sslCert
+        key: fs.readFileSync(sslKey),
+        cert: fs.readFileSync(sslCert)
     }, app);
 } else {
     console.log("Server Type: HTTP");

From d2bf2a551d00fc88f3ddcc4812e0419432d0537a Mon Sep 17 00:00:00 2001
From: "Victor M. Vicente Cuevas" <victor.vicente@areaf5.es>
Date: Thu, 2 Sep 2021 16:23:07 +0200
Subject: [PATCH 26/48] Add spanish language and update Readme

---
 src/languages/README.md |   3 +-
 src/languages/es-ES.js  | 112 ++++++++++++++++++++++++++++++++++++++++
 src/pages/Settings.vue  |   6 +++
 3 files changed, 120 insertions(+), 1 deletion(-)
 create mode 100644 src/languages/es-ES.js

diff --git a/src/languages/README.md b/src/languages/README.md
index 1deeacd..afc14d3 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -4,7 +4,8 @@
 2. Create a language file. (e.g. `zh-TW.js`) The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
 3. `npm run update-language-files --base-lang=de-DE`
 6. Your language file should be filled in. You can translate now.
-7. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
+7. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`)
+8. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
 
 If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
 
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
new file mode 100644
index 0000000..7342857
--- /dev/null
+++ b/src/languages/es-ES.js
@@ -0,0 +1,112 @@
+export default {
+    languageName: "Español",
+    checkEverySecond: "Comprobar cada {0} segundos.",
+    "Avg.": "Media. ",
+    retriesDescription: "Número máximo de intentos antes de que el servicio se marque como CAÍDO y una notificación sea enviada.",
+    ignoreTLSError: "Ignorar error TLS/SSL para sitios web HTTPS",
+    upsideDownModeDescription: "Invertir el estado. Si el servicio es alcanzable, está CAÍDO.",
+    maxRedirectDescription: "Número máximo de direcciones a seguir. Establecer a 0 para deshabilitar.",
+    acceptedStatusCodesDescription: "Seleccionar los códigos de estado que se consideran como respuesta exitosa.",
+    passwordNotMatchMsg: "La contraseña repetida no coincide.",
+    notificationDescription: "Por favor asigne una notificación a el/los monitor(es) para hacerlos funcional(es).",
+    keywordDescription: "Palabra clave en HTML plano o respuesta JSON y es sensible a mayúsculas",
+    pauseDashboardHome: "Pausar",
+    deleteMonitorMsg: "¿Seguro que quieres eliminar este monitor?",
+    deleteNotificationMsg: "¿Seguro que quieres eliminar esta notificación para todos los monitores?",
+    resoverserverDescription: "Cloudflare es el servidor por defecto, puedes cambiar el servidor de resolución en cualquier momento.",
+    rrtypeDescription: "Selecciona el tipo de registro que quieres monitorizar",
+    pauseMonitorMsg: "¿Seguro que quieres pausar?",
+    Settings: "Ajustes",
+    Dashboard: "Panel",
+    "New Update": "Vueva actualización",
+    Language: "Idioma",
+    Appearance: "Apariencia",
+    Theme: "Tema",
+    General: "General",
+    Version: "Versión",
+    "Check Update On GitHub": "Comprobar actualizaciones en GitHub",
+    List: "Lista",
+    Add: "Añadir",
+    "Add New Monitor": "Añadir nuevo monitor",
+    "Quick Stats": "Estadísticas rápidas",
+    Up: "Funcional",
+    Down: "Caído",
+    Pending: "Pendiente",
+    Unknown: "Desconociso",
+    Pause: "Pausa",
+    Name: "Nombre",
+    Status: "Estado",
+    DateTime: "Fecha y Hora",
+    Message: "Mensaje",
+    "No important events": "No hay eventos importantes",
+    Resume: "Reanudar",
+    Edit: "Editar",
+    Delete: "Eliminar",
+    Current: "Actual",
+    Uptime: "Tiempo activo",
+    "Cert Exp.": "Caducidad cert.",
+    days: "días",
+    day: "día",
+    "-day": "-día",
+    hour: "hora",
+    "-hour": "-hora",
+    Response: "Respuesta",
+    Ping: "Ping",
+    "Monitor Type": "Tipo de Monitor",
+    Keyword: "Palabra clave",
+    "Friendly Name": "Nombre sencillo",
+    URL: "URL",
+    Hostname: "Nombre del host",
+    Port: "Puerto",
+    "Heartbeat Interval": "Intervalo de latido",
+    Retries: "Reintentos",
+    Advanced: "Avanzado",
+    "Upside Down Mode": "Modo invertido",
+    "Max. Redirects": "Máx. redirecciones",
+    "Accepted Status Codes": "Códigos de estado aceptados",
+    Save: "Guardar",
+    Notifications: "Notificaciones",
+    "Not available, please setup.": "No disponible, por favor configurar.",
+    "Setup Notification": "Configurar notificación",
+    Light: "Claro",
+    Dark: "Oscuro",
+    Auto: "Auto",
+    "Theme - Heartbeat Bar": "Tema - Barra de intervalo de latido",
+    Normal: "Normal",
+    Bottom: "Abajo",
+    None: "Ninguno",
+    Timezone: "Zona horaria",
+    "Search Engine Visibility": "Visibilidad motor de búsqueda",
+    "Allow indexing": "Permitir indexación",
+    "Discourage search engines from indexing site": "Disuadir a los motores de búsqueda de indexar el sitio",
+    "Change Password": "Cambiar contraseña",
+    "Current Password": "Contraseña actual",
+    "New Password": "Nueva contraseña",
+    "Repeat New Password": "Repetir nueva contraseña",
+    "Update Password": "Actualizar contraseña",
+    "Disable Auth": "deshabilitar Autenticación ",
+    "Enable Auth": "Habilitar Autenticación ",
+    Logout: "Cerrar sesión",
+    Leave: "Salir",
+    "I understand, please disable": "Lo comprendo, por favor deshabilitar",
+    Confirm: "Confirmar",
+    Yes: "Sí",
+    No: "No",
+    Username: "Usuario",
+    Password: "Contraseña",
+    "Remember me": "Recordarme",
+    Login: "Acceso",
+    "No Monitors, please": "Sin monitores, por favor",
+    "add one": "añade uno",
+    "Notification Type": "Tipo de notificación",
+    Email: "Email",
+    Test: "Test",
+    "Certificate Info": "Información del certificado ",
+    "Resolver Server": "Servidor de resolución",
+    "Resource Record Type": "Tipo de Registro",
+    "Last Result": "Último resultado",
+    "Create your admin account": "Crea tu cuenta de administrador",
+    "Repeat Password": "Repetir contraseña",
+    respTime: "Tiempo de resp. (ms)",
+    notAvailableShort: "N/A"
+}
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index d71ec10..85ca006 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -172,6 +172,12 @@
                     <p>Please use it carefully.</p>
                 </template>
 
+                <template v-if="$i18n.locale === 'es-ES' ">
+                    <p>Seguro que deseas <strong>deshabilitar la autenticación</strong>?</p>
+                    <p>Es para <strong>quien implementa autenticación de terceros</strong> ante Uptime Kuma como por ejemplo Cloudflare Access.</p>
+                    <p>Por favor usar con cuidado.</p>
+                </template>
+
                 <template v-if="$i18n.locale === 'zh-HK' ">
                     <p>你是否確認<strong>取消登入認証</strong>?</p>
                     <p>這個功能是設計給已有<strong>第三方認証</strong>的用家,例如 Cloudflare Access。</p>

From 23f1a73fc8dd30eadf7358a8ebdc0566e45ba14b Mon Sep 17 00:00:00 2001
From: "Victor M. Vicente Cuevas" <victor.vicente@areaf5.es>
Date: Thu, 2 Sep 2021 16:31:45 +0200
Subject: [PATCH 27/48] Add language to src/main and update README

---
 src/languages/README.md | 5 +++--
 src/languages/es-ES.js  | 2 +-
 src/main.js             | 2 ++
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/languages/README.md b/src/languages/README.md
index afc14d3..9ba99ad 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -4,8 +4,9 @@
 2. Create a language file. (e.g. `zh-TW.js`) The filename must be ISO language code: http://www.lingoes.net/en/translator/langcode.htm
 3. `npm run update-language-files --base-lang=de-DE`
 6. Your language file should be filled in. You can translate now.
-7. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`)
-8. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
+7. Translate `src/pages/Settings.vue` (search for a `Confirm` component with `rel="confirmDisableAuth"`).
+8. Import your language file in `src/main.js` and add it to `languageList` constant.
+9. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
 
 If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
 
diff --git a/src/languages/es-ES.js b/src/languages/es-ES.js
index 7342857..96ce923 100644
--- a/src/languages/es-ES.js
+++ b/src/languages/es-ES.js
@@ -84,7 +84,7 @@ export default {
     "New Password": "Nueva contraseña",
     "Repeat New Password": "Repetir nueva contraseña",
     "Update Password": "Actualizar contraseña",
-    "Disable Auth": "deshabilitar Autenticación ",
+    "Disable Auth": "Deshabilitar Autenticación ",
     "Enable Auth": "Habilitar Autenticación ",
     Logout: "Cerrar sesión",
     Leave: "Salir",
diff --git a/src/main.js b/src/main.js
index fba4b91..3b00f24 100644
--- a/src/main.js
+++ b/src/main.js
@@ -26,6 +26,7 @@ import { appName } from "./util.ts";
 import en from "./languages/en";
 import zhHK from "./languages/zh-HK";
 import deDE from "./languages/de-DE";
+import esEs from "./languages/es-ES";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
@@ -99,6 +100,7 @@ const languageList = {
     en,
     "zh-HK": zhHK,
     "de-DE": deDE,
+    "es-ES": esEs,
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,

From b1647a310eede09952bba9cb4fb7adb4558711df Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 22:37:51 +0800
Subject: [PATCH 28/48] add demo db

---
 db/demo_kuma.db  | Bin 0 -> 65536 bytes
 package.json     |   2 --
 server/server.js |   8 ++++++++
 3 files changed, 8 insertions(+), 2 deletions(-)
 create mode 100644 db/demo_kuma.db

diff --git a/db/demo_kuma.db b/db/demo_kuma.db
new file mode 100644
index 0000000000000000000000000000000000000000..2042fcf2fefebb30173033c355b54244dfdb373f
GIT binary patch
literal 65536
zcmeI*&u`n-0S9o>v?Wui&0?u1blw(LNoQ-dY>JL-i^G7)GM%`wWyhAgB!(c+B5gB~
zD4C?}xJ3sz={jK8fZd1w0XywB6#Waf+fKtyyKaY_)&jj0=-#79n)HulDV84#zKm>B
z<m2OepZ9~0A|r0xUN&7r+-ch_%@wDa*O|UP<|m@aFh46Z40+r8Vaeam$WK4{2`0Mi
z2@{E9^44#L5??dJ+zc~(Fnn!@8~Qv|OnuHTB)>?0l3YquU#oI6$$oa`2~oXNs}o-j
zd_SGdvcIgm+IG`uwJp<a+jV`n?zTGdcSGfMwNzEbYH5C1731r~@f2_B;!>rm-cZ*?
ztL=(bx7idsw%O9`Bk_T8Bx+r^ZCVZ6Xc?9}k>V|_Wr**U*2_0b>*M)?lqJiwhHD-e
z;{59BvRbN$y0N2mo35A-V<cg^j$zj$JF|@)!#1pj;fQpV*tW!ON7qPQXlPDD(+#>r
zH=2fPq<F`0Q#?=8Mq=Vk%Qfr+tr;df*r6;%_sDncrdU<)ROvSEQRgJtvX^T9&@gxR
z+;d`)B)Z97+i_#Ll?w%$TfWn_!>#Chf<w}+*S*v)5bWyGiW(}62TR7stoGqpHXBPL
zAwF!|dMFy~qoqBx4c9gaPf$FS)v8$8TwWFz)Q?BsOr}Ri*<TGs%ik~Dc!_8Hr5P0V
z|7l?_mNu8GqE{u&U8`*yb+_r9X>6yee#bF&qpr6Pt^XKO^e3;n>85Qo+>;6yG^>0x
z?qCb8(J(r+);q4|cAZ9BH=O!?hcsH+<igrNwv~}3DJK_;nc7%b^HUR|ZaH<^aN5lS
zlAmbfByB9Vl5`FSq<;vy9It_R0h*fQ(kN(G6J47<9v@1kO9l3L*R*uwVbJH1?#<jW
z8=7mjt@?#)hW-9>sj{Hn5w|YhxHgnpt(+gAHa?URPga?FZ9?>x#FL=cvX?T<z-ak9
z3EG%@Y4ZC?f4_-XYJxtLAp7gZaerBM{Zb-*<qF&NGG?}DAEjCDo}t<9HtC*Ti$$~*
z2B?WN6JfC0cw|*}GnGicb%i~OVVQau`cgd7z>4JeOstW0*+(mUGF>RJAN@Gmd)1>j
zLGb9Zl)ty$k?h=(@!@F#f?jiNeQBk%epkGu-W7u$)Gv)-C(+<R5OG~yRM*u?S=|T=
zlH!muqj_6UmsN65EtfXRr3IBP*<7Rje6Zw#@(xpV?rx%)eTsc$kL|%^`t7&b$77yn
zG@9r<ANPx{dV*VNv%0!eA)BwL6><#nk3&Ho$$+31Yk>ZWM%&skch6nb8!*(ut|^F;
zxb}LxydQ^OyHAQU2$?;eO?ZdEN2-@;GD2`oYuEpijAzwf`ZT%p_fHPbkqk&uHq5=a
zSy{Thsruo_XrvoeAR+xVv~P<>k<I3kiF9d{WxQ79>^I5yx856Nk<O~_r?sB<X9kDA
z%gVHS_{HUDYw_!D&_Bf6#M5Ln%#fd6I^sD=uQ$N!^<Ce*%%V++7U<c!y`lO;n~NG!
zFyuR15yC1XONloV-YETe;#<jdF2_E)6cwXKP142gw1Z|Jycc4X<@DN9!=|AAiP3%~
z);`FHFo+{E+zqxPYiSxzj+CkFaf?f)M@HDkz3z|-(VzZUvbK6~-ccmlUtO4t)8$IH
zkC!byl7^w;)w!cN4jq=BRD|AP*W3MnT@hTfWxU_EPF1JuSbrk@qmhg1KTT&nPk#@P
z!W^Upy4IISzw-`zx7W~n4aPC{yWZJD{4Ezl^BY$XcAVyag1pN<PO?dQwETI^i!(f+
zg)@Dzc%sM0Z(ahCV{UM!6x52a5=(w7JgGtF)c9z7@&lf2QcpTG^@eRVabu;lyi5+3
zVND29;E=A{JA3Lie_EI|F*uhw9lAsM-Y}(p40_l0##-U>aHEs#W`{`ma>B=q@K@pY
z<PRnYKmY;|fB*y_009U<00Izz00f?yz!=9fgFOGe={}ZRtr2tL>MdE4^Es)QlVmY}
zU6E&%yv+XYjj_Hb1)Na|GV^QU2Q1I<UW|hm#5ki&&$2ms{y!jm#t45Gz7YN<{E5tB
zf&c^{009U<00Izz00bZa0SG|gr4blPaaY*zh6(O6&*j1!UxHg}l7rlccjxydjvHnD
zJDU1aNp3U<O3(jU;SUUXVS)ezAOHafKmY;|fB*y_009U<;H46{$tIcf@c_?gddsw~
z$=bENbS?kBWA4AZH@m3a*lldyXurGvaB;bNZ>_V^aMp@9T=HK!maW;!ZM(HoxnH^K
z%ysr;Ek*Lh3STnhg$V)>fB*y_009U<00Izz00bZafmcglkW2I4X9vCW|F0O~t5++7
z$PEM_009U<00Izz00bZa0SG_<0zCna<9T}jf4^{#5&j|kRyZUxm>>WF2tWV=5P$##
zAOHafKmY;|cnX2h{sHFd$f#~Q^bv8TuDj>jU1Qg<3|nhvxB+G=J?fCh12y(ki##aF
zSfbBL+R>U$5aw22g1K@$z}!D{Hw^NOGuOY*zj;u;wXIewg$HYu;)DIE&c1s8PIs?7
zS+qOX?~>W->ULp%_vV9Qb?UvF2c2r6G`sq3c7VwV40%MFwyilvojlUXA<to&qu2lY
zg-;pbpTei)`~Uv<6d6QN2tWV=5P$##AOHafKmY;|fB*!Zv4Fr`Wg{Og^p9{;<oo?j
zeVV`xk*^30KR)QYOuixT^alX+`akpfGfpg`hX4d1009U<00Izz00bZa0SG|gg$m&O
z|Aq2n=MaDZ1Rwwb2tWV=5P$##AOL~qB0%r|=Y)Te@Bb6NB!4hL00Izz00bZa0SG_<
z0uX=z1R(HA2=sG2%h6wb^!xw9^M7*ok7oe95(SJ*KmY;|fB*y_009U<00Izz00f9Y
zKQ~Cv{|9^L|MdQUR``S=uLO7?009U<00Izz00bZa0SG_<0uXos0vbEQyv6fuVWf{?
zrWt;4ki9C5GAl>oPmOKIbd5LmT({#WQ&Y`$*L0d%Ytk~va|YZ_^3Sp)=W|jqC&^;|
zx+2dg)3d3qj4Vkxxme89O8H6eAHDvM@Be!NWs6-x00Izz00bZa0SG_<0uX=z1fHXS
zcm03(FARC%`u}ru$F3j%0SG_<0uX=z1Rwwb2teR}A@FF7Jno+V==KMh1FdQ58O61`
z#zgPUV%yFrTN%ePCmZClxxUlXY{PMylZ|#OGm-h>Wb|4(SrB_$^CPLYGYYwwF3UM-
zCMU~Pd0HtH$!k)Qq<dr|T|08tjh1FwrnQ?<<l^*1#&n#nLH7MYrc5^8+#tbL$xJy+
z#DutHH73d8awWE$E*8~tSuB@w)0qz^GCL$v!|vFo<&uE&s#2O$@(YSQr_3!Vi)2Pp
zN_nNQpr|FKIIS$sD6{j*{B@;NREnxHH>;GdE9#t5k}@Agv~m6)!N4p8AOHafKmY;|
QfB*y_009U<;8ha%H*LkKp8x;=

literal 0
HcmV?d00001

diff --git a/package.json b/package.json
index f279351..9d6ca25 100644
--- a/package.json
+++ b/package.json
@@ -16,8 +16,6 @@
         "dev": "vite --host",
         "start": "npm run start-server",
         "start-server": "node server/server.js",
-        "start-demo-server": "set NODE_ENV=demo && node server/server.js",
-        "update": "",
         "build": "vite build",
         "vite-preview-dist": "vite preview --host",
         "build-docker": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.2 --target release . --push",
diff --git a/server/server.js b/server/server.js
index 39191de..3387631 100644
--- a/server/server.js
+++ b/server/server.js
@@ -50,6 +50,14 @@ const port = parseInt(process.env.PORT || args.port || 3001);
 const sslKey = process.env.SSL_KEY || args["ssl-key"] || undefined;
 const sslCert = process.env.SSL_CERT || args["ssl-cert"] || undefined;
 
+// Demo Mode?
+const demoMode = args["demo"] || false;
+
+if (demoMode) {
+    console.log("==== Demo Mode ====");
+    Database.templatePath = "./demo_kuma.db";
+}
+
 // Data Directory (must be end with "/")
 Database.dataDir = process.env.DATA_DIR || args["data-dir"] || "./data/";
 Database.path = Database.dataDir + "kuma.db";

From 60f2f08ceae2882ad3d0a46c97754c82ac74c236 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 22:39:04 +0800
Subject: [PATCH 29/48] add demo db

---
 server/server.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/server/server.js b/server/server.js
index 3387631..ade65df 100644
--- a/server/server.js
+++ b/server/server.js
@@ -55,7 +55,7 @@ const demoMode = args["demo"] || false;
 
 if (demoMode) {
     console.log("==== Demo Mode ====");
-    Database.templatePath = "./demo_kuma.db";
+    Database.templatePath = "./db/demo_kuma.db";
 }
 
 // Data Directory (must be end with "/")

From e31be8caf57c497b6789fbbf51bf43765f947a3d Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Thu, 2 Sep 2021 22:52:20 +0800
Subject: [PATCH 30/48] demo mode

---
 server/server.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/server/server.js b/server/server.js
index ade65df..e4cd06e 100644
--- a/server/server.js
+++ b/server/server.js
@@ -55,7 +55,6 @@ const demoMode = args["demo"] || false;
 
 if (demoMode) {
     console.log("==== Demo Mode ====");
-    Database.templatePath = "./db/demo_kuma.db";
 }
 
 // Data Directory (must be end with "/")

From 3831dfe0b91c12858929da5e003982d430a964d1 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Sep 2021 02:55:36 +0800
Subject: [PATCH 31/48] Update README.md

---
 README.md | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/README.md b/README.md
index 925b879..68619fc 100644
--- a/README.md
+++ b/README.md
@@ -10,6 +10,17 @@ It is a self-hosted monitoring tool like "Uptime Robot".
 
 <img src="https://louislam.net/uptimekuma/1.jpg" width="512" alt="" />
 
+## 🥔 Live Demo
+
+Try it!
+
+https://demo.uptime.kuma.pet
+
+It is a 5 minutes live demo, all data will be deleted after that. The server is located at Tokyo, if you live far away from here, it may affact your experience. I suggest that you should install to try it.
+
+VPS is sponsored by Uptime Kuma sponsors on Open Collective! Thank you so much!
+
+
 ## ⭐ Features
 
 * Monitoring uptime for HTTP(s) / TCP / Ping / DNS Record.

From 2241d8817f921a1e01d410b19cf83eb74a950f70 Mon Sep 17 00:00:00 2001
From: cecile <cecile@Ataxya>
Date: Thu, 2 Sep 2021 23:41:47 +0200
Subject: [PATCH 32/48] change translation FR

---
 src/languages/fr.js | 64 ++++++++++++++++++++++-----------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/src/languages/fr.js b/src/languages/fr.js
index 694f4d2..e4f999d 100644
--- a/src/languages/fr.js
+++ b/src/languages/fr.js
@@ -1,7 +1,7 @@
 export default {
     languageName: "Français (France)",
     Settings: "Paramètres",
-    Dashboard: "Dashboard",
+    Dashboard: "Tableau de bord",
     "New Update": "Mise à jour disponible",
     Language: "Langue",
     Appearance: "Apparence",
@@ -11,11 +11,11 @@ export default {
     "Check Update On GitHub": "Consulter les mises à jour sur Github",
     List: "Lister",
     Add: "Ajouter",
-    "Add New Monitor": "Ajouter un nouveau check",
+    "Add New Monitor": "Ajouter une nouvelle sonde",
     "Quick Stats": "Résumé",
     Up: "En ligne",
     Down: "Hors ligne",
-    Pending: "Dans la file d'attente",
+    Pending: "En attente",
     Unknown: "Inconnu",
     Pause: "En Pause",
     pauseDashboardHome: "Éléments mis en pause",
@@ -29,60 +29,60 @@ export default {
     Delete: "Supprimer",
     Current: "Actuellement",
     Uptime: "Uptime",
-    "Cert Exp.": "Cert Exp.",
+    "Cert Exp.": "Certificat expiré",
     days: "Jours",
     day: "Jour",
-    "-day": "Demi-Journée",
+    "-day": "Journée",
     hour: "Heure",
-    "-hour": "Demi-Heure",
+    "-hour": "Heures",
     checkEverySecond: "Vérifier toutes les {0} secondes",
-    "Avg.": "Moy.",
-    Response: "Réponse",
+    "Avg.": "Moyen",
+    Response: "Temps de réponse",
     Ping: "Ping",
-    "Monitor Type": "Type de Monitoring",
+    "Monitor Type": "Type de Sonde",
     Keyword: "Mot-clé",
     "Friendly Name": "Nom d'affichage",
     URL: "URL",
     Hostname: "Nom d'hôte",
     Port: "Port",
-    "Heartbeat Interval": "Intervale de vérifications",
+    "Heartbeat Interval": "Intervale de vérification",
     Retries: "Essais",
     retriesDescription: "Nombre d'essais avant que le service soit déclaré hors-ligne.",
     Advanced: "Avancé",
     ignoreTLSError: "Ignorer les erreurs liées au certificat SSL/TLS",
     "Upside Down Mode": "Mode inversé",
-    upsideDownModeDescription: "Si le service est en ligne il sera alors noté hors-ligne et vice-versa.",
-    "Max. Redirects": "Redirections",
+    upsideDownModeDescription: "Si le service est en ligne, il sera alors noté hors-ligne et vice-versa.",
+    "Max. Redirects": "Nombre maximum de redirections",
     maxRedirectDescription: "Nombre maximal de redirections avant que le service soit noté hors-ligne.",
     "Accepted Status Codes": "Codes HTTP",
-    acceptedStatusCodesDescription: "Si les codes HTTP reçus sont ceux séléctionnés, alors le serveur sera noté en ligne.",
+    acceptedStatusCodesDescription: "Codes HTTP considérés comme en ligne",
     Save: "Sauvegarder",
     Notifications: "Notifications",
-    "Not available, please setup.": "Créez des notifications depuis les paramètres.",
+    "Not available, please setup.": "Pas de système de notification disponible, merci de le configurer",
     "Setup Notification": "Créer une notification",
     Light: "Clair",
     Dark: "Sombre",
     Auto: "Automatique",
-    "Theme - Heartbeat Bar": "Voir les services monitorés",
+    "Theme - Heartbeat Bar": "Voir les services surveillés",
     Normal: "Général",
-    Bottom: "Au dessus",
-    None: "Neutre",
+    Bottom: "En dessous",
+    None: "Non",
     Timezone: "Fuseau Horaire",
-    "Search Engine Visibility": "SEO",
+    "Search Engine Visibility": "Visibilité par les moteurs de recherche",
     "Allow indexing": "Autoriser l'indexation par des moteurs de recherche",
-    "Discourage search engines from indexing site": "Empêche les moteurs de recherche d'indexer votre site",
+    "Discourage search engines from indexing site": "Refuser l'indexation par des moteurs de recherche",
     "Change Password": "Changer le mot de passe",
     "Current Password": "Mot de passe actuel",
     "New Password": "Nouveau mot de passe",
     "Repeat New Password": "Répéter votre nouveau mot de passe",
     passwordNotMatchMsg: "Les mots de passe ne correspondent pas",
     "Update Password": "Mettre à jour le mot de passe",
-    "Disable Auth": "Désactiver l'authentification intégrée",
+    "Disable Auth": "Désactiver l'authentification",
     "Enable Auth": "Activer l'authentification",
     Logout: "Se déconnecter",
-    notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hosts.",
+    notificationDescription: "Une fois ajoutée, vous devez l'activer manuellement dans les paramètres de vos hôtes.",
     Leave: "Quitter",
-    "I understand, please disable": "Je comprends, je l'ai désactivé",
+    "I understand, please disable": "J'ai compris, désactivez-le",
     Confirm: "Confirmer",
     Yes: "Oui",
     No: "Non",
@@ -90,23 +90,23 @@ export default {
     Password: "Mot de passe",
     "Remember me": "Se souvenir de moi",
     Login: "Se connecter",
-    "No Monitors, please": "Pas de monitor, veuillez ",
-    "add one": "en ajouter un.",
+    "No Monitors, please": "Pas de sondes, veuillez ",
+    "add one": "en ajouter une.",
     "Notification Type": "Type de notification",
     Email: "Email",
     Test: "Tester",
-    keywordDescription: "Le mot clé sera cherché dans la réponse HTML/JSON reçue du site internet.",
-    "Certificate Info": "Des informations sur le certificat SSL",
-    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer ce monitor ?",
+    keywordDescription: "Le mot clé sera recherché dans la réponse HTML/JSON reçue du site internet.",
+    "Certificate Info": "Informations sur le certificat SSL",
+    deleteMonitorMsg: "Êtes-vous sûr de vouloir supprimer cette sonde ?",
     deleteNotificationMsg: "Êtes-vous sûr de vouloir supprimer ce type de notifications ? Une fois désactivée, les services qui l'utilisent ne pourront plus envoyer de notifications.",
     "Resolver Server": "Serveur DNS utilisé",
     "Resource Record Type": "Type d'enregistrement DNS recherché",
     resoverserverDescription: "Le DNS de cloudflare est utilisé par défaut, mais vous pouvez le changer si vous le souhaitez.",
     rrtypeDescription: "Veuillez séléctionner un type d'enregistrement DNS",
-    pauseMonitorMsg: "Are you sure want to pause?",
-    "Last Result": "Last Result",
-    "Create your admin account": "Create your admin account",
-    "Repeat Password": "Repeat Password",
-    respTime: "Resp. Time (ms)",
+    pauseMonitorMsg: "Etes vous sur de vouloir mettre en pause cette sonde ?",
+    "Last Result": "Dernier résultat",
+    "Create your admin account": "Créez votre compte administrateur",
+    "Repeat Password": "Répéter le mot de passe",
+    respTime: "Temps de réponse (ms)",
     notAvailableShort: "N/A"
 }

From 53a14cf4f5833cb419416d0d816c92701835921d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Du=C5=A1an=20Simi=C4=87?= <dusan.simic1810@gmail.com>
Date: Fri, 3 Sep 2021 02:06:26 +0200
Subject: [PATCH 33/48] Add Serbian Cyrilic locale

---
 src/languages/sr.js    | 112 +++++++++++++++++++++++++++++++++++++++++
 src/main.js            |   2 +
 src/pages/Settings.vue |   6 +++
 3 files changed, 120 insertions(+)
 create mode 100644 src/languages/sr.js

diff --git a/src/languages/sr.js b/src/languages/sr.js
new file mode 100644
index 0000000..0bd0840
--- /dev/null
+++ b/src/languages/sr.js
@@ -0,0 +1,112 @@
+export default {
+    languageName: "Српски",
+    checkEverySecond: "Провери сваких {0} секунди.",
+    "Avg.": "Просечни ",
+    retriesDescription: "Максимум покушаја пре него што се сервис обележи као неактиван и пошаље се обавештење.",
+    ignoreTLSError: "Игнориши TLS/SSL грешке за HTTPS веб странице.",
+    upsideDownModeDescription: "Обрните статус. Ако је сервис доступан, онда је обележен као неактиван.",
+    maxRedirectDescription: "Максимани број преусмерења да се прате. Поставите на 0 да би се искључила преусмерења.",
+    acceptedStatusCodesDescription: "Одаберите статусне кодове који се сматрају успешним одговором.",
+    passwordNotMatchMsg: "Поновљена лозинка се не поклапа.",
+    notificationDescription: "Молим Вас поставите обавештење за масматраче да бисе активирали.",
+    keywordDescription: "Претражи кључну реч у чистом html или JSON одговору са осетљивим великим и малим словима",
+    pauseDashboardHome: "Паузирај",
+    deleteMonitorMsg: "Да ли сте сигурни да желите да обришете овог посматрача?",
+    deleteNotificationMsg: "Да ли сте сигурни д ажелите да уклоните ово обавештење за све посматраче?",
+    resoverserverDescription: "Cloudflare је подразумевани сервер. Можете променити сервер за расзрешавање у било ком тренутку.",
+    rrtypeDescription: "Одаберите RR-Type који желите да посматрате",
+    pauseMonitorMsg: "Да ли сте сигурни да желите да паузирате?",
+    Settings: "Подешавања",
+    Dashboard: "Командна табла",
+    "New Update": "Нова верзија",
+    Language: "Језик",
+    Appearance: "Изглед",
+    Theme: "Тема",
+    General: "Опште",
+    Version: "Верзија",
+    "Check Update On GitHub": "Проверите нову верзију на GitHub-у",
+    List: "Листа",
+    Add: "Додај",
+    "Add New Monitor": "Додај новог посматрача",
+    "Quick Stats": "Брзе статистике",
+    Up: "Активно",
+    Down: "Неактивно",
+    Pending: "Нерешено",
+    Unknown: "Непознато",
+    Pause: "Паузирај",
+    Name: "Име",
+    Status: "Статус",
+    DateTime: "Датум и време",
+    Message: "Порука",
+    "No important events": "Нема битних догађаја",
+    Resume: "Настави",
+    Edit: "Измени",
+    Delete: "Уклони",
+    Current: "Тренутно",
+    Uptime: "Време рада",
+    "Cert Exp.": "Истек серт.",
+    days: "дана",
+    day: "дан",
+    "-day": "-дана",
+    hour: "сат",
+    "-hour": "-сата",
+    Response: "Одговор",
+    Ping: "Пинг",
+    "Monitor Type": "Тип посматрача",
+    Keyword: "Кључна реч",
+    "Friendly Name": "Пријатељско име",
+    URL: "URL",
+    Hostname: "Hostname",
+    Port: "Порт",
+    "Heartbeat Interval": "Интервал откуцаја срца",
+    Retries: "Покушаји",
+    Advanced: "Напредно",
+    "Upside Down Mode": "Наопак мод",
+    "Max. Redirects": "Макс. преусмерења",
+    "Accepted Status Codes": "Прихваћени статусни кодови",
+    Save: "Сачувај",
+    Notifications: "Обавештења",
+    "Not available, please setup.": "Није доступно, молим Вас подесите.",
+    "Setup Notification": "Постави обавештење",
+    Light: "Светло",
+    Dark: "Тамно",
+    Auto: "Аутоматско",
+    "Theme - Heartbeat Bar": "Тема - Трака откуцаја срца",
+    Normal: "Нормално",
+    Bottom: "Доле",
+    None: "Искључено",
+    Timezone: "Временска зона",
+    "Search Engine Visibility": "Видљивост претраживачима",
+    "Allow indexing": "Дозволи индексирање",
+    "Discourage search engines from indexing site": "Одвраћајте претраживаче од индексирања сајта",
+    "Change Password": "Промени лозинку",
+    "Current Password": "Тренутна лозинка",
+    "New Password": "Нова лозинка",
+    "Repeat New Password": "Понови нову лозинку",
+    "Update Password": "Измени лозинку",
+    "Disable Auth": "Искључи аутентификацију",
+    "Enable Auth": "Укључи аутентификацију",
+    Logout: "Одлогуј се",
+    Leave: "Изађи",
+    "I understand, please disable": "Разумем, молим те искључи",
+    Confirm: "Потврди",
+    Yes: "Да",
+    No: "Не",
+    Username: "Корисничко име",
+    Password: "Лозинка",
+    "Remember me": "Запамти ме",
+    Login: "Улогуј се",
+    "No Monitors, please": "Без посматрача молим",
+    "add one": "додај једног",
+    "Notification Type": "Тип обавештења",
+    Email: "Е-пошта",
+    Test: "Тест",
+    "Certificate Info": "Информације сертификата",
+    "Resolver Server": "Разрешивачки сервер",
+    "Resource Record Type": "Тип записа ресурса",
+    "Last Result": "Последњи резултат",
+    "Create your admin account": "Наприви администраторски налог",
+    "Repeat Password": "Поновите лозинку",
+    respTime: "Време одг. (мс)",
+    notAvailableShort: "N/A"
+}
diff --git a/src/main.js b/src/main.js
index 3b00f24..9750dd4 100644
--- a/src/main.js
+++ b/src/main.js
@@ -30,6 +30,7 @@ import esEs from "./languages/es-ES";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
+import sr from "./languages/sr";
 import svSE from "./languages/sv-SE";
 import koKR from "./languages/ko-KR";
 import ruRU from "./languages/ru-RU";
@@ -104,6 +105,7 @@ const languageList = {
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,
+    "sr": sr,
     "sv-SE": svSE,
     "ko-KR": koKR,
     "ru-RU": ruRU,
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 85ca006..679a2a7 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -189,6 +189,12 @@
                     <p>Es ist für <strong>jemanden der eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.</p>
                     <p>Bitte mit Vorsicht nutzen.</p>
                 </template>
+
+                <template v-if="$i18n.locale === 'sr' ">
+                    <p>Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?</p>
+                    <p>То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.</p>
+                    <p>Молим вас користите ово са пажњом.</p>
+                </template>
             </Confirm>
         </div>
     </transition>

From 79fda8f442b8f078c42512db2ab3860cd8d5f609 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Du=C5=A1an=20Simi=C4=87?= <dusan.simic1810@gmail.com>
Date: Fri, 3 Sep 2021 02:20:01 +0200
Subject: [PATCH 34/48] Add Serbian Latin locale

---
 src/languages/sr-latn.js | 112 +++++++++++++++++++++++++++++++++++++++
 src/main.js              |   2 +
 src/pages/Settings.vue   |   6 +++
 3 files changed, 120 insertions(+)
 create mode 100644 src/languages/sr-latn.js

diff --git a/src/languages/sr-latn.js b/src/languages/sr-latn.js
new file mode 100644
index 0000000..aa7d95c
--- /dev/null
+++ b/src/languages/sr-latn.js
@@ -0,0 +1,112 @@
+export default {
+    languageName: "Srpski",
+    checkEverySecond: "Proveri svakih {0} sekundi.",
+    "Avg.": "Prosečni ",
+    retriesDescription: "Maksimum pokušaja pre nego što se servis obeleži kao neaktivan i pošalje se obaveštenje.",
+    ignoreTLSError: "Ignoriši TLS/SSL greške za HTTPS veb stranice.",
+    upsideDownModeDescription: "Obrnite status. Ako je servis dostupan, onda je obeležen kao neaktivan.",
+    maxRedirectDescription: "Maksimani broj preusmerenja da se prate. Postavite na 0 da bi se isključila preusmerenja.",
+    acceptedStatusCodesDescription: "Odaberite statusne kodove koji se smatraju uspešnim odgovorom.",
+    passwordNotMatchMsg: "Ponovljena lozinka se ne poklapa.",
+    notificationDescription: "Molim Vas postavite obaveštenje za masmatrače da bise aktivirali.",
+    keywordDescription: "Pretraži ključnu reč u čistom html ili JSON odgovoru sa osetljivim velikim i malim slovima",
+    pauseDashboardHome: "Pauziraj",
+    deleteMonitorMsg: "Da li ste sigurni da želite da obrišete ovog posmatrača?",
+    deleteNotificationMsg: "Da li ste sigurni d aželite da uklonite ovo obaveštenje za sve posmatrače?",
+    resoverserverDescription: "Cloudflare je podrazumevani server. Možete promeniti server za raszrešavanje u bilo kom trenutku.",
+    rrtypeDescription: "Odaberite RR-Type koji želite da posmatrate",
+    pauseMonitorMsg: "Da li ste sigurni da želite da pauzirate?",
+    Settings: "Podešavanja",
+    Dashboard: "Komandna tabla",
+    "New Update": "Nova verzija",
+    Language: "Jezik",
+    Appearance: "Izgled",
+    Theme: "Tema",
+    General: "Opšte",
+    Version: "Verzija",
+    "Check Update On GitHub": "Proverite novu verziju na GitHub-u",
+    List: "Lista",
+    Add: "Dodaj",
+    "Add New Monitor": "Dodaj novog posmatrača",
+    "Quick Stats": "Brze statistike",
+    Up: "Aktivno",
+    Down: "Neaktivno",
+    Pending: "Nerešeno",
+    Unknown: "Nepoznato",
+    Pause: "Pauziraj",
+    Name: "Ime",
+    Status: "Status",
+    DateTime: "Datum i vreme",
+    Message: "Poruka",
+    "No important events": "Nema bitnih događaja",
+    Resume: "Nastavi",
+    Edit: "Izmeni",
+    Delete: "Ukloni",
+    Current: "Trenutno",
+    Uptime: "Vreme rada",
+    "Cert Exp.": "Istek sert.",
+    days: "dana",
+    day: "dan",
+    "-day": "-dana",
+    hour: "sat",
+    "-hour": "-sata",
+    Response: "Odgovor",
+    Ping: "Ping",
+    "Monitor Type": "Tip posmatrača",
+    Keyword: "Ključna reč",
+    "Friendly Name": "Prijateljsko ime",
+    URL: "URL",
+    Hostname: "Hostname",
+    Port: "Port",
+    "Heartbeat Interval": "Interval otkucaja srca",
+    Retries: "Pokušaji",
+    Advanced: "Napredno",
+    "Upside Down Mode": "Naopak mod",
+    "Max. Redirects": "Maks. preusmerenja",
+    "Accepted Status Codes": "Prihvaćeni statusni kodovi",
+    Save: "Sačuvaj",
+    Notifications: "Obaveštenja",
+    "Not available, please setup.": "Nije dostupno, molim Vas podesite.",
+    "Setup Notification": "Postavi obaveštenje",
+    Light: "Svetlo",
+    Dark: "Tamno",
+    Auto: "Automatsko",
+    "Theme - Heartbeat Bar": "Tema - Traka otkucaja srca",
+    Normal: "Normalno",
+    Bottom: "Dole",
+    None: "Isključeno",
+    Timezone: "Vremenska zona",
+    "Search Engine Visibility": "Vidljivost pretraživačima",
+    "Allow indexing": "Dozvoli indeksiranje",
+    "Discourage search engines from indexing site": "Odvraćajte pretraživače od indeksiranja sajta",
+    "Change Password": "Promeni lozinku",
+    "Current Password": "Trenutna lozinka",
+    "New Password": "Nova lozinka",
+    "Repeat New Password": "Ponovi novu lozinku",
+    "Update Password": "Izmeni lozinku",
+    "Disable Auth": "Isključi autentifikaciju",
+    "Enable Auth": "Uključi autentifikaciju",
+    Logout: "Odloguj se",
+    Leave: "Izađi",
+    "I understand, please disable": "Razumem, molim te isključi",
+    Confirm: "Potvrdi",
+    Yes: "Da",
+    No: "Ne",
+    Username: "Korisničko ime",
+    Password: "Lozinka",
+    "Remember me": "Zapamti me",
+    Login: "Uloguj se",
+    "No Monitors, please": "Bez posmatrača molim",
+    "add one": "dodaj jednog",
+    "Notification Type": "Tip obaveštenja",
+    Email: "E-pošta",
+    Test: "Test",
+    "Certificate Info": "Informacije sertifikata",
+    "Resolver Server": "Razrešivački server",
+    "Resource Record Type": "Tip zapisa resursa",
+    "Last Result": "Poslednji rezultat",
+    "Create your admin account": "Naprivi administratorski nalog",
+    "Repeat Password": "Ponovite lozinku",
+    respTime: "Vreme odg. (ms)",
+    notAvailableShort: "N/A"
+}
diff --git a/src/main.js b/src/main.js
index 3b00f24..ecbd0d0 100644
--- a/src/main.js
+++ b/src/main.js
@@ -30,6 +30,7 @@ import esEs from "./languages/es-ES";
 import fr from "./languages/fr";
 import ja from "./languages/ja";
 import daDK from "./languages/da-DK";
+import srLatn from "./languages/sr-latn";
 import svSE from "./languages/sv-SE";
 import koKR from "./languages/ko-KR";
 import ruRU from "./languages/ru-RU";
@@ -104,6 +105,7 @@ const languageList = {
     "fr": fr,
     "ja": ja,
     "da-DK": daDK,
+    "sr-latn": srLatn,
     "sv-SE": svSE,
     "ko-KR": koKR,
     "ru-RU": ruRU,
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 85ca006..95f977d 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -189,6 +189,12 @@
                     <p>Es ist für <strong>jemanden der eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.</p>
                     <p>Bitte mit Vorsicht nutzen.</p>
                 </template>
+
+                <template v-if="$i18n.locale === 'sr-latn' ">
+                    <p>Da li ste sigurni da želite da <strong>isključite autentifikaciju</strong>?</p>
+                    <p>To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.</p>
+                    <p>Molim Vas koristite ovo sa pažnjom.</p>
+                </template>
             </Confirm>
         </div>
     </transition>

From 19a4d570ecb36f4177ffd6ceaee06b63786c4b32 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Du=C5=A1an=20Simi=C4=87?= <dusan.simic1810@gmail.com>
Date: Fri, 3 Sep 2021 02:24:31 +0200
Subject: [PATCH 35/48] Fix word capitalization

---
 src/pages/Settings.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 679a2a7..c90dcc1 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -193,7 +193,7 @@
                 <template v-if="$i18n.locale === 'sr' ">
                     <p>Да ли сте сигурни да желите да <strong>искључите аутентификацију</strong>?</p>
                     <p>То је за <strong>оне који имају додату аутентификацију</strong> испред Uptime Kuma као на пример Cloudflare Access.</p>
-                    <p>Молим вас користите ово са пажњом.</p>
+                    <p>Молим Вас користите ово са пажњом.</p>
                 </template>
             </Confirm>
         </div>

From 18616ee590075b6e71e187ba9960f97eee4ce4c7 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Fri, 3 Sep 2021 12:05:49 +0800
Subject: [PATCH 36/48] Fix: Fix Notification "Test" btn styling

---
 src/assets/app.scss | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/assets/app.scss b/src/assets/app.scss
index 41248a5..1f75e97 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -71,6 +71,14 @@ h2 {
     }
 }
 
+.btn-warning {
+    color: white;
+
+    &:hover, &:active, &:focus, &.active {
+        color: white;
+    }
+}
+
 .btn-info {
     color: white;
 
@@ -186,6 +194,14 @@ h2 {
         color: white;
     }
 
+    .btn-warning {
+        color: $dark-font-color2;
+
+        &:hover, &:active, &:focus, &.active {
+            color: $dark-font-color2;
+        }
+    }
+
     .btn-close {
         box-shadow: none;
         filter: invert(1);

From 312aedf391139e6a121876e4fd29af88c5a06389 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=96=B0=E9=80=B8Cary?= <jinqilin721@163.com>
Date: Fri, 3 Sep 2021 13:33:26 +0800
Subject: [PATCH 37/48] =?UTF-8?q?Update=20Chinese=20Translation=EF=BC=88?=
 =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AE=80=E4=BD=93=E4=B8=AD=E6=96=87=E8=AF=AD?=
 =?UTF-8?q?=E8=A8=80=E7=BF=BB=E8=AF=91=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/languages/zh-CN.js | 42 +++++++++++++++++++++---------------------
 src/pages/Settings.vue |  6 ++++++
 2 files changed, 27 insertions(+), 21 deletions(-)

diff --git a/src/languages/zh-CN.js b/src/languages/zh-CN.js
index b67f1d5..d179a91 100644
--- a/src/languages/zh-CN.js
+++ b/src/languages/zh-CN.js
@@ -1,20 +1,20 @@
 export default {
     languageName: "简体中文",
     checkEverySecond: "检测频率 {0} 秒",
-    "Avg.": "平均 ",
-    retriesDescription: "最大重试次数",
+    "Avg.": "平均",
+    retriesDescription: "最大重试失败次数",
     ignoreTLSError: "忽略HTTPS站点的证书错误",
-    upsideDownModeDescription: "反向状态监控",
+    upsideDownModeDescription: "反向状态监控(状态码范围外为有效状态,反之为无效)",
     maxRedirectDescription: "最大重定向次数,设置为 0 禁止重定向",
     acceptedStatusCodesDescription: "选择被视为成功响应的状态码",
     passwordNotMatchMsg: "两次密码输入不一致",
-    notificationDescription: "请先设置一个消息通知",
+    notificationDescription: "请为监控项配置消息通知",
     keywordDescription: "检测响应内容中的关键字,区分大小写",
-    pauseDashboardHome: "Pause",
+    pauseDashboardHome: "暂停",
     deleteMonitorMsg: "确定要删除此监控吗?",
     deleteNotificationMsg: "确定要删除此消息通知吗?这将对所有监控生效。",
     resoverserverDescription: "默认服务器 Cloudflare,可以修改为任意你想要使用的DNS服务器",
-    rrtypeDescription: "选择您要监控的资源记录类型",
+    rrtypeDescription: "选择要监控的资源记录类型",
     pauseMonitorMsg: "确定要暂停吗?",
     Settings: "设置",
     Dashboard: "仪表盘",
@@ -27,7 +27,7 @@ export default {
     "Check Update On GitHub": "检查更新",
     List: "列表",
     Add: "添加",
-    "Add New Monitor": "添加新的监控",
+    "Add New Monitor": "创建监控项",
     "Quick Stats": "状态速览",
     Up: "正常",
     Down: "故障",
@@ -50,12 +50,12 @@ export default {
     "-day": " 天",
     hour: "小时",
     "-hour": " 小时",
-    Response: "响应",
+    Response: "响应时长",
     Ping: "Ping",
     "Monitor Type": "监控类型",
     Keyword: "关键字",
-    "Friendly Name": "名称",
-    URL: "网址",
+    "Friendly Name": "自定义名称",
+    URL: "网址URL",
     Hostname: "主机名",
     Port: "端口号",
     "Heartbeat Interval": "心跳间隔",
@@ -66,12 +66,12 @@ export default {
     "Accepted Status Codes": "有效状态码",
     Save: "保存",
     Notifications: "消息通知",
-    "Not available, please setup.": "不可用,请设置",
+    "Not available, please setup.": "无可用通道,请先设置",
     "Setup Notification": "设置通知",
     Light: "明亮",
     Dark: "黑暗",
     Auto: "自动",
-    "Theme - Heartbeat Bar": "心跳状态显示",
+    "Theme - Heartbeat Bar": "状态显示",
     Normal: "正常显示",
     Bottom: "靠下显示",
     None: "不显示",
@@ -81,23 +81,23 @@ export default {
     "Discourage search engines from indexing site": "阻止搜索引擎索引网站",
     "Change Password": "修改密码",
     "Current Password": "当前密码",
-    "New Password": "新密码",
-    "Repeat New Password": "重复新密码",
+    "New Password": "新的密码",
+    "Repeat New Password": "重复新的密码",
     "Update Password": "更新密码",
     "Disable Auth": "禁用身份验证",
     "Enable Auth": "启用身份验证",
     Logout: "退出",
     Leave: "离开",
-    "I understand, please disable": "我已经了解,继续禁用",
+    "I understand, please disable": "我已了解,继续禁用",
     Confirm: "确认",
-    Yes: "是的",
-    No: "不是",
+    Yes: "确定",
+    No: "取消",
     Username: "用户名",
     Password: "密码",
-    "Remember me": "请记住我",
+    "Remember me": "记住登录",
     Login: "登录",
-    "No Monitors, please": "没有监控,",
-    "add one": "添加一个",
+    "No Monitors, please": "还没有监控项,",
+    "add one": "点击新增",
     "Notification Type": "消息类型",
     Email: "邮件",
     Test: "测试一下",
@@ -107,6 +107,6 @@ export default {
     "Last Result": "Last Result",
     "Create your admin account": "创建管理员账号",
     "Repeat Password": "重复密码",
-    respTime: "响应时间 (ms)",
+    respTime: "Resp. Time (ms)",
     notAvailableShort: "N/A"
 }
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index d71ec10..a1cdd17 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -178,6 +178,12 @@
                     <p>請小心使用。</p>
                 </template>
 
+                <template v-if="$i18n.locale === 'zh-CN' ">
+                    <p>是否确定 <strong>取消登录验证</strong>?</p>
+                    <p>这是为 <strong>有第三方认证</strong> 的用户提供的功能,如 Cloudflare Access</p>
+                    <p>请谨慎使用!</p>
+                </template>
+
                 <template v-if="$i18n.locale === 'de-DE' ">
                     <p>Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?</p>
                     <p>Es ist für <strong>jemanden der eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.</p>

From c15e6631ae8cf630adb71e95828892e4fe8f41b8 Mon Sep 17 00:00:00 2001
From: Adam Stachowicz <saibamenppl@gmail.com>
Date: Fri, 3 Sep 2021 09:16:54 +0200
Subject: [PATCH 38/48] Update README.md

Open Collective URL
---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 68619fc..bb6589c 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@ https://demo.uptime.kuma.pet
 
 It is a 5 minutes live demo, all data will be deleted after that. The server is located at Tokyo, if you live far away from here, it may affact your experience. I suggest that you should install to try it.
 
-VPS is sponsored by Uptime Kuma sponsors on Open Collective! Thank you so much!
+VPS is sponsored by Uptime Kuma sponsors on [Open Collective](https://opencollective.com/uptime-kuma)! Thank you so much!
 
 
 ## ⭐ Features

From d2151737c13d91b3189f1256a98defcb32cfbab7 Mon Sep 17 00:00:00 2001
From: Louis Lam <louislam@users.noreply.github.com>
Date: Fri, 3 Sep 2021 17:09:11 +0800
Subject: [PATCH 39/48] Update README.md

---
 src/languages/README.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/languages/README.md b/src/languages/README.md
index 9ba99ad..894cb6e 100644
--- a/src/languages/README.md
+++ b/src/languages/README.md
@@ -8,5 +8,11 @@
 8. Import your language file in `src/main.js` and add it to `languageList` constant.
 9. Make a [pull request](https://github.com/louislam/uptime-kuma/pulls) when you have done.
 
+
+
+One of good examples:
+https://github.com/louislam/uptime-kuma/pull/316/files
+
+
 If you do not have programming skills, let me know in [Issues section](https://github.com/louislam/uptime-kuma/issues). I will assist you. 😏
 

From e6e2b0ebf8acdf5759644e9fdb775c7024918347 Mon Sep 17 00:00:00 2001
From: J Posthuma <jposthuma25@gmail.com>
Date: Fri, 3 Sep 2021 13:42:14 +0200
Subject: [PATCH 40/48] Update nl_NL.js

---
 src/languages/nl_NL.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/languages/nl_NL.js b/src/languages/nl_NL.js
index b26c17e..60c5089 100644
--- a/src/languages/nl_NL.js
+++ b/src/languages/nl_NL.js
@@ -24,7 +24,7 @@ export default {
     Theme: "Thema",
     General: "Algemeen",
     Version: "Versie",
-    "Check Update On GitHub": "Controleer update op GitHub",
+    "Check Update On GitHub": "Controleer voor updates op GitHub",
     List: "Lijst",
     Add: "Toevoegen",
     "Add New Monitor": "Nieuwe monitor toevoegen",
@@ -109,4 +109,4 @@ export default {
     "Repeat Password": "Herhaal wachtwoord",
     respTime: "resp. tijd (ms)",
     notAvailableShort: "N.v.t."
-}
\ No newline at end of file
+}

From 5430da955ae150d70d7993f4ea62c9e80d818ef8 Mon Sep 17 00:00:00 2001
From: Ponkhy <xtheponkhx@gmail.com>
Date: Fri, 3 Sep 2021 15:54:14 +0200
Subject: [PATCH 41/48] Small german language adjustments

---
 src/languages/de-DE.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/languages/de-DE.js b/src/languages/de-DE.js
index 7febaad..76c355a 100644
--- a/src/languages/de-DE.js
+++ b/src/languages/de-DE.js
@@ -70,7 +70,7 @@ export default {
     Timezone: "Zeitzone",
     "Search Engine Visibility": "Suchmaschinensichtbarkeit",
     "Allow indexing": "Indizierung zulassen",
-    "Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Site ab",
+    "Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab",
     "Change Password": "Passwort ändern",
     "Current Password": "Dezeitiges Passwort",
     "New Password": "Neues Passwort",
@@ -96,10 +96,10 @@ export default {
     Email: "E-Mail",
     Test: "Test",
     "Certificate Info": "Zertifikatsinfo",
-    keywordDescription: "Suche nach einen Schlüsselwort in einer schlichten HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.",
+    keywordDescription: "Suche nach einem Schlüsselwort in der HTML oder JSON Ausgabe. Bitte beachte, es wird in der Groß-/Kleinschreibung unterschieden.",
     deleteMonitorMsg: "Bist du sicher das du den Monitor löschen möchtest?",
     deleteNotificationMsg: "Möchtest du diese Benachrichtigung wirklich für alle Monitore löschen?",
-    resoverserverDescription: "Cloudflare ist der Standardserver, dieser kann jederzeit geändern werden.",
+    resoverserverDescription: "Cloudflare ist als der Standardserver festgelegt, dieser kann jederzeit geändern werden.",
     "Resolver Server": "Auflösungsserver",
     rrtypeDescription: "Wähle den RR-Typ aus, welchen du überwachen möchtest.",
     "Last Result": "Letztes Ergebnis",
@@ -107,6 +107,6 @@ export default {
     "Create your admin account": "Erstelle dein Admin Konto",
     "Repeat Password": "Wiederhole das Passwort",
     "Resource Record Type": "Resource Record Type",
-    respTime: "Resp. Time (ms)",
+    respTime: "Antw. Zeit (ms)",
     notAvailableShort: "N/A"
 }

From 6d8aa20fc64d2b7a3ec8b0a9221fb863a806563e Mon Sep 17 00:00:00 2001
From: dhfhfk <dhfhfk1203@gmail.com>
Date: Fri, 3 Sep 2021 23:18:18 +0900
Subject: [PATCH 42/48] Add missing string for Korean

confirmDisableAuth, new string
---
 src/languages/ko-KR.js | 4 ++--
 src/pages/Settings.vue | 6 ++++++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/languages/ko-KR.js b/src/languages/ko-KR.js
index f913bbb..8493193 100644
--- a/src/languages/ko-KR.js
+++ b/src/languages/ko-KR.js
@@ -88,7 +88,7 @@ export default {
     "Enable Auth": "인증 켜기",
     Logout: "로그아웃",
     Leave: "나가기",
-    "I understand, please disable": "기능에 대해 이해했어요.",
+    "I understand, please disable": "기능에 대해 이해했으니 꺼주세요.",
     Confirm: "확인",
     Yes: "확인",
     No: "취소",
@@ -107,6 +107,6 @@ export default {
     "Last Result": "최근 결과",
     "Create your admin account": "관리자 계정 만들기",
     "Repeat Password": "비밀번호 재입력",
-    respTime: "Resp. Time (ms)",
+    respTime: "응답 시간 (ms)",
     notAvailableShort: "N/A"
 }
diff --git a/src/pages/Settings.vue b/src/pages/Settings.vue
index 8cf2d51..7056421 100644
--- a/src/pages/Settings.vue
+++ b/src/pages/Settings.vue
@@ -207,6 +207,12 @@
                     <p>To je za <strong>one koji imaju dodatu autentifikaciju</strong> ispred Uptime Kuma kao na primer Cloudflare Access.</p>
                     <p>Molim Vas koristite ovo sa pažnjom.</p>
                 </template>
+
+                <template v-if="$i18n.locale === 'ko-KR' ">
+                    <p>정말로 <strong>인증 기능을 끌까요</strong>?</p>
+                    <p>이 기능은 <strong>Cloudflare Access와 같은 서드파티 인증</strong>을 Uptime Kuma 앞에 둔 사용자를 위한 기능이에요.</p>
+                    <p>신중하게 사용하세요.</p>
+                </template>
             </Confirm>
         </div>
     </transition>

From 0d87a6dfea184bb74a6f2253cd5126d7c52ea1d7 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Sat, 4 Sep 2021 14:41:45 +0800
Subject: [PATCH 43/48] update vue to 3.2.8

---
 package-lock.json | 867 +++++++++++++++++++++++-----------------------
 package.json      |   2 +-
 2 files changed, 435 insertions(+), 434 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 25be147..dcf5077 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
     "name": "uptime-kuma",
-    "version": "1.5.0",
+    "version": "1.5.2",
     "lockfileVersion": 2,
     "requires": true,
     "packages": {
         "": {
             "name": "uptime-kuma",
-            "version": "1.5.0",
+            "version": "1.5.2",
             "license": "MIT",
             "dependencies": {
                 "@fortawesome/fontawesome-svg-core": "^1.2.36",
@@ -26,19 +26,19 @@
                 "express": "^4.17.1",
                 "express-basic-auth": "^1.2.0",
                 "form-data": "^4.0.0",
-                "http-graceful-shutdown": "^3.1.3",
+                "http-graceful-shutdown": "^3.1.4",
                 "jsonwebtoken": "^8.5.1",
                 "nodemailer": "^6.6.3",
                 "password-hash": "^1.2.2",
                 "prom-client": "^13.2.0",
                 "prometheus-api-metrics": "^3.2.0",
                 "redbean-node": "0.1.2",
-                "socket.io": "^4.1.3",
-                "socket.io-client": "^4.1.3",
+                "socket.io": "^4.2.0",
+                "socket.io-client": "^4.2.0",
                 "sqlite3": "github:mapbox/node-sqlite3#593c9d",
                 "tcp-ping": "^0.1.1",
                 "v-pagination-3": "^0.1.6",
-                "vue": "^3.2.2",
+                "vue": "^3.2.8",
                 "vue-chart-3": "^0.5.7",
                 "vue-confirm-dialog": "^1.0.2",
                 "vue-i18n": "^9.1.7",
@@ -48,19 +48,19 @@
             },
             "devDependencies": {
                 "@babel/eslint-parser": "^7.15.0",
-                "@types/bootstrap": "^5.1.1",
-                "@vitejs/plugin-legacy": "^1.5.1",
-                "@vitejs/plugin-vue": "^1.4.0",
-                "@vue/compiler-sfc": "^3.2.2",
-                "core-js": "^3.16.1",
+                "@types/bootstrap": "^5.1.2",
+                "@vitejs/plugin-legacy": "^1.5.2",
+                "@vitejs/plugin-vue": "^1.6.0",
+                "@vue/compiler-sfc": "^3.2.6",
+                "core-js": "^3.17.0",
                 "dns2": "^2.0.1",
                 "eslint": "^7.32.0",
-                "eslint-plugin-vue": "^7.16.0",
-                "sass": "^1.37.5",
+                "eslint-plugin-vue": "^7.17.0",
+                "sass": "^1.38.2",
                 "stylelint": "^13.13.1",
                 "stylelint-config-standard": "^22.0.0",
-                "typescript": "^4.3.5",
-                "vite": "^2.4.4"
+                "typescript": "^4.4.2",
+                "vite": "^2.5.3"
             },
             "engines": {
                 "node": "14.*"
@@ -85,20 +85,20 @@
             }
         },
         "node_modules/@babel/core": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz",
-            "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.4.tgz",
+            "integrity": "sha512-Lkcv9I4a8bgUI8LJOLM6IKv6hnz1KOju6KM1lceqVMKlKKqNRopYd2Pc9MgIurqvMJ6BooemrnJz8jlIiQIpsA==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.14.5",
-                "@babel/generator": "^7.15.0",
-                "@babel/helper-compilation-targets": "^7.15.0",
-                "@babel/helper-module-transforms": "^7.15.0",
-                "@babel/helpers": "^7.14.8",
-                "@babel/parser": "^7.15.0",
-                "@babel/template": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0",
+                "@babel/generator": "^7.15.4",
+                "@babel/helper-compilation-targets": "^7.15.4",
+                "@babel/helper-module-transforms": "^7.15.4",
+                "@babel/helpers": "^7.15.4",
+                "@babel/parser": "^7.15.4",
+                "@babel/template": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -151,9 +151,9 @@
             }
         },
         "node_modules/@babel/eslint-parser": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.0.tgz",
-            "integrity": "sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.4.tgz",
+            "integrity": "sha512-hPMIAmGNbmQzXJIo2P43Zj9UhRmGev5f9nqdBFOWNGDGh6XKmjby79woBvg6y0Jur6yRfQBneDbUQ8ZVc1krFw==",
             "dev": true,
             "dependencies": {
                 "eslint-scope": "^5.1.1",
@@ -169,12 +169,12 @@
             }
         },
         "node_modules/@babel/generator": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
-            "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz",
+            "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.15.0",
+                "@babel/types": "^7.15.4",
                 "jsesc": "^2.5.1",
                 "source-map": "^0.5.0"
             },
@@ -192,9 +192,9 @@
             }
         },
         "node_modules/@babel/helper-compilation-targets": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz",
-            "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz",
+            "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==",
             "dev": true,
             "dependencies": {
                 "@babel/compat-data": "^7.15.0",
@@ -210,132 +210,132 @@
             }
         },
         "node_modules/@babel/helper-function-name": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
-            "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz",
+            "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-get-function-arity": "^7.14.5",
-                "@babel/template": "^7.14.5",
-                "@babel/types": "^7.14.5"
+                "@babel/helper-get-function-arity": "^7.15.4",
+                "@babel/template": "^7.15.4",
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-get-function-arity": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
-            "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz",
+            "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-hoist-variables": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
-            "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz",
+            "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-member-expression-to-functions": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz",
-            "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz",
+            "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.15.0"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-module-imports": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
-            "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz",
+            "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-module-transforms": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz",
-            "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz",
+            "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-module-imports": "^7.14.5",
-                "@babel/helper-replace-supers": "^7.15.0",
-                "@babel/helper-simple-access": "^7.14.8",
-                "@babel/helper-split-export-declaration": "^7.14.5",
+                "@babel/helper-module-imports": "^7.15.4",
+                "@babel/helper-replace-supers": "^7.15.4",
+                "@babel/helper-simple-access": "^7.15.4",
+                "@babel/helper-split-export-declaration": "^7.15.4",
                 "@babel/helper-validator-identifier": "^7.14.9",
-                "@babel/template": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0"
+                "@babel/template": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-optimise-call-expression": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
-            "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz",
+            "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-replace-supers": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz",
-            "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz",
+            "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==",
             "dev": true,
             "dependencies": {
-                "@babel/helper-member-expression-to-functions": "^7.15.0",
-                "@babel/helper-optimise-call-expression": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0"
+                "@babel/helper-member-expression-to-functions": "^7.15.4",
+                "@babel/helper-optimise-call-expression": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-simple-access": {
-            "version": "7.14.8",
-            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz",
-            "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz",
+            "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.14.8"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/helper-split-export-declaration": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
-            "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz",
+            "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==",
             "dev": true,
             "dependencies": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -359,14 +359,14 @@
             }
         },
         "node_modules/@babel/helpers": {
-            "version": "7.15.3",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz",
-            "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz",
+            "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==",
             "dev": true,
             "dependencies": {
-                "@babel/template": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0"
+                "@babel/template": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -458,9 +458,9 @@
             }
         },
         "node_modules/@babel/parser": {
-            "version": "7.15.3",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
-            "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz",
+            "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w==",
             "bin": {
                 "parser": "bin/babel-parser.js"
             },
@@ -469,23 +469,23 @@
             }
         },
         "node_modules/@babel/standalone": {
-            "version": "7.15.3",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.3.tgz",
-            "integrity": "sha512-Bst2YWEyQ2ROyO0+jxPVnnkSmUh44/x54+LSbe5M4N5LGfOkxpajEUKVE4ndXtIVrLlHCyuiqCPwv3eC1ItnCg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.4.tgz",
+            "integrity": "sha512-UO0QCTFjX5NSuwX/i8+/pesmRPoRTtf46Cpn8VHcXvNinEr2lxqe8Ix10TfU/UK5qsaOrcKk24We8wH1G0nTZA==",
             "dev": true,
             "engines": {
                 "node": ">=6.9.0"
             }
         },
         "node_modules/@babel/template": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
-            "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz",
+            "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.14.5",
-                "@babel/parser": "^7.14.5",
-                "@babel/types": "^7.14.5"
+                "@babel/parser": "^7.15.4",
+                "@babel/types": "^7.15.4"
             },
             "engines": {
                 "node": ">=6.9.0"
@@ -504,18 +504,18 @@
             }
         },
         "node_modules/@babel/traverse": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
-            "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz",
+            "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==",
             "dev": true,
             "dependencies": {
                 "@babel/code-frame": "^7.14.5",
-                "@babel/generator": "^7.15.0",
-                "@babel/helper-function-name": "^7.14.5",
-                "@babel/helper-hoist-variables": "^7.14.5",
-                "@babel/helper-split-export-declaration": "^7.14.5",
-                "@babel/parser": "^7.15.0",
-                "@babel/types": "^7.15.0",
+                "@babel/generator": "^7.15.4",
+                "@babel/helper-function-name": "^7.15.4",
+                "@babel/helper-hoist-variables": "^7.15.4",
+                "@babel/helper-split-export-declaration": "^7.15.4",
+                "@babel/parser": "^7.15.4",
+                "@babel/types": "^7.15.4",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             },
@@ -545,9 +545,9 @@
             }
         },
         "node_modules/@babel/types": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
-            "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz",
+            "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==",
             "dependencies": {
                 "@babel/helper-validator-identifier": "^7.14.9",
                 "to-fast-properties": "^2.0.0"
@@ -817,9 +817,9 @@
             }
         },
         "node_modules/@popperjs/core": {
-            "version": "2.9.3",
-            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
-            "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==",
+            "version": "2.10.1",
+            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz",
+            "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw==",
             "funding": {
                 "type": "opencollective",
                 "url": "https://opencollective.com/popperjs"
@@ -870,9 +870,9 @@
             }
         },
         "node_modules/@types/bootstrap": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.2.tgz",
-            "integrity": "sha512-dSQvMi2dMyNwJU6LZjP0pimuBowsMUvGScYdfqqeiDUoj9TxXZCpfu0cTl94U0Zvw/tdH9j/9ToOhi4LKNLZhg==",
+            "version": "5.1.4",
+            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.4.tgz",
+            "integrity": "sha512-VAY+o6sCKrJ7Xix/lugdvQz0PpOn7Go+fQzCXOZvIdp7E/TDaiJddInVhNB/84bk9NX6uuKFSfl2pqslNYH9aA==",
             "dev": true,
             "dependencies": {
                 "@popperjs/core": "^2.9.2",
@@ -1013,9 +1013,9 @@
             "dev": true
         },
         "node_modules/@types/node": {
-            "version": "16.7.8",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz",
-            "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg=="
+            "version": "16.7.10",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz",
+            "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA=="
         },
         "node_modules/@types/normalize-package-data": {
             "version": "2.4.1",
@@ -1061,9 +1061,9 @@
             "dev": true
         },
         "node_modules/@vitejs/plugin-legacy": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.1.tgz",
-            "integrity": "sha512-g+0iy0X3NJRUSKZK+OCeSxNWnCuuE/6lsmr2WLWPOEt1vp6LdfHuNCYRooCm6s0ccTZ/SiumVk8vt9DWSYs+8A==",
+            "version": "1.5.2",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.2.tgz",
+            "integrity": "sha512-b1CaWY/wi7gQZnZaxH+ujPTPb91bEPgnnk7l0WIwxoQtW5UC5MQywRcAbFX+Ise62exXctOMBtsnXKJw2KajXw==",
             "dev": true,
             "dependencies": {
                 "@babel/standalone": "^7.14.9",
@@ -1092,40 +1092,40 @@
             }
         },
         "node_modules/@vue/compiler-core": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.6.tgz",
-            "integrity": "sha512-vbwnz7+OhtLO5p5i630fTuQCL+MlUpEMTKHuX+RfetQ+3pFCkItt2JUH+9yMaBG2Hkz6av+T9mwN/acvtIwpbw==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.8.tgz",
+            "integrity": "sha512-Sx8qJ030+QM/NakUrkQuUGCeDEb+0d0AgFOl5W4qRvR6e+YgLnW2ew0jREf4T1hak9Fdk8Edl67StECHrhEuew==",
             "dependencies": {
                 "@babel/parser": "^7.15.0",
                 "@babel/types": "^7.15.0",
-                "@vue/shared": "3.2.6",
+                "@vue/shared": "3.2.8",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "node_modules/@vue/compiler-dom": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.6.tgz",
-            "integrity": "sha512-+a/3oBAzFIXhHt8L5IHJOTP4a5egzvpXYyi13jR7CUYOR1S+Zzv7vBWKYBnKyJLwnrxTZnTQVjeHCgJq743XKg==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.8.tgz",
+            "integrity": "sha512-nxBW6k8FMWQ74294CRbqR+iEJRO5vIjx85I3YCOyZFD6FsDHyFL60g76TcJzucp+F2XXIDaYz+A+F4gQlDatjw==",
             "dependencies": {
-                "@vue/compiler-core": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/compiler-core": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "node_modules/@vue/compiler-sfc": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.6.tgz",
-            "integrity": "sha512-Ariz1eDsf+2fw6oWXVwnBNtfKHav72RjlWXpEgozYBLnfRPzP+7jhJRw4Nq0OjSsLx2HqjF3QX7HutTjYB0/eA==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.8.tgz",
+            "integrity": "sha512-XClueQAXoWtN2EToKgfYH9FCL70Ac4bxx6OZFZzxYSg1bei8IB9srJP1UOfnJb2IpnM1heikAz1dp1HI1wHcyQ==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.15.0",
                 "@babel/types": "^7.15.0",
                 "@types/estree": "^0.0.48",
-                "@vue/compiler-core": "3.2.6",
-                "@vue/compiler-dom": "3.2.6",
-                "@vue/compiler-ssr": "3.2.6",
-                "@vue/ref-transform": "3.2.6",
-                "@vue/shared": "3.2.6",
+                "@vue/compiler-core": "3.2.8",
+                "@vue/compiler-dom": "3.2.8",
+                "@vue/compiler-ssr": "3.2.8",
+                "@vue/ref-transform": "3.2.8",
+                "@vue/shared": "3.2.8",
                 "consolidate": "^0.16.0",
                 "estree-walker": "^2.0.2",
                 "hash-sum": "^2.0.0",
@@ -1139,13 +1139,13 @@
             }
         },
         "node_modules/@vue/compiler-ssr": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.6.tgz",
-            "integrity": "sha512-A7IKRKHSyPnTC4w1FxHkjzoyjXInsXkcs/oX22nBQ+6AWlXj2Tt1le96CWPOXy5vYlsTYkF1IgfBaKIdeN/39g==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.8.tgz",
+            "integrity": "sha512-QqyiFRiIl55W0abDNQ6cNG/7iIfBHmbXVtssUAjX3IlI87ELeT0xackmrCyTSnfIX12ixljg9AN0COIZwlvt5A==",
             "dev": true,
             "dependencies": {
-                "@vue/compiler-dom": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/compiler-dom": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "node_modules/@vue/devtools-api": {
@@ -1154,49 +1154,49 @@
             "integrity": "sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA=="
         },
         "node_modules/@vue/reactivity": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.6.tgz",
-            "integrity": "sha512-8vIDD2wpCnYisNNZjmcIj+Rixn0uhZNY3G1vzlgdVdLygeRSuFjkmnZk6WwvGzUWpKfnG0e/NUySM3mVi59hAA==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.8.tgz",
+            "integrity": "sha512-/Hj3Uz28SG+xB5SDWPOXUs0emvHkq82EmTgk44/plTVFeswCZ3i3Hd7WmsrPT4rGajlDKd5uqMmW0ith1ED0FA==",
             "dependencies": {
-                "@vue/shared": "3.2.6"
+                "@vue/shared": "3.2.8"
             }
         },
         "node_modules/@vue/ref-transform": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.6.tgz",
-            "integrity": "sha512-ie39+Y4nbirDLvH+WEq6Eo/l3n3mFATayqR+kEMSphrtMW6Uh/eEMx1Gk2Jnf82zmj3VLRq7dnmPx72JLcBYkQ==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.8.tgz",
+            "integrity": "sha512-9LdADd4JM3klt+b2qNT8a7b7JvBETNBy2Btv5rDzyPrAVS4Vrw+1WWay6gZBgnxfJ9TPSvG8f/9zu6gNGHmJLA==",
             "dev": true,
             "dependencies": {
                 "@babel/parser": "^7.15.0",
-                "@vue/compiler-core": "3.2.6",
-                "@vue/shared": "3.2.6",
+                "@vue/compiler-core": "3.2.8",
+                "@vue/shared": "3.2.8",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             }
         },
         "node_modules/@vue/runtime-core": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.6.tgz",
-            "integrity": "sha512-3mqtgpj/YSGFxtvTufSERRApo92B16JNNxz9p+5eG6PPuqTmuRJz214MqhKBEgLEAIQ6R6YCbd83ZDtjQnyw2g==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.8.tgz",
+            "integrity": "sha512-hwzXLGw1njBEY5JSyRXIIdCtzMFFF6F38WcKMmoIE3p7da30jEbWt8EwwrBomjT8ZbqzElOGlewBcnXNOiiIUg==",
             "dependencies": {
-                "@vue/reactivity": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/reactivity": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "node_modules/@vue/runtime-dom": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.6.tgz",
-            "integrity": "sha512-fq33urnP0BNCGm2O3KCzkJlKIHI80C94HJ4qDZbjsTtxyOn5IHqwKSqXVN3RQvO6epcQH+sWS+JNwcNDPzoasg==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.8.tgz",
+            "integrity": "sha512-A/aRrlGLJ5y4Z7eNbnO/xHwx2RiPijQo7D3OIwESroG3HNP+dpuoqamajo5TXS9ZGjbMOih82COoe7xb9P4BZw==",
             "dependencies": {
-                "@vue/runtime-core": "3.2.6",
-                "@vue/shared": "3.2.6",
+                "@vue/runtime-core": "3.2.8",
+                "@vue/shared": "3.2.8",
                 "csstype": "^2.6.8"
             }
         },
         "node_modules/@vue/shared": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.6.tgz",
-            "integrity": "sha512-uwX0Qs2e6kdF+WmxwuxJxOnKs/wEkMArtYpHSm7W+VY/23Tl8syMRyjnzEeXrNCAP0/8HZxEGkHJsjPEDNRuHw=="
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.8.tgz",
+            "integrity": "sha512-E2DQQnG7Qr4GwTs3GlfPPlHliGVADoufTnhpwfoViw7JlyLMmYtjfnTwM6nXAwvSJWiF7D+7AxpnWBBT3VWo6Q=="
         },
         "node_modules/abbrev": {
             "version": "1.1.1",
@@ -1315,9 +1315,9 @@
             "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
         },
         "node_modules/are-we-there-yet": {
-            "version": "1.1.5",
-            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-            "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+            "version": "1.1.7",
+            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+            "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
             "dependencies": {
                 "delegates": "^1.0.0",
                 "readable-stream": "^2.0.6"
@@ -2022,9 +2022,9 @@
             "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
         },
         "node_modules/core-js": {
-            "version": "3.16.4",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.4.tgz",
-            "integrity": "sha512-Tq4GVE6XCjE+hcyW6hPy0ofN3hwtLudz5ZRdrlCnsnD/xkm/PWQRudzYHiKgZKUcefV6Q57fhDHjZHJP5dpfSg==",
+            "version": "3.17.2",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.2.tgz",
+            "integrity": "sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA==",
             "dev": true,
             "hasInstallScript": true,
             "funding": {
@@ -2033,9 +2033,9 @@
             }
         },
         "node_modules/core-util-is": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+            "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
         },
         "node_modules/cors": {
             "version": "2.8.5",
@@ -2313,9 +2313,9 @@
             "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
         },
         "node_modules/electron-to-chromium": {
-            "version": "1.3.824",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.824.tgz",
-            "integrity": "sha512-Fk+5aD0HDi9i9ZKt9n2VPOZO1dQy7PV++hz2wJ/KIn+CvVfu4fny39squHtyVDPuHNuoJGAZIbuReEklqYIqfA==",
+            "version": "1.3.830",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz",
+            "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==",
             "dev": true
         },
         "node_modules/emoji-regex": {
@@ -2431,9 +2431,9 @@
             }
         },
         "node_modules/esbuild": {
-            "version": "0.12.24",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.24.tgz",
-            "integrity": "sha512-C0ibY+HsXzYB6L/pLWEiWjMpghKsIc58Q5yumARwBQsHl9DXPakW+5NI/Y9w4YXiz0PEP6XTGTT/OV4Nnsmb4A==",
+            "version": "0.12.25",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.25.tgz",
+            "integrity": "sha512-woie0PosbRSoN8gQytrdCzUbS2ByKgO8nD1xCZkEup3D9q92miCze4PqEI9TZDYAuwn6CruEnQpJxgTRWdooAg==",
             "dev": true,
             "hasInstallScript": true,
             "bin": {
@@ -2960,9 +2960,9 @@
             "dev": true
         },
         "node_modules/follow-redirects": {
-            "version": "1.14.2",
-            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
-            "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==",
+            "version": "1.14.3",
+            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz",
+            "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==",
             "funding": [
                 {
                     "type": "individual",
@@ -3922,9 +3922,9 @@
             }
         },
         "node_modules/knex": {
-            "version": "0.95.10",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.10.tgz",
-            "integrity": "sha512-I60A8TXcMdeJlE6h7DSgEYyY37S7kgLObz1qlJ7QvPMD6vnKO5dtuLEht5pMia9Qf5BomqVgkWCdVTqcC/ImOA==",
+            "version": "0.95.11",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.11.tgz",
+            "integrity": "sha512-grDetD91O8VoQVCFqeWTgkzdq5406W6rggF/lK1hHuwzmjDs/0m9KxyncGdZbklTi7aUgHvw3+Cfy4x7FvpdaQ==",
             "dependencies": {
                 "colorette": "1.2.1",
                 "commander": "^7.1.0",
@@ -5789,9 +5789,9 @@
             }
         },
         "node_modules/redbean-node/node_modules/@types/node": {
-            "version": "14.17.12",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.12.tgz",
-            "integrity": "sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw=="
+            "version": "14.17.14",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz",
+            "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A=="
         },
         "node_modules/redent": {
             "version": "3.0.0",
@@ -6032,9 +6032,9 @@
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
         "node_modules/sass": {
-            "version": "1.38.2",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.2.tgz",
-            "integrity": "sha512-Bz1fG6qiyF0FX6m/I+VxtdVKz1Dfmg/e9kfDy2PhWOkq3T384q2KxwIfP0fXpeI+EyyETdOauH+cRHQDFASllA==",
+            "version": "1.39.0",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.0.tgz",
+            "integrity": "sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg==",
             "dev": true,
             "dependencies": {
                 "chokidar": ">=3.0.0 <4.0.0"
@@ -7220,6 +7220,12 @@
                 "extsprintf": "^1.2.0"
             }
         },
+        "node_modules/verror/node_modules/core-util-is": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+            "optional": true
+        },
         "node_modules/vfile": {
             "version": "4.2.1",
             "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
@@ -7251,9 +7257,9 @@
             }
         },
         "node_modules/vite": {
-            "version": "2.5.2",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.2.tgz",
-            "integrity": "sha512-JK5uhiVyMqHiAJbgBa8rCvpP8bEhAE9dKDv1gCmP+EUP2FSPmEeW3WXlCXauPB3MDa8behPW+ntyNXqnGaxslg==",
+            "version": "2.5.3",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.3.tgz",
+            "integrity": "sha512-1wMDnjflvtTTkMov8O/Xb5+w1/VW/Gw8oCf8f6dqgHn8lMOEqq0SaPtFEQeikFcOKCfSbiU0nEi0LDIx6DNsaQ==",
             "dev": true,
             "dependencies": {
                 "esbuild": "^0.12.17",
@@ -7272,19 +7278,19 @@
             }
         },
         "node_modules/vue": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.6.tgz",
-            "integrity": "sha512-Zlb3LMemQS3Xxa6xPsecu45bNjr1hxO8Bh5FUmE0Dr6Ot0znZBKiM47rK6O7FTcakxOnvVN+NTXWJF6u8ajpCQ==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.8.tgz",
+            "integrity": "sha512-x7lwdnOSkceHQUXRVVHBaZzcp6v7M2CYtSZH75zZaT1mTjB4plC4KZHKP/5jAvdqOLBHZGwDSMkWXm3YbAufrA==",
             "dependencies": {
-                "@vue/compiler-dom": "3.2.6",
-                "@vue/runtime-dom": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/compiler-dom": "3.2.8",
+                "@vue/runtime-dom": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "node_modules/vue-chart-3": {
-            "version": "0.5.7",
-            "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.7.tgz",
-            "integrity": "sha512-BccfPv2rodY6IOppYHvMluVmIJE1CHfp5uW2DXrHrm1kIzaafLwpQ5SwdrxuCevn/QhKoi7azzcxwRcoWbX9hg==",
+            "version": "0.5.8",
+            "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.8.tgz",
+            "integrity": "sha512-VJEBTdMgWOaYqekXtz4LVBIeYyIx3qDlQnFyY4Ao1GwizokYZBycCeRN3oKDcYbbZi5yxYqTy6+Tm+m+SOPUPA==",
             "dependencies": {
                 "@vue/runtime-core": "latest",
                 "@vue/runtime-dom": "latest",
@@ -7560,20 +7566,20 @@
             "dev": true
         },
         "@babel/core": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz",
-            "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.4.tgz",
+            "integrity": "sha512-Lkcv9I4a8bgUI8LJOLM6IKv6hnz1KOju6KM1lceqVMKlKKqNRopYd2Pc9MgIurqvMJ6BooemrnJz8jlIiQIpsA==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.14.5",
-                "@babel/generator": "^7.15.0",
-                "@babel/helper-compilation-targets": "^7.15.0",
-                "@babel/helper-module-transforms": "^7.15.0",
-                "@babel/helpers": "^7.14.8",
-                "@babel/parser": "^7.15.0",
-                "@babel/template": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0",
+                "@babel/generator": "^7.15.4",
+                "@babel/helper-compilation-targets": "^7.15.4",
+                "@babel/helper-module-transforms": "^7.15.4",
+                "@babel/helpers": "^7.15.4",
+                "@babel/parser": "^7.15.4",
+                "@babel/template": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4",
                 "convert-source-map": "^1.7.0",
                 "debug": "^4.1.0",
                 "gensync": "^1.0.0-beta.2",
@@ -7609,9 +7615,9 @@
             }
         },
         "@babel/eslint-parser": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.0.tgz",
-            "integrity": "sha512-+gSPtjSBxOZz4Uh8Ggqu7HbfpB8cT1LwW0DnVVLZEJvzXauiD0Di3zszcBkRmfGGrLdYeHUwcflG7i3tr9kQlw==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.15.4.tgz",
+            "integrity": "sha512-hPMIAmGNbmQzXJIo2P43Zj9UhRmGev5f9nqdBFOWNGDGh6XKmjby79woBvg6y0Jur6yRfQBneDbUQ8ZVc1krFw==",
             "dev": true,
             "requires": {
                 "eslint-scope": "^5.1.1",
@@ -7620,12 +7626,12 @@
             }
         },
         "@babel/generator": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
-            "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.4.tgz",
+            "integrity": "sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.15.0",
+                "@babel/types": "^7.15.4",
                 "jsesc": "^2.5.1",
                 "source-map": "^0.5.0"
             },
@@ -7639,9 +7645,9 @@
             }
         },
         "@babel/helper-compilation-targets": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz",
-            "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz",
+            "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==",
             "dev": true,
             "requires": {
                 "@babel/compat-data": "^7.15.0",
@@ -7651,105 +7657,105 @@
             }
         },
         "@babel/helper-function-name": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
-            "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz",
+            "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==",
             "dev": true,
             "requires": {
-                "@babel/helper-get-function-arity": "^7.14.5",
-                "@babel/template": "^7.14.5",
-                "@babel/types": "^7.14.5"
+                "@babel/helper-get-function-arity": "^7.15.4",
+                "@babel/template": "^7.15.4",
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-get-function-arity": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
-            "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz",
+            "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-hoist-variables": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
-            "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz",
+            "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-member-expression-to-functions": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz",
-            "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz",
+            "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.15.0"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-module-imports": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
-            "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz",
+            "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-module-transforms": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz",
-            "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz",
+            "integrity": "sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==",
             "dev": true,
             "requires": {
-                "@babel/helper-module-imports": "^7.14.5",
-                "@babel/helper-replace-supers": "^7.15.0",
-                "@babel/helper-simple-access": "^7.14.8",
-                "@babel/helper-split-export-declaration": "^7.14.5",
+                "@babel/helper-module-imports": "^7.15.4",
+                "@babel/helper-replace-supers": "^7.15.4",
+                "@babel/helper-simple-access": "^7.15.4",
+                "@babel/helper-split-export-declaration": "^7.15.4",
                 "@babel/helper-validator-identifier": "^7.14.9",
-                "@babel/template": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0"
+                "@babel/template": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-optimise-call-expression": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
-            "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz",
+            "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-replace-supers": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz",
-            "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz",
+            "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==",
             "dev": true,
             "requires": {
-                "@babel/helper-member-expression-to-functions": "^7.15.0",
-                "@babel/helper-optimise-call-expression": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0"
+                "@babel/helper-member-expression-to-functions": "^7.15.4",
+                "@babel/helper-optimise-call-expression": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-simple-access": {
-            "version": "7.14.8",
-            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz",
-            "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz",
+            "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.14.8"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-split-export-declaration": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
-            "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz",
+            "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==",
             "dev": true,
             "requires": {
-                "@babel/types": "^7.14.5"
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/helper-validator-identifier": {
@@ -7764,14 +7770,14 @@
             "dev": true
         },
         "@babel/helpers": {
-            "version": "7.15.3",
-            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz",
-            "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz",
+            "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==",
             "dev": true,
             "requires": {
-                "@babel/template": "^7.14.5",
-                "@babel/traverse": "^7.15.0",
-                "@babel/types": "^7.15.0"
+                "@babel/template": "^7.15.4",
+                "@babel/traverse": "^7.15.4",
+                "@babel/types": "^7.15.4"
             }
         },
         "@babel/highlight": {
@@ -7844,25 +7850,25 @@
             }
         },
         "@babel/parser": {
-            "version": "7.15.3",
-            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
-            "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA=="
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.4.tgz",
+            "integrity": "sha512-xmzz+7fRpjrvDUj+GV7zfz/R3gSK2cOxGlazaXooxspCr539cbTXJKvBJzSVI2pPhcRGquoOtaIkKCsHQUiO3w=="
         },
         "@babel/standalone": {
-            "version": "7.15.3",
-            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.3.tgz",
-            "integrity": "sha512-Bst2YWEyQ2ROyO0+jxPVnnkSmUh44/x54+LSbe5M4N5LGfOkxpajEUKVE4ndXtIVrLlHCyuiqCPwv3eC1ItnCg==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.15.4.tgz",
+            "integrity": "sha512-UO0QCTFjX5NSuwX/i8+/pesmRPoRTtf46Cpn8VHcXvNinEr2lxqe8Ix10TfU/UK5qsaOrcKk24We8wH1G0nTZA==",
             "dev": true
         },
         "@babel/template": {
-            "version": "7.14.5",
-            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
-            "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz",
+            "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.14.5",
-                "@babel/parser": "^7.14.5",
-                "@babel/types": "^7.14.5"
+                "@babel/parser": "^7.15.4",
+                "@babel/types": "^7.15.4"
             },
             "dependencies": {
                 "@babel/code-frame": {
@@ -7877,18 +7883,18 @@
             }
         },
         "@babel/traverse": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
-            "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz",
+            "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.14.5",
-                "@babel/generator": "^7.15.0",
-                "@babel/helper-function-name": "^7.14.5",
-                "@babel/helper-hoist-variables": "^7.14.5",
-                "@babel/helper-split-export-declaration": "^7.14.5",
-                "@babel/parser": "^7.15.0",
-                "@babel/types": "^7.15.0",
+                "@babel/generator": "^7.15.4",
+                "@babel/helper-function-name": "^7.15.4",
+                "@babel/helper-hoist-variables": "^7.15.4",
+                "@babel/helper-split-export-declaration": "^7.15.4",
+                "@babel/parser": "^7.15.4",
+                "@babel/types": "^7.15.4",
                 "debug": "^4.1.0",
                 "globals": "^11.1.0"
             },
@@ -7911,9 +7917,9 @@
             }
         },
         "@babel/types": {
-            "version": "7.15.0",
-            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
-            "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
+            "version": "7.15.4",
+            "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.4.tgz",
+            "integrity": "sha512-0f1HJFuGmmbrKTCZtbm3cU+b/AqdEYk5toj5iQur58xkVMlS0JWaKxTBSmCXd47uiN7vbcozAupm6Mvs80GNhw==",
             "requires": {
                 "@babel/helper-validator-identifier": "^7.14.9",
                 "to-fast-properties": "^2.0.0"
@@ -7968,8 +7974,7 @@
         "@fortawesome/vue-fontawesome": {
             "version": "3.0.0-4",
             "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.0-4.tgz",
-            "integrity": "sha512-dQVhhMRcUPCb0aqk5ohm0KGk5OJ7wFZ9aYapLzJB3Z+xs7LhkRWLTb87reelUAG5PFDjutDAXuloT9hi6cz72A==",
-            "requires": {}
+            "integrity": "sha512-dQVhhMRcUPCb0aqk5ohm0KGk5OJ7wFZ9aYapLzJB3Z+xs7LhkRWLTb87reelUAG5PFDjutDAXuloT9hi6cz72A=="
         },
         "@humanwhocodes/config-array": {
             "version": "0.5.0",
@@ -8115,9 +8120,9 @@
             }
         },
         "@popperjs/core": {
-            "version": "2.9.3",
-            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
-            "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ=="
+            "version": "2.10.1",
+            "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.10.1.tgz",
+            "integrity": "sha512-HnUhk1Sy9IuKrxEMdIRCxpIqPw6BFsbYSEUO9p/hNw5sMld/+3OLMWQP80F8/db9qsv3qUjs7ZR5bS/R+iinXw=="
         },
         "@stylelint/postcss-css-in-js": {
             "version": "0.37.2",
@@ -8156,9 +8161,9 @@
             }
         },
         "@types/bootstrap": {
-            "version": "5.1.2",
-            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.2.tgz",
-            "integrity": "sha512-dSQvMi2dMyNwJU6LZjP0pimuBowsMUvGScYdfqqeiDUoj9TxXZCpfu0cTl94U0Zvw/tdH9j/9ToOhi4LKNLZhg==",
+            "version": "5.1.4",
+            "resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.4.tgz",
+            "integrity": "sha512-VAY+o6sCKrJ7Xix/lugdvQz0PpOn7Go+fQzCXOZvIdp7E/TDaiJddInVhNB/84bk9NX6uuKFSfl2pqslNYH9aA==",
             "dev": true,
             "requires": {
                 "@popperjs/core": "^2.9.2",
@@ -8299,9 +8304,9 @@
             "dev": true
         },
         "@types/node": {
-            "version": "16.7.8",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.8.tgz",
-            "integrity": "sha512-8upnoQU0OPzbIkm+ZMM0zCeFCkw2s3mS0IWdx0+AAaWqm4fkBb0UJp8Edl7FVKRamYbpJC/aVsHpKWBIbiC7Zg=="
+            "version": "16.7.10",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.10.tgz",
+            "integrity": "sha512-S63Dlv4zIPb8x6MMTgDq5WWRJQe56iBEY0O3SOFA9JrRienkOVDXSXBjjJw6HTNQYSE2JI6GMCR6LVbIMHJVvA=="
         },
         "@types/normalize-package-data": {
             "version": "2.4.1",
@@ -8347,9 +8352,9 @@
             "dev": true
         },
         "@vitejs/plugin-legacy": {
-            "version": "1.5.1",
-            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.1.tgz",
-            "integrity": "sha512-g+0iy0X3NJRUSKZK+OCeSxNWnCuuE/6lsmr2WLWPOEt1vp6LdfHuNCYRooCm6s0ccTZ/SiumVk8vt9DWSYs+8A==",
+            "version": "1.5.2",
+            "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-1.5.2.tgz",
+            "integrity": "sha512-b1CaWY/wi7gQZnZaxH+ujPTPb91bEPgnnk7l0WIwxoQtW5UC5MQywRcAbFX+Ise62exXctOMBtsnXKJw2KajXw==",
             "dev": true,
             "requires": {
                 "@babel/standalone": "^7.14.9",
@@ -8363,44 +8368,43 @@
             "version": "1.6.0",
             "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-1.6.0.tgz",
             "integrity": "sha512-n3i8htn8pTg9M+kM3cnEfsPZx/6ngInlTroth6fA1LQTJq5aTVQ8ggaE5pPoAy9vCgHPtcaXMzwpldhqRAkebQ==",
-            "dev": true,
-            "requires": {}
+            "dev": true
         },
         "@vue/compiler-core": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.6.tgz",
-            "integrity": "sha512-vbwnz7+OhtLO5p5i630fTuQCL+MlUpEMTKHuX+RfetQ+3pFCkItt2JUH+9yMaBG2Hkz6av+T9mwN/acvtIwpbw==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.8.tgz",
+            "integrity": "sha512-Sx8qJ030+QM/NakUrkQuUGCeDEb+0d0AgFOl5W4qRvR6e+YgLnW2ew0jREf4T1hak9Fdk8Edl67StECHrhEuew==",
             "requires": {
                 "@babel/parser": "^7.15.0",
                 "@babel/types": "^7.15.0",
-                "@vue/shared": "3.2.6",
+                "@vue/shared": "3.2.8",
                 "estree-walker": "^2.0.2",
                 "source-map": "^0.6.1"
             }
         },
         "@vue/compiler-dom": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.6.tgz",
-            "integrity": "sha512-+a/3oBAzFIXhHt8L5IHJOTP4a5egzvpXYyi13jR7CUYOR1S+Zzv7vBWKYBnKyJLwnrxTZnTQVjeHCgJq743XKg==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.8.tgz",
+            "integrity": "sha512-nxBW6k8FMWQ74294CRbqR+iEJRO5vIjx85I3YCOyZFD6FsDHyFL60g76TcJzucp+F2XXIDaYz+A+F4gQlDatjw==",
             "requires": {
-                "@vue/compiler-core": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/compiler-core": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "@vue/compiler-sfc": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.6.tgz",
-            "integrity": "sha512-Ariz1eDsf+2fw6oWXVwnBNtfKHav72RjlWXpEgozYBLnfRPzP+7jhJRw4Nq0OjSsLx2HqjF3QX7HutTjYB0/eA==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.8.tgz",
+            "integrity": "sha512-XClueQAXoWtN2EToKgfYH9FCL70Ac4bxx6OZFZzxYSg1bei8IB9srJP1UOfnJb2IpnM1heikAz1dp1HI1wHcyQ==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.15.0",
                 "@babel/types": "^7.15.0",
                 "@types/estree": "^0.0.48",
-                "@vue/compiler-core": "3.2.6",
-                "@vue/compiler-dom": "3.2.6",
-                "@vue/compiler-ssr": "3.2.6",
-                "@vue/ref-transform": "3.2.6",
-                "@vue/shared": "3.2.6",
+                "@vue/compiler-core": "3.2.8",
+                "@vue/compiler-dom": "3.2.8",
+                "@vue/compiler-ssr": "3.2.8",
+                "@vue/ref-transform": "3.2.8",
+                "@vue/shared": "3.2.8",
                 "consolidate": "^0.16.0",
                 "estree-walker": "^2.0.2",
                 "hash-sum": "^2.0.0",
@@ -8414,13 +8418,13 @@
             }
         },
         "@vue/compiler-ssr": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.6.tgz",
-            "integrity": "sha512-A7IKRKHSyPnTC4w1FxHkjzoyjXInsXkcs/oX22nBQ+6AWlXj2Tt1le96CWPOXy5vYlsTYkF1IgfBaKIdeN/39g==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.8.tgz",
+            "integrity": "sha512-QqyiFRiIl55W0abDNQ6cNG/7iIfBHmbXVtssUAjX3IlI87ELeT0xackmrCyTSnfIX12ixljg9AN0COIZwlvt5A==",
             "dev": true,
             "requires": {
-                "@vue/compiler-dom": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/compiler-dom": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "@vue/devtools-api": {
@@ -8429,49 +8433,49 @@
             "integrity": "sha512-quBx4Jjpexo6KDiNUGFr/zF/2A4srKM9S9v2uHgMXSU//hjgq1eGzqkIFql8T9gfX5ZaVOUzYBP3jIdIR3PKIA=="
         },
         "@vue/reactivity": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.6.tgz",
-            "integrity": "sha512-8vIDD2wpCnYisNNZjmcIj+Rixn0uhZNY3G1vzlgdVdLygeRSuFjkmnZk6WwvGzUWpKfnG0e/NUySM3mVi59hAA==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.8.tgz",
+            "integrity": "sha512-/Hj3Uz28SG+xB5SDWPOXUs0emvHkq82EmTgk44/plTVFeswCZ3i3Hd7WmsrPT4rGajlDKd5uqMmW0ith1ED0FA==",
             "requires": {
-                "@vue/shared": "3.2.6"
+                "@vue/shared": "3.2.8"
             }
         },
         "@vue/ref-transform": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.6.tgz",
-            "integrity": "sha512-ie39+Y4nbirDLvH+WEq6Eo/l3n3mFATayqR+kEMSphrtMW6Uh/eEMx1Gk2Jnf82zmj3VLRq7dnmPx72JLcBYkQ==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.8.tgz",
+            "integrity": "sha512-9LdADd4JM3klt+b2qNT8a7b7JvBETNBy2Btv5rDzyPrAVS4Vrw+1WWay6gZBgnxfJ9TPSvG8f/9zu6gNGHmJLA==",
             "dev": true,
             "requires": {
                 "@babel/parser": "^7.15.0",
-                "@vue/compiler-core": "3.2.6",
-                "@vue/shared": "3.2.6",
+                "@vue/compiler-core": "3.2.8",
+                "@vue/shared": "3.2.8",
                 "estree-walker": "^2.0.2",
                 "magic-string": "^0.25.7"
             }
         },
         "@vue/runtime-core": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.6.tgz",
-            "integrity": "sha512-3mqtgpj/YSGFxtvTufSERRApo92B16JNNxz9p+5eG6PPuqTmuRJz214MqhKBEgLEAIQ6R6YCbd83ZDtjQnyw2g==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.8.tgz",
+            "integrity": "sha512-hwzXLGw1njBEY5JSyRXIIdCtzMFFF6F38WcKMmoIE3p7da30jEbWt8EwwrBomjT8ZbqzElOGlewBcnXNOiiIUg==",
             "requires": {
-                "@vue/reactivity": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/reactivity": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "@vue/runtime-dom": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.6.tgz",
-            "integrity": "sha512-fq33urnP0BNCGm2O3KCzkJlKIHI80C94HJ4qDZbjsTtxyOn5IHqwKSqXVN3RQvO6epcQH+sWS+JNwcNDPzoasg==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.8.tgz",
+            "integrity": "sha512-A/aRrlGLJ5y4Z7eNbnO/xHwx2RiPijQo7D3OIwESroG3HNP+dpuoqamajo5TXS9ZGjbMOih82COoe7xb9P4BZw==",
             "requires": {
-                "@vue/runtime-core": "3.2.6",
-                "@vue/shared": "3.2.6",
+                "@vue/runtime-core": "3.2.8",
+                "@vue/shared": "3.2.8",
                 "csstype": "^2.6.8"
             }
         },
         "@vue/shared": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.6.tgz",
-            "integrity": "sha512-uwX0Qs2e6kdF+WmxwuxJxOnKs/wEkMArtYpHSm7W+VY/23Tl8syMRyjnzEeXrNCAP0/8HZxEGkHJsjPEDNRuHw=="
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.8.tgz",
+            "integrity": "sha512-E2DQQnG7Qr4GwTs3GlfPPlHliGVADoufTnhpwfoViw7JlyLMmYtjfnTwM6nXAwvSJWiF7D+7AxpnWBBT3VWo6Q=="
         },
         "abbrev": {
             "version": "1.1.1",
@@ -8497,8 +8501,7 @@
             "version": "5.3.2",
             "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
             "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-            "dev": true,
-            "requires": {}
+            "dev": true
         },
         "agent-base": {
             "version": "6.0.2",
@@ -8557,9 +8560,9 @@
             "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
         },
         "are-we-there-yet": {
-            "version": "1.1.5",
-            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-            "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+            "version": "1.1.7",
+            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+            "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
             "requires": {
                 "delegates": "^1.0.0",
                 "readable-stream": "^2.0.6"
@@ -8853,8 +8856,7 @@
         "bootstrap": {
             "version": "5.1.0",
             "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.0.tgz",
-            "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew==",
-            "requires": {}
+            "integrity": "sha512-bs74WNI9BgBo3cEovmdMHikSKoXnDgA6VQjJ7TyTotU6L7d41ZyCEEelPwkYEzsG/Zjv3ie9IE3EMAje0W9Xew=="
         },
         "brace-expansion": {
             "version": "1.1.11",
@@ -8968,8 +8970,7 @@
         "chartjs-adapter-dayjs": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/chartjs-adapter-dayjs/-/chartjs-adapter-dayjs-1.0.0.tgz",
-            "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg==",
-            "requires": {}
+            "integrity": "sha512-EnbVqTJGFKLpg1TROLdCEufrzbmIa2oeLGx8O2Wdjw2EoMudoOo9+YFu+6CM0Z0hQ/v3yq/e/Y6efQMu22n8Jg=="
         },
         "chokidar": {
             "version": "3.5.2",
@@ -9107,15 +9108,15 @@
             "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
         },
         "core-js": {
-            "version": "3.16.4",
-            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.16.4.tgz",
-            "integrity": "sha512-Tq4GVE6XCjE+hcyW6hPy0ofN3hwtLudz5ZRdrlCnsnD/xkm/PWQRudzYHiKgZKUcefV6Q57fhDHjZHJP5dpfSg==",
+            "version": "3.17.2",
+            "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.2.tgz",
+            "integrity": "sha512-XkbXqhcXeMHPRk2ItS+zQYliAMilea2euoMsnpRRdDad6b2VY6CQQcwz1K8AnWesfw4p165RzY0bTnr3UrbYiA==",
             "dev": true
         },
         "core-util-is": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-            "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+            "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
         },
         "cors": {
             "version": "2.8.5",
@@ -9335,9 +9336,9 @@
             "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
         },
         "electron-to-chromium": {
-            "version": "1.3.824",
-            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.824.tgz",
-            "integrity": "sha512-Fk+5aD0HDi9i9ZKt9n2VPOZO1dQy7PV++hz2wJ/KIn+CvVfu4fny39squHtyVDPuHNuoJGAZIbuReEklqYIqfA==",
+            "version": "1.3.830",
+            "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.830.tgz",
+            "integrity": "sha512-gBN7wNAxV5vl1430dG+XRcQhD4pIeYeak6p6rjdCtlz5wWNwDad8jwvphe5oi1chL5MV6RNRikfffBBiFuj+rQ==",
             "dev": true
         },
         "emoji-regex": {
@@ -9434,9 +9435,9 @@
             }
         },
         "esbuild": {
-            "version": "0.12.24",
-            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.24.tgz",
-            "integrity": "sha512-C0ibY+HsXzYB6L/pLWEiWjMpghKsIc58Q5yumARwBQsHl9DXPakW+5NI/Y9w4YXiz0PEP6XTGTT/OV4Nnsmb4A==",
+            "version": "0.12.25",
+            "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.25.tgz",
+            "integrity": "sha512-woie0PosbRSoN8gQytrdCzUbS2ByKgO8nD1xCZkEup3D9q92miCze4PqEI9TZDYAuwn6CruEnQpJxgTRWdooAg==",
             "dev": true
         },
         "escalade": {
@@ -9861,9 +9862,9 @@
             "dev": true
         },
         "follow-redirects": {
-            "version": "1.14.2",
-            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.2.tgz",
-            "integrity": "sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA=="
+            "version": "1.14.3",
+            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz",
+            "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw=="
         },
         "forever-agent": {
             "version": "0.6.1",
@@ -10261,8 +10262,7 @@
             "version": "5.1.0",
             "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
             "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
-            "dev": true,
-            "requires": {}
+            "dev": true
         },
         "ignore": {
             "version": "4.0.6",
@@ -10584,9 +10584,9 @@
             "dev": true
         },
         "knex": {
-            "version": "0.95.10",
-            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.10.tgz",
-            "integrity": "sha512-I60A8TXcMdeJlE6h7DSgEYyY37S7kgLObz1qlJ7QvPMD6vnKO5dtuLEht5pMia9Qf5BomqVgkWCdVTqcC/ImOA==",
+            "version": "0.95.11",
+            "resolved": "https://registry.npmjs.org/knex/-/knex-0.95.11.tgz",
+            "integrity": "sha512-grDetD91O8VoQVCFqeWTgkzdq5406W6rggF/lK1hHuwzmjDs/0m9KxyncGdZbklTi7aUgHvw3+Cfy4x7FvpdaQ==",
             "requires": {
                 "colorette": "1.2.1",
                 "commander": "^7.1.0",
@@ -11463,8 +11463,7 @@
             "version": "3.0.0",
             "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
             "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
-            "dev": true,
-            "requires": {}
+            "dev": true
         },
         "postcss-modules-local-by-default": {
             "version": "4.0.0",
@@ -11783,8 +11782,7 @@
             "version": "0.36.2",
             "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
             "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
-            "dev": true,
-            "requires": {}
+            "dev": true
         },
         "postcss-value-parser": {
             "version": "4.1.0",
@@ -12002,9 +12000,9 @@
             },
             "dependencies": {
                 "@types/node": {
-                    "version": "14.17.12",
-                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.12.tgz",
-                    "integrity": "sha512-vhUqgjJR1qxwTWV5Ps5txuy2XMdf7Fw+OrdChRboy8BmWUPkckOhphaohzFG6b8DW7CrxaBMdrdJ47SYFq1okw=="
+                    "version": "14.17.14",
+                    "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz",
+                    "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A=="
                 }
             }
         },
@@ -12176,9 +12174,9 @@
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
         },
         "sass": {
-            "version": "1.38.2",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.38.2.tgz",
-            "integrity": "sha512-Bz1fG6qiyF0FX6m/I+VxtdVKz1Dfmg/e9kfDy2PhWOkq3T384q2KxwIfP0fXpeI+EyyETdOauH+cRHQDFASllA==",
+            "version": "1.39.0",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.39.0.tgz",
+            "integrity": "sha512-F4o+RhJkNOIG0b6QudYU8c78ZADKZjKDk5cyrf8XTKWfrgbtyVVXImFstJrc+1pkQDCggyidIOytq6gS4gCCZg==",
             "dev": true,
             "requires": {
                 "chokidar": ">=3.0.0 <4.0.0"
@@ -12680,8 +12678,7 @@
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz",
             "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==",
-            "dev": true,
-            "requires": {}
+            "dev": true
         },
         "stylelint-config-standard": {
             "version": "22.0.0",
@@ -13113,6 +13110,14 @@
                 "assert-plus": "^1.0.0",
                 "core-util-is": "1.0.2",
                 "extsprintf": "^1.2.0"
+            },
+            "dependencies": {
+                "core-util-is": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+                    "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+                    "optional": true
+                }
             }
         },
         "vfile": {
@@ -13138,9 +13143,9 @@
             }
         },
         "vite": {
-            "version": "2.5.2",
-            "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.2.tgz",
-            "integrity": "sha512-JK5uhiVyMqHiAJbgBa8rCvpP8bEhAE9dKDv1gCmP+EUP2FSPmEeW3WXlCXauPB3MDa8behPW+ntyNXqnGaxslg==",
+            "version": "2.5.3",
+            "resolved": "https://registry.npmjs.org/vite/-/vite-2.5.3.tgz",
+            "integrity": "sha512-1wMDnjflvtTTkMov8O/Xb5+w1/VW/Gw8oCf8f6dqgHn8lMOEqq0SaPtFEQeikFcOKCfSbiU0nEi0LDIx6DNsaQ==",
             "dev": true,
             "requires": {
                 "esbuild": "^0.12.17",
@@ -13151,19 +13156,19 @@
             }
         },
         "vue": {
-            "version": "3.2.6",
-            "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.6.tgz",
-            "integrity": "sha512-Zlb3LMemQS3Xxa6xPsecu45bNjr1hxO8Bh5FUmE0Dr6Ot0znZBKiM47rK6O7FTcakxOnvVN+NTXWJF6u8ajpCQ==",
+            "version": "3.2.8",
+            "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.8.tgz",
+            "integrity": "sha512-x7lwdnOSkceHQUXRVVHBaZzcp6v7M2CYtSZH75zZaT1mTjB4plC4KZHKP/5jAvdqOLBHZGwDSMkWXm3YbAufrA==",
             "requires": {
-                "@vue/compiler-dom": "3.2.6",
-                "@vue/runtime-dom": "3.2.6",
-                "@vue/shared": "3.2.6"
+                "@vue/compiler-dom": "3.2.8",
+                "@vue/runtime-dom": "3.2.8",
+                "@vue/shared": "3.2.8"
             }
         },
         "vue-chart-3": {
-            "version": "0.5.7",
-            "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.7.tgz",
-            "integrity": "sha512-BccfPv2rodY6IOppYHvMluVmIJE1CHfp5uW2DXrHrm1kIzaafLwpQ5SwdrxuCevn/QhKoi7azzcxwRcoWbX9hg==",
+            "version": "0.5.8",
+            "resolved": "https://registry.npmjs.org/vue-chart-3/-/vue-chart-3-0.5.8.tgz",
+            "integrity": "sha512-VJEBTdMgWOaYqekXtz4LVBIeYyIx3qDlQnFyY4Ao1GwizokYZBycCeRN3oKDcYbbZi5yxYqTy6+Tm+m+SOPUPA==",
             "requires": {
                 "@vue/runtime-core": "latest",
                 "@vue/runtime-dom": "latest",
@@ -13176,14 +13181,12 @@
         "vue-confirm-dialog": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/vue-confirm-dialog/-/vue-confirm-dialog-1.0.2.tgz",
-            "integrity": "sha512-gTo1bMDWOLd/6ihmWv8VlPxhc9QaKoE5YqlsKydUOfrrQ3Q3taljF6yI+1TMtAtJLrvZ8DYrePhgBhY1VCJzbQ==",
-            "requires": {}
+            "integrity": "sha512-gTo1bMDWOLd/6ihmWv8VlPxhc9QaKoE5YqlsKydUOfrrQ3Q3taljF6yI+1TMtAtJLrvZ8DYrePhgBhY1VCJzbQ=="
         },
         "vue-demi": {
             "version": "0.10.1",
             "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.10.1.tgz",
-            "integrity": "sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA==",
-            "requires": {}
+            "integrity": "sha512-L6Oi+BvmMv6YXvqv5rJNCFHEKSVu7llpWWJczqmAQYOdmPPw5PNYoz1KKS//Fxhi+4QP64dsPjtmvnYGo1jemA=="
         },
         "vue-eslint-parser": {
             "version": "7.10.0",
@@ -13246,8 +13249,7 @@
         "vue-toastification": {
             "version": "2.0.0-rc.1",
             "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.1.tgz",
-            "integrity": "sha512-hjauv/FyesNZdwcr5m1SCyvu1JmlB+Ts5bTptDLDmsYYlj6Oqv8NYakiElpCF+Abwkn9J/AChh6FwkTL1HOb7Q==",
-            "requires": {}
+            "integrity": "sha512-hjauv/FyesNZdwcr5m1SCyvu1JmlB+Ts5bTptDLDmsYYlj6Oqv8NYakiElpCF+Abwkn9J/AChh6FwkTL1HOb7Q=="
         },
         "which": {
             "version": "2.0.2",
@@ -13292,8 +13294,7 @@
         "ws": {
             "version": "7.4.6",
             "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
-            "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
-            "requires": {}
+            "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
         },
         "xmlhttprequest-ssl": {
             "version": "2.0.0",
diff --git a/package.json b/package.json
index f503bbf..43d0b63 100644
--- a/package.json
+++ b/package.json
@@ -64,7 +64,7 @@
         "sqlite3": "github:mapbox/node-sqlite3#593c9d",
         "tcp-ping": "^0.1.1",
         "v-pagination-3": "^0.1.6",
-        "vue": "^3.2.6",
+        "vue": "^3.2.8",
         "vue-chart-3": "^0.5.7",
         "vue-confirm-dialog": "^1.0.2",
         "vue-i18n": "^9.1.7",

From 7fd12f54859ce33277e57f31c5ce18592e0443a5 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Sat, 4 Sep 2021 14:42:55 +0800
Subject: [PATCH 44/48] rename nl_NL.js to nl-NL.js

---
 src/languages/{nl_NL.js => nl-NL.js} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename src/languages/{nl_NL.js => nl-NL.js} (100%)

diff --git a/src/languages/nl_NL.js b/src/languages/nl-NL.js
similarity index 100%
rename from src/languages/nl_NL.js
rename to src/languages/nl-NL.js

From 4b8e7fcffcfc9080a1c59f152bad16dd25b060b7 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Sat, 4 Sep 2021 15:03:26 +0800
Subject: [PATCH 45/48] update "build-docker" to build both platforms

---
 extra/update-version.js | 2 ++
 package.json            | 5 +++--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/extra/update-version.js b/extra/update-version.js
index 697a640..ca810a4 100644
--- a/extra/update-version.js
+++ b/extra/update-version.js
@@ -23,6 +23,8 @@ if (! exists) {
     pkg.version = newVersion;
     pkg.scripts.setup = pkg.scripts.setup.replaceAll(oldVersion, newVersion);
     pkg.scripts["build-docker"] = pkg.scripts["build-docker"].replaceAll(oldVersion, newVersion);
+    pkg.scripts["build-docker-alpine"] = pkg.scripts["build-docker-alpine"].replaceAll(oldVersion, newVersion);
+    pkg.scripts["build-docker-debian"] = pkg.scripts["build-docker-debian"].replaceAll(oldVersion, newVersion);
     fs.writeFileSync("package.json", JSON.stringify(pkg, null, 4) + "\n");
 
     commit(newVersion);
diff --git a/package.json b/package.json
index 43d0b63..1bf9a89 100644
--- a/package.json
+++ b/package.json
@@ -18,10 +18,11 @@
         "start-server": "node server/server.js",
         "build": "vite build",
         "vite-preview-dist": "vite preview --host",
-        "build-docker": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.2 --target release . --push",
+        "build-docker": "npm run build-docker-alpine && npm run build-docker-debian",
+        "build-docker-alpine": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.2 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.2-alpine --target release . --push",
+        "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.2-debian --target release . --push",
         "build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
-        "build-docker-1.5.0-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:1.5.0-debian --target release . --push",
         "setup": "git checkout 1.5.2 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune",
         "update-version": "node extra/update-version.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",

From 6a603203ccf1ea766e1b3c9a3945b6ff0e5e60b4 Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Sat, 4 Sep 2021 15:07:32 +0800
Subject: [PATCH 46/48] update to 1.5.3

---
 package.json | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/package.json b/package.json
index 1bf9a89..1cfd01c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "uptime-kuma",
-    "version": "1.5.2",
+    "version": "1.5.3",
     "license": "MIT",
     "repository": {
         "type": "git",
@@ -19,11 +19,11 @@
         "build": "vite build",
         "vite-preview-dist": "vite preview --host",
         "build-docker": "npm run build-docker-alpine && npm run build-docker-debian",
-        "build-docker-alpine": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.2 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.2-alpine --target release . --push",
-        "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.2-debian --target release . --push",
+        "build-docker-alpine": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.3 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.3-alpine --target release . --push",
+        "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.3-debian --target release . --push",
         "build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
-        "setup": "git checkout 1.5.2 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune",
+        "setup": "git checkout 1.5.3 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune",
         "update-version": "node extra/update-version.js",
         "mark-as-nightly": "node extra/mark-as-nightly.js",
         "reset-password": "node extra/reset-password.js",

From ee60d7491015b4fcbdb249f7e082e475ae29f99b Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Sat, 4 Sep 2021 15:32:55 +0800
Subject: [PATCH 47/48] fix dockerfile path

---
 package.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/package.json b/package.json
index 1cfd01c..8bb9629 100644
--- a/package.json
+++ b/package.json
@@ -20,7 +20,7 @@
         "vite-preview-dist": "vite preview --host",
         "build-docker": "npm run build-docker-alpine && npm run build-docker-debian",
         "build-docker-alpine": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma -t louislam/uptime-kuma:1 -t louislam/uptime-kuma:1.5.3 -t louislam/uptime-kuma:alpine -t louislam/uptime-kuma:1-alpine -t louislam/uptime-kuma:1.5.3-alpine --target release . --push",
-        "build-docker-debian": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.3-debian --target release . --push",
+        "build-docker-debian": "docker buildx build -f dockerfile-debian --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:debian -t louislam/uptime-kuma:1-debian -t louislam/uptime-kuma:1.5.3-debian --target release . --push",
         "build-docker-nightly": "docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t louislam/uptime-kuma:nightly --target nightly . --push",
         "build-docker-nightly-amd64": "docker buildx build --platform linux/amd64 -t louislam/uptime-kuma:nightly-amd64 --target nightly . --push --progress plain",
         "setup": "git checkout 1.5.3 && npm install --legacy-peer-deps && node node_modules/esbuild/install.js && npm run build && npm prune",

From 778995a4fba33b66ea73c190f002e5618405c87d Mon Sep 17 00:00:00 2001
From: LouisLam <louislam@users.noreply.github.com>
Date: Sat, 4 Sep 2021 15:48:25 +0800
Subject: [PATCH 48/48] add dockerfile-debian

---
 dockerfile-debian | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
 create mode 100644 dockerfile-debian

diff --git a/dockerfile-debian b/dockerfile-debian
new file mode 100644
index 0000000..7e0f798
--- /dev/null
+++ b/dockerfile-debian
@@ -0,0 +1,28 @@
+# DON'T UPDATE TO alpine3.13, 1.14, see #41.
+FROM node:14-bullseye AS release
+WORKDIR /app
+
+RUN apt update
+RUN apt --yes install python3 python3-pip python3-dev git g++ make
+RUN ln -s /usr/bin/python3 /usr/bin/python
+
+# split the sqlite install here, so that it can caches the arm prebuilt
+RUN npm install mapbox/node-sqlite3#593c9d
+
+# Install apprise
+RUN apt --yes install python3 python3-pip python3-cryptography python3-six python3-yaml python3-click python3-markdown python3-requests python3-requests-oauthlib
+RUN pip3 --no-cache-dir install apprise && \
+            rm -rf /root/.cache
+
+RUN apt --yes install iputils-ping
+
+COPY . .
+RUN npm install --legacy-peer-deps && npm run build && npm prune
+
+EXPOSE 3001
+VOLUME ["/app/data"]
+HEALTHCHECK --interval=60s --timeout=30s --start-period=300s CMD node extra/healthcheck.js
+CMD ["node", "server/server.js"]
+
+FROM release AS nightly
+RUN npm run mark-as-nightly